문제 설명
문자열 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은 영어 소문자로만 이루어져 있습니다.
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(String s) {
int[] result = new int[s.length()]; // 결과를 저장할 배열을 초기화합니다.
Map<Character, Integer> charIndexMap = new HashMap<>(); // 각 문자의 최근 위치를 저장할 HashMap을 초기화합니다.
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i); // 현재 위치의 문자를 가져옵니다.
if (charIndexMap.containsKey(ch)) { // 해당 문자가 이미 Map에 존재하는지 확인합니다.
result[i] = i - charIndexMap.get(ch); // 현재 위치와 최근 위치의 차이를 결과 배열에 저장합니다.
} else {
result[i] = -1; // 해당 문자가 처음 등장하는 경우 -1을 결과 배열에 저장합니다.
}
charIndexMap.put(ch, i); // 현재 문자의 위치를 Map에 업데이트합니다.
}
return result; // 결과 배열을 반환합니다.
}
public static void main(String[] args) {
Solution sol = new Solution();
String input = "banana";
int[] output = sol.solution(input);
// 출력 결과
for (int distance : output) {
System.out.print(distance + " ");
}
}
}
주요 부분 설명
- HashMap과 Map:
- HashMap은 Map 인터페이스를 구현한 클래스로, 키-값 쌍을 저장하는 데 사용한다.
- Map은 키와 값을 매핑하는 인터페이스로, 키와 값을 하나의 쌍으로 저장하고, 키를 통해 값을 빠르게 검색할 수 있다.
- HashMap은 키의 순서를 보장하지 않고, null 키와 값을 허용하며, 해시 테이블을 기반으로 하여 빠른 검색, 삽입, 삭제가 가능하다.
- charIndexMap:
- charIndexMap은 각 문자의 최근 위치를 저장하는 HashMap이다.
- charIndexMap.put(ch, i);는 현재 문자의 위치를 업데이트한다. ch는 키로, i는 값으로 저장한다.
- 예를 들어, 문자열 "banana"를 처리할 때, 처음으로 'b'를 만나면 charIndexMap.put('b', 0);을 실행하여 'b'의 위치를 0으로 저장한다.
- charIndexMap.containsKey(ch):
- charIndexMap.containsKey(ch)는 현재 문자가 charIndexMap에 이미 존재하는지 확인한다.
- 만약 존재하면, charIndexMap.get(ch)를 통해 이전에 저장된 위치를 가져온다.
- 결과 계산:
- result[i] = i - charIndexMap.get(ch);는 현재 위치 i와 charIndexMap에 저장된 동일 문자의 최근 위치를 뺀 값을 결과 배열에 저장한다.
- 예를 들어, 'a'가 두 번째로 나타날 때, i는 3이고 charIndexMap.get('a')는 1이므로, result[3] = 3 - 1 = 2가 된다.
실행 과정
- 문자열 "banana":
- 'b'는 처음 등장: charIndexMap에 저장하고 result[0] = -1.
- 'a'는 처음 등장: charIndexMap에 저장하고 result[1] = -1.
- 'n'는 처음 등장: charIndexMap에 저장하고 result[2] = -1.
- 두 번째 'a': charIndexMap에서 'a'의 이전 위치는 1, 현재 위치는 3, result[3] = 3 - 1 = 2.
- 두 번째 'n': charIndexMap에서 'n'의 이전 위치는 2, 현재 위치는 4, result[4] = 4 - 2 = 2.
- 세 번째 'a': charIndexMap에서 'a'의 이전 위치는 3, 현재 위치는 5, result[5] = 5 - 3 = 2.
최종적으로 result 배열은 [-1, -1, -1, 2, 2, 2]가 된다.
HashMap와 Map에 자세한거는 자바 문법정리에서 자세히 다룰 예정이다.
'(Java)코테연습' 카테고리의 다른 글
명예의 전당(1) (0) | 2024.07.25 |
---|---|
푸드 파이트 (3) | 2024.07.23 |
두 개 뽑아서 더하기 (0) | 2024.07.19 |
k번째수 (0) | 2024.07.18 |
문자열 내 마음대로 정렬하기 (0) | 2024.07.17 |