코딩테스트

프로그래머스 LV.0 영어가 싫어요

다오__ 2023. 6. 1. 13:22

 

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

 

프로그래머스

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

programmers.co.kr

비교적 난이도가 있는 문제라고 느꼈고, 시행착오가 있어서 글을 작성하게 되었다.

 

이 문제는 영어 숫자가 String으로 넘어오면,  정수형(long)타입으로 변환하는 문제이다

onetwothree = 123

 

처음에 접근한 방법

1. LinkedHashMap(이하 Map) 을 이용해서 키는 '영어숫자' 값은 '숫자'로 데이터를 초기화한다. 0~10까지

2. Map의 keySet매서드로 키들을 가져와 반복문을 돌린다.

3. String으로 넘어온 문자열에 Map의 키가 포함되어있는지 여부를 판별한다.

4. true가 나오면 해당 키의 값을 꺼내 추가한다.

 

public long solution(String numbers) {
        
        StringBuilder st = new StringBuilder();
        
        Map<String, Integer> map = new LinkedHashMap<>();
            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); map.put("zero",0);
        

        //LinkedHashMap은 get메서드가 없기때문에 for-each를 사용해야한다.
        
        for(String key: map.keySet()){
            if(numbers.contains(key)){
                st.append(map.get(key));
            }
        }
                System.out.print(st.toString()+" ");
        
        
        return Long.parseLong(st.toString());
    }

하지만 문제가 발생했다.

테스트 2인 경우를 보면

순차적으로 키가 포함되는지 판단하기 때문에 String으로 담아온 문자열에서 영어숫자가 순서대로(onetwothreefour) 되지 않는 경우, 즉 fourtwofivezero같이 순서 상관없이 나열되어있는 경우, 원하는 결과가 나오지 않았다.

 

contains를 사용하는게 아닌것 같았다...

 

영어문자를 어떻게 구분할까 생각하다보니 idx이용해보는걸 떠올렸다.

처음 idx를 0으로 두고 key인 one, two, three ...의 length를 더하면 해당 첫글자의 index를 찾게된다.

첫글자의 index를 startsWith메서드를 사용해서 판별할 수 있을 것 같았다.

 

 

일단 중첩 for문을 number.length()까지 돌려보자..

무조건 numbers.length()보다 작은 크기의 배열이 나올 것이기에 numbers.length()까지 돌리면

모든 원하는 값이 나올 것이다.

이제 StringBuilder를 Long타입으로 변환해주어 끝을 냈다.

 

결과 코드

public long solution(String numbers) {
        
        StringBuilder st = new StringBuilder();
        
        Map<String, Integer> map = new LinkedHashMap<>();
            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); map.put("zero",0);
        
        int idx = 0;
        
    for(int i=0; i<numbers.length(); i++){
        for(String key : map.keySet()){
            if(numbers.startsWith(key, idx)){
                idx = idx+key.length();
                st.append(map.get(key));
            }
        }
    }
        return Long.parseLong(st.toString());
    }

 

 

 

문자열에서 특정번째의 값을 찾을 때 idx만큼 더해서 결과를 찾을 수 있다는 점을 알게 되었다.

추가로 자료구조에 대해서도 학습해볼 예정이다.