본문 바로가기
코딩테스트 연습

Programmers 숫자 문자열과 영단어 Level 1

by 동배_ 2021. 8. 27.

문제 설명

https://programmers.co.kr/learn/courses/30/lessons/81301?language=java 

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

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

  • 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로 주어집니다.

문제 해석 및 풀이 방법

1. 문자열과 숫자를 해시테이블을 통해 키, 밸류로 정해준다

2. 그후 for문을 통해 String에서 문자를 하나씩 뽑는다.

3. 이때 문자가 숫자인경우 바로 answer에 더해주고 아니면 temp에 추가한다.

4. 그리고 쌓여진 temp가 해시테이블의 키값과 매칭이 되면 그 값을 answer에 추가하고 temp를 초기화 해준다.

 

내가 작성한 소스코드(Java)

import java.util.HashMap;

class Solution {
    public int solution(String s) {
        StringBuilder answer = new StringBuilder();
        StringBuilder temp = new StringBuilder();
        HashMap<String, Integer> numbers = new HashMap<String, Integer>();
        numbers.put("zero",0);
        numbers.put("one",1);
        numbers.put("two",2);
        numbers.put("three",3);
        numbers.put("four",4);
        numbers.put("five",5);
        numbers.put("six",6);
        numbers.put("seven",7);
        numbers.put("eight",8);
        numbers.put("nine",9);
        
        for(int i=0;i<s.length();i++){
            char tempChar = s.charAt(i);
            if(tempChar >='0' && tempChar <='9'){
                answer.append(tempChar);
            } 
            else{
                temp.append(tempChar);
                for(int j=0;j<10;j++){                   
                    if(numbers.containsKey(temp.toString())){
                        answer.append(numbers.get(temp.toString()));
                        temp.setLength(0);
                    }
                }
            }
        }
        
        return Integer.parseInt(answer.toString());
    }
}

해시테이블을 통해 0~9까지 문자열을 키로 숫자를 넣어준다. 

 

그리고 for문을 통해 문자열크기만큼 반복해준다. 

그리고 문자열에서 차례대로 한글자씩 뺴온 후 그 값이 숫자면 answer에 넣어주고 숫자가 아니면 temp값에 추가해주고 temp가 해시테이블 키값과 매칭이 되면 value값을 answer에 추가해주고 temp를 초기화시켜준다.

 

그 후 answer 값을 return한다.

결론 및 고찰

이 문제를 풀면서 코딩테스트를 칠때 자바를 하는 회사가 자바로 코딩테스트를 치게 하는 이유를 확실히 알았다.

파이썬으로 10분이면 풀문제를 StringBuilder, Buffer, String 등 여러가지 형식의 스트링객체가 있고 또 각각 마다 지원하는 메소드 명령어도 달라서 헷갈리는 경우가 있었다. 이런 기초적인것들은 코딩테스트를 통해 익숙해지는 것이 중요한 것 같다.

 

단순히 해시테이블을 이용하여 비교하며 추가 할 수 있는 문제이다. 카카오같은 경우는 문제설명이 길고 이해하기 어려운 경우가 좀 있었는데 이번에는 정말 쉬웠던 것 같다. 

 

소요 시간 30

댓글