[프로그래머스] 가장 가까운 같은 글자

The Flawless Bead·2023년 2월 9일
0

프로그래머스

목록 보기
1/20
post-thumbnail

🔗 문제 보러가기 [가장 가까운 같은 글자]



문제를 통해 새롭게 배운 부분 OR 느낀점

처음 문제를 풀었을 때 정답처리는 되었으나 생각보다 속도가 너무 느려서 놀랐다. (for문을 돌때마다 배열을 문자열로 바꿨다가 인덱스를 찾았다가 수정했다가 바빴으니 당연히 그럴 수 밖에😱)
다른 사람들은 어떻게 풀었는지 참고하면서 다시 문제를 풀어보았다. getOrDefault()를 사용해서 풀었더니 속도가 최대 30배 가까이 줄었다!
코딩테스트를 풀 때 문제에 접근하는 방식도 중요하지만 활용할 수 있는 함수를 많이 익히는 것도 중요하다는 것을 다시 한 번 느꼈다!



☑️ 문제풀이 (1)

  1. 문자열을 수정하기 위해 주어진 schar[]로 변환
  2. arr[i]가 처음 나오는 indexi 가 같으면 -1 반환
  3. 다르면 i - index 반환
  4. arr[index] 값 변경
import java.util.Arrays;

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



✅ 문제풀이 (2)

  1. 문자와 인덱스를 담을 HashMap을 선언
  2. 선언한 맵에 s.charAt(i)가 있다면 해당 인덱스 반환
  3. 없다면 i + 1 반환 (answer[i] 에 -1 을 담기 위함)
  4. 맵에 key : s.charAt(i), value : i 를 넣는다. (Key가 이미 있다면 value만 변경 됨)
import java.util.HashMap;

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        
        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;
    }
}

profile
오늘을 살고 내일을 꿈꾸는 낭만주의자

0개의 댓글