본문 바로가기
코딩테스트/programming_JAVA

[Java] 프로그래머스_81301 : 숫자 문자열과 영단어

by prometedor 2023. 12. 13.

replace 활용하기

숫자 문자열과 영단어 : Level1

 

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

 

프로그래머스

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

programmers.co.kr

 

 

 

처음 작성한 코드

import java.util.*;

class Solution {
    public int solution(String s) {
        HashMap<String, Integer> wordToNum = new HashMap<>() {{
            put("zero", 0);
            put("one", 1);
            put("two", 2);
            put("three", 3);
            put("four", 4);
            put("five", 5);
            put("six", 6);
            put("seven", 7);
            put("eight", 8);
            put("nine", 9);
        }};

        StringBuilder numStr = new StringBuilder();
        StringBuilder currWord = new StringBuilder();

        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                numStr.append(c);
            } else {
                currWord.append(c);
                if (wordToNum.containsKey(currWord.toString())) {
                    numStr.append(wordToNum.get(currWord.toString()));
                    currWord.setLength(0);
                }
            }
        }

        return Integer.parseInt(numStr.toString());
    }
}

 

 

=>

 

HashMap<String, Integer> wordToNum = new HashMap<>() {{
            put("zero", 0);
            put("one", 1);
            put("two", 2);
            put("three", 3);
            put("four", 4);
            put("five", 5);
            put("six", 6);
            put("seven", 7);
            put("eight", 8);
            put("nine", 9);
        }};

 

HashMap 은 HashMap<String, Integer> wordToNum = new HashMap<>() 으로 선언한다.

ㄴ 중괄호를 두 개 사용한 부분은 초기화 블록(Initialization Block)이라 불리는 것으로, 익명 클래스(Anonymous Class)의 인스턴스 초기화 블록이다. 이 방식은 인스턴스 초기화 시에 코드 블록을 실행할 수 있게 해준다.
자바에서 익명 클래스는 중괄호로 둘러싸인 초기화 블록을 사용하여 인스턴스를 초기화할 수 있다. 따라서 위의 코드에서 중괄호는 HashMap을 초기화하고, put 메서드를 사용하여 키-값 쌍을 추가하는 작업을 수행한다.

 

 

다른 사람 풀이

class Solution {
    public int solution(String s) {

        String[][] mapArr = { {"0", "zero"}, 
                              {"1", "one"}, 
                              {"2", "two"}, 
                              {"3", "three"}, 
                              {"4", "four"}, 
                              {"5", "five"}, 
                              {"6", "six"}, 
                              {"7", "seven"}, 
                              {"8", "eight"}, 
                              {"9", "nine"} };

        for(String[] map : mapArr){
            s = s.replace(map[1], map[0]);
        }

        int answer = Integer.parseInt(s);
        return answer;
    }
}

 

ㄴ HashMap 을 사용하지 않고 2차원 배열을 사용해도 됐다.

 

class Solution {
    public int solution(String s) {
        String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        for(int i = 0; i < strArr.length; i++) {
            s = s.replace(strArr[i], Integer.toString(i));
        }
        return Integer.parseInt(s);
    }
}

 

ㄴ 이렇게 간결한 풀이로 풀린다니,,,, 내가 너무 어렵게 생각했던 것 같다. 그저 replace 을 통해 strArr[i] 의 값을 모두 Integer.toString(i) 값으로 변경해주면 되는 것을...!!!

 

 

문제점 : 카카오 문제라고 하니 쫄았(?)던 것 같다. 쉽게 해결 할 수 있는 문제였는데....

해결 방법 : 다른 사람의 풀이를 참고하여 공부하였다.

깨달은 바 : 너무 어렵게 생각하지 말고, 쉬운 풀이부터 차근차근 생각해보는 게 좋을 것 같다.