본문 바로가기
공부/2024 항해99코딩클럽

99클럽 3기 코테 스터디 3일차 TIL /[프로그래머스] 숫자 문자열과 영단어 자바 해시맵 풀이

by 푸딩코딩 2024. 7. 24.
728x90
반응형

 

 

 

 

 

 

1. 오늘의 학습 문제 


문제


 

https://school.programmers.co.kr/learn/courses/30/lessons/81301

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine

제한사항
  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예sresult
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 #4

  • s에는 영단어로 바뀐 부분이 없습니다.

 

 

 

 

숫자와 영어가 혼재된 문자열을 숫자만으로 바꾸는 문제 

영단어:숫자 해시맵을 만들고, 

문자열 s에서 문자열을 하나씩 읽어들여 문자열이 정수로만 이루어져있는지 검사하고 정답 string에 추가한다.

문자열이 정수가 아니라면 영어로 이루어진것으로, 해시맵에 key가 일치할때까지 읽어들이고 키값을 통해 숫자 변환해 정답 string에 추가한다. 

 

코드


import java.util.*;


class Solution {
    
    static HashMap<String, String> map;  //영단어:숫자 해시맵
    
    public int solution(String s) {
        int answer = 0;
        String numbers="";
        String now="";
        
        map= new HashMap<>();
        makeMap();
        
        for(int i=0;i<s.length(); i++){
            char c= s.charAt(i);
            now+=c;
            if(map.containsKey(now)){
                now=map.get(now);
            }
            if(now.chars().allMatch(Character::isDigit)){ //문자열이 정수로 이루어져있다면
                numbers+=now;
                now="";
            }
            
            
        }
        
        return Integer.parseInt(numbers);
    }
    
    static private void makeMap(){ //영단어:숫자 해시맵 생성
        map.put("zero", "0");
        map.put("one", "1");
        map.put("two", "2");
        map.put("three", "3");
        map.put("four", "4");
        map.put("five", "5");
        map.put("six", "6");
        map.put("seven", "7");
        map.put("eight", "8");
        map.put("nine", "9");
    }
}

 

 

 

 

2. 오늘의 회고


 

  • 푸는데는 어렵지 않았지만, 다른 사람들의 풀이가 궁금해서 찾아봤다. 

 

class Solution {
    public int solution(String s) {
        
    	//영단어를 담는 String 타입의 배열 생성
    	//영단어와 배열의 인덱스값이 동일하다.
        String[] arr = {"zero","one","two","three","four","five","six","seven","eight","nine"};
        
        //반복문을 사용해 배열 안의 모든 영단어를 검사한다.
        //문자열 s에 영단어가 있다면 replace를 사용해 변환한다.
        for(int i=0;i<arr.length;i++) {
        	if(s.contains(arr[i])) {
        		s = s.replace(arr[i], Integer.toString(i));
        	}
        }
        return Integer.parseInt(s);
    }
}

 

출처

https://velog.io/@minjung0/Java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%AB%EC%9E%90-%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC-%EC%98%81%EB%8B%A8%EC%96%B4

 

배열과 replace함수를 통해 쉽게 풀이한 방법이 있었다..!

생각해보면 당연히 0: zero, 1: one.. 배열의 인덱스와 문자가 일치하며, replace함수로 쉽게 문자열을 바꿀 수 있었다. 

String a = "무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세 ";	
//replace([기존문자],[바꿀문자])
a= a.replace("대한", "민국");	
System.out.println(a);

//결과값 : 무궁화 삼천리 화려강산 민국사람 민국으로 길이 보전하세

 

replace함수에 대한 예제. 

해시맵을 자주 사용해서 해시맵을 떠올렸는데, 쉬운 방법이 있었다.

어렵게 돌아가지 않도록 열린 사고를 탑재하고, 자바 함수를 잘 알아두자.

 

 

 

#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL

 

 

728x90
반응형