문제 설명
문자열 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. 1차원적으로 풀기 (for문으로 하나씩 검사하는 방법)
2. Map에 넣고 자릿수 업데이트 시켜주는 방법
이었다.
2번은 생각만 했지 풀 자신이 없어서 일단 1번 방식대로 풀고 실패했을 시에 2번 방법으로 풀어야겠단 생각으로 일단 가장 원초적인 방법으로 풀었다.
class Solution {
public int[] solution(String s) {
int[] answer = new int[s.length()];
char[] c = s.toCharArray();
answer[0] = -1;
for(int i=1;i<c.length;i++){
for(int j=i-1;j>-1;j--){
if(c[i]==c[j]){
answer[i] = i-j;
break;
}
}
if(answer[i]==0) answer[i]=-1;
}
return answer;
}
}
별 문제 없이 잘 풀렸다. 이 문제랑 자매품으로 레벨2의 '뒤에 있는 큰 수찾기'라는 문제가 있는데 이건 이런 식으로 풀었더니 시간 초과가 떴었다.
다른 사람들이 푼 답을 보고 공부를 해야겠다고 다짐했다.
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;
}
}
그래도 얼추 내가 2번으로 생각했던 거랑 비슷하다.
저 코드를 풀어서 보면 요런 느낌으로 문제가 풀린다.
당연히 for문이 줄어드니까 속도가 더 빠를 것 같다.
'Study > Algorithm' 카테고리의 다른 글
[1260] DFS와 BFS (0) | 2020.05.22 |
---|---|
[11724] 연결 요소의 개수 (0) | 2020.05.22 |
[1026] 보물 (0) | 2020.05.22 |
[1890] 점프 (0) | 2020.05.22 |
[2609] 최대공약수와 최소공배수 (0) | 2020.05.16 |
댓글