프로그래머스 2021 카카오 인턴 Level 1 문제 숫자 문자열과 영단어를 Java로 풀어보았다. 10분만에 풀 정도로 간단한 문제긴 했지만 다른 사람들의 풀이를 보니까 그냥 3분 컷이었겠다는 생각에 다시 고개를 숙이게 된다. ㅆ..
문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/81301
나는 보자마자 HashMap을 활용해서 풀면 좋겠다는 생각을 했고 풀어보니 맞기도 했다. 결국 문제의 요지는 숫자가 아닌 영단어로 표현돼있는 숫자들을 Digit 숫자로 바꿔주는 것이다.
나는 주어진 문자열을 하나씩 탐색하며 이미 Digit 숫자라면 결괏값에 바로 추가를 해주고, 문자일 경우에는 몇 가지 작업을 통해 Digit 숫자로 변환해주었다.
이 작업을 위해서는 먼저 HashMap에 영단어와 그에 맞는 숫자를 각각 key
와 value
로 초기화해주는 작업을 해야한다. 다음 코드를 살펴보자.
static HashMap<String, String> map = new HashMap<>();
static void mapInit(){
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");
}
one4seveneight
이란 문자열을 예시로 들어보자.
- 문자를 만나면 임시 문자열
String cur
에 붙여주자.- 1의 작업을 마치면
cur
이map
에 있는지 확인해주자.cur
이map
에key
값으로서 존재한다면 결괏값에 붙여주고cur
은""
로 초기화해주자.
숫자를 만나면 바로 결괏값에 그대로 붙여주자.
위의 작업들을 코드로 표현하면 다음과 같다.
int solution(String s) {
String answer = "";
mapInit();
String cur ="";
for(int i=0; i<s.length(); i++){
char ch = s.charAt(i);
if(!Character.isDigit(ch)){ // 문자면
cur += ch;
if(map.containsKey(cur)){ // cur 이 하나의 온전한 단어로 완성됐으면
answer += map.get(cur);
cur = "";
}
else continue;
}
else{ // 숫자면
answer += ch;
}
}
return Integer.parseInt(answer);
}
위와 같이 쉽게 해결이 가능하다.
하지만 다른 사람들의 풀이를 보니까 replaceAll
메소드를 사용해서 훨씬 간단하게.. 한 줄로 내가 해둔 작업들을 완성해놨더라 ㅎ
String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i = 0; i < strArr.length; i++) {
s = s.replaceAll(strArr[i], Integer.toString(i));
}
자바 자체에 대한 지식이 많이 부족함을 느낀다. 근본으로 돌아가자...!!
하지만 어찌됐든 시험장에서는 내가 갖고 있는 재료만으로 과제를 해결해야 하는 것이다. 갖고 있는 지식들을 이용해서 최대한 풀어낼 수 있는 능력도 중요하다고 자기 위로를 하며.. 다음부터는 replaceAll
을 쓰겠다고 다짐한다.