[프로그래머스 코딩테스트] 가장 가까운 글자

gyeol·2023년 9월 5일

코딩테스트 공부

목록 보기
9/53
post-thumbnail

문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디있는지 알고 싶습니다.

내 풀이

같은 글자의 위치를 알기 위해선 중첩 반복문을 돌려야한다. 그 전에 문자열을 문자형 배열로 바꿔준 뒤 반복문을 돌려준다.

import java.util.Arrays;

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        char[] arr = s.toCharArray();
        answer[0] = -1;
        
        for(int i=1; i<arr.length; i++){
            for(int j=i-1; j>=0; j--){
                answer[i] = -1;
                if(arr[i] == arr[j]){
                    answer[i] = i-j;
                    break;
                }
            }
        }
        
        return answer;
    }
}

answer[0]은 자신 앞에 나온 문자가 없기에 무조건 -1이다. 그리고 반복문을 돌리면서 같은 문자가 나오면 배열의 방 번호를 이용해 위치를 구한다.

다른 사람의 풀이

import java.util.*;

class Solution {
    public int[] solution(String s) {
        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;
    }
}

answer 정수 배열을 생성해주고, 비어있는 HashMap을 생성해준다.
그리고 반복문을 돌려 문자열을 글자 하나하나씩 charAt() 메서드를 사용해 쪼개준다. 그리고 map.getOrDefault(ch, i+1) 메서드를 사용해 각 값을 넣어준다.

getOrDefault(Object key, V DefaultValue)

  • key : 값을 가져와야 하는 요소의 키
  • defaultValue : 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값

위 코드의 경우 매핑되는 값이 없으면 i+1값이 들어가기에 자연스럽게 -1이 대입되게 된다.

처음 풀이를 보고 이걸 HashMap 으로...? 😲
생각하지도 못한 방법이었다. 덕분에 getOrDefault 메서드의 역할이 무엇인지 알게 되었다.

profile
공부 기록 공간 '◡'

0개의 댓글