
문자열 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) 메서드를 사용해 각 값을 넣어준다.
위 코드의 경우 매핑되는 값이 없으면 i+1값이 들어가기에 자연스럽게 -1이 대입되게 된다.
처음 풀이를 보고 이걸 HashMap 으로...? 😲
생각하지도 못한 방법이었다. 덕분에 getOrDefault 메서드의 역할이 무엇인지 알게 되었다.