[Programmers][Level1] 가장 가까운 같은 글자

울부짖는 늑대·2023년 7월 28일

문제 설명

문자열 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은 영어 소문자로만 이루어져 있습니다

입출력 예

sresult
"banana"[-1, -1, -1, 2, 2, 2]
"foobar"[-1, -1, 1, -1, -1, -1]

입출력 예 설명

입출력 예 #1

지문과 같습니다.

입출력 예 #2

설명 생략

나의 코드

import java.util.*;
class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        
        Map<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;
    }
}

풀이 방법

  • 입력받은 문자열 s의 각 알파벳들을 순회해서 이미 한번 나왔던 값이라면 제일 가까운 그 값의 위치를 리턴하고,
  • 처음 나왔던 값이라면 -1을 리턴해주는 문제다.
  • 중복을 허용하지 않는다와 해당 위치를 기억할수 있다라는 가정으로는 역시 Map만한 자료구조가 없다.
  • 루프를 s의 길이만큼 돌려서 ch라는 지역변수를 만들어준다. 그리고 그 변수에 알파벳 한자씩 대입받는다.
  • getOrDefault() 라는 Map에 존재하는 함수가 있는데, 이건 첫번째 인자의 키가 존재하면 그 키에 맞는 값을 리턴한다.
  • 만약에, 키가 존재하지 않으면 두번째 인자인 Defeault값을 리턴한다.
  • 따라서 키값이 존재하지 않아 default값을 리턴할 두번째 인자에는 i + 1 즉 해당 원소의 인덱스가 아닌 위치를 answer에 대입하고, map에 키값을 알파벳으로 넣어두고 값은 index를 넣어준다.
  • 이미 map에 담겨있는 값이라면 현재 인덱스에서 이전에 저장했던 인덱스를 빼주면 위치를 알 수 있다.

profile
이상을 현실로 구현하는 개발자

0개의 댓글