devnoong.log
728x90

프로그래머스 Level 1 가장 가까운 같은 글자 JAVA 풀이

 

문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때,  각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

  • b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
  • n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
  • a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.

따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.




위의 문제를 보고 든 생각은 문제 안에 있는 -1 을 보고 바로 indexOf 함수가 떠올라 이를 활용해서 구현해야겠다는 생각이 들었다.

 

 지문 중에서는 가장 가까운 곳의 위치를 물어봤기때문에 lastIndexOf 함수를 사용했고, 현재 위치와의 거리를 물어봤으므로  현재 위치에서 해당 위치를 빼면 되었다.

 

        int[] result = new int [s.length()];
        String compare = "";

        for(int i=0 ; i< s.length(); i++){
            int index = compare.lastIndexOf(s.substring(i,i+1));

            if(index== -1){
                result[i] = -1;
            }else{
                result[i] = i- index;
            }
            compare +=s.substring(i,i+1);
        }

 


다른사람 풀이

HashMap의 getOrDefault를 이용해 해결 한 풀이가 가장 인상깊었다.

 

getOrDefault를 이용함으로써 if문을 사용하지도 않고도 데이터 일치 여부를 판단해 한 라인으로 코드를 구성 할 수 있었다.

-1의 값은 i보다 1보다 큰값으로 default를 정해놔 데이터가 존재하지 않으면 -1을 return하도록 구성되어 있다.

 

       int[] answer = new int[s.length()];
        HashMap<Character,Integer> map = new HashMap<>();
        for(int i=0; i<s.length();i++){
            char ch = s.charAt(i);
            answer[i] = i-map.getOrDefault(ch,i+1);
            map.put(ch,i);
        }
        return answer;

 

 

 

getOrDefault를 이용하지 않아도 HashMap의 중복되는 key값은 overwrite가 된다는 점을 활용해서도 많이들 푼 것 같다.

 

       int[] answer = new int[s.length()];

        HashMap<Character, Integer> map = new HashMap<>();
        for(int i=0; i<s.length(); i++) {
            if(!map.containsKey(s.charAt(i))) {
                answer[i] = -1;
                map.put(s.charAt(i), i);
            }else {
                int before = map.get(s.charAt(i));
                answer[i] = i - before;
                map.put(s.charAt(i), i);
            }
        }

 

728x90