프로그래머스/Lv. 1

[프로그래머스 코딩테스트] 가장 가까운 같은 글자(Java)

Sigfriede 2023. 6. 26. 01:00

  문제 설명

  문자열 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 <= s의 길이 <= 10,000
    • s는 영어 소문자로만 이루어져 있습니다.

 

  입출력 예

s result
"banana" [-1, -1, -1, 2, 2, 2]
"foobar" [-1, -1, 1, -1, -1, -1]
import java.util.HashMap;
class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        HashMap<Character, Integer> map = new HashMap<>();
        int index = 0;
        for (char c : s.toCharArray()) {
            if (map.containsKey(c)) {
                answer[index] = index - map.get(c);
                map.put(c, index);
            } else {
                answer[index] = -1;
                map.put(c, index);
            }
            index++;
        }
        return answer;
    }
}

  answer 배열의 크기를 s의 길이로 지정합니다.

  Character와 Integer를 제네릭 타입으로 받는 HashMap을 생성합니다. 문자가 등장할 때마다 문자가 등장하는 위치를 갱신해나가면서 값을 구할 것입니다.

  answer 배열의 인덱스를 담당할 변수 index를 생성합니다.

  for-each문에서 toCharArray 메소드를 이용하여 s를 문자 배열로 변경하고 c가 원소를 하나씩 받습니다.

  if문에서 containsKey 메소드를 이용하여 map에 c를 키 값으로 갖는 쌍이 있는지 확인합니다. 있다면 answer의 index 번째에 index에서 c의 밸류 값(앞서 등장한 위치)을 뺀 값을 할당합니다. 같은 문자가 다시 등장한 것이므로 put 메소드를 이용하여 c의 밸류 값을 현재 위치로 갱신합니다.

  만약 한 번도 등장하지 않았다면 answer의 index 번째에 -1을 할당하고 put 메소드로 문자 c와 현재 위치를 저장합니다.

  if문을 지나 index가 증가합니다.