문자열 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을 완성해주세요.
입출력 예
s
result
”banana”
[-1, -1, -1, 2, 2, 2]
“foobar”
[-1, -1, 1, -1, -1, -1]
풀이
s의 요소중 첫번째는 무조건 -1이다.
마지막 문자를 키로 저장하고 인덱스만 갱신시키며 비교&검증.
function solution(s) { let li = {} let result = [] for (let i = 0; i < s.length; i++) { let idx = s[i] if (li.has(idx)) { result.push(i - li[idx]) } else { result.push(-1) } li[idx] = i } return result}
Java
import java.util.*;class Solution { public int[] solution(String s) { Map<Character,Integer> sl = new HashMap(); int[] result = new int[s.length()]; for(int i=0; i<s.length(); i++){ char idx = s.charAt(i); if(sl.containsKey(idx)){ result[i] = i - sl.get(idx); }else{ result[i] = -1; } sl.put(idx,i); } return result; }}
li에 s의 요소를 객체(키(‘b’,‘a’..)-값(index)으로)로 저장하여 루프하는 동안 s의 키는 유지되니까 값
(index)만 갱신시킨다.
idx의 값을 i로 갱신하고 키로 검증
hasOwnProperty(idx) = true >>> i-li(키로 저장했던 문자의 값) java는 containsKey(idx)로.