프로그래머스-2021 카카오 인턴십 ( 숫자 문자열과 영단어 by Java )

Flash·2022년 2월 1일
0

Programmers-Algorithm

목록 보기
9/52
post-thumbnail

HashMap? ReplaceAll?

프로그래머스 2021 카카오 인턴 Level 1 문제 숫자 문자열과 영단어Java로 풀어보았다. 10분만에 풀 정도로 간단한 문제긴 했지만 다른 사람들의 풀이를 보니까 그냥 3분 컷이었겠다는 생각에 다시 고개를 숙이게 된다. ㅆ..

문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/81301


HashMap 이용해서 풀기

나는 보자마자 HashMap을 활용해서 풀면 좋겠다는 생각을 했고 풀어보니 맞기도 했다. 결국 문제의 요지는 숫자가 아닌 영단어로 표현돼있는 숫자들을 Digit 숫자로 바꿔주는 것이다.

나는 주어진 문자열을 하나씩 탐색하며 이미 Digit 숫자라면 결괏값에 바로 추가를 해주고, 문자일 경우에는 몇 가지 작업을 통해 Digit 숫자로 변환해주었다.

이 작업을 위해서는 먼저 HashMap에 영단어와 그에 맞는 숫자를 각각 keyvalue로 초기화해주는 작업을 해야한다. 다음 코드를 살펴보자.

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 이란 문자열을 예시로 들어보자.

  1. 문자를 만나면 임시 문자열 String cur에 붙여주자.
  2. 1의 작업을 마치면 curmap에 있는지 확인해주자.
  3. curmapkey값으로서 존재한다면 결괏값에 붙여주고 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 이용해서 풀기

하지만 다른 사람들의 풀이를 보니까 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을 쓰겠다고 다짐한다.

profile
개발 빼고 다 하는 개발자

0개의 댓글