문자열 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 | result |
---|---|
"banana" | [-1, -1, -1, 2, 2, 2] |
"foobar" | [-1, -1, 1, -1, -1, -1] |
방법1. 이중 for문
class Solution {
public int[] solution(String s) {
int answer[] = new int[s.length()];
String s2[] = s.split("");
for(int i=0; i<s2.length; i++){
int n=0;
for(int j=i; j>=0; j--){
if((i!=j) && (s2[i].equals(s2[j]))){
answer[i] = n;
break;
}else{
answer[i] = -1;
n++;
}
}
}
return answer;
}
}
s2에 문자열을 각 문자로 분리해서 넣어준다.
이중 for문을 작성하여 s2[i]에는 찾는 문자, s2 [j]에는 비교 대상을 넣어준다.
s2[i]번째와 가까워야 하므로 j의 값은 찾는 위치에서부터 감소하도록 한다.
equals로 찾는 대상과 비교대상이 같은지 확인한다. 같으면 answer에 n을 넣고, 다르면 -1을 넣고주고, n을 증가시킨다.
이때 n은 찾는 대상으로부터의 거리를 나타낸다.
방법2. 함수를 이용
class Solution {
public int[] solution(String s) {
int[] answer = new int[s.length()];
answer[0] = -1;
for(int i=1; i<answer.length; i++){
//String s2 = s.substring(0,i);
//int n = s2.lastIndexOf(s.charAt(i));
int s2 = s.substring(0,i).lastIndexOf(s.charAt(i));
if(n!=-1){
answer[i] = i-n;
}else{
answer[i] = -1;
}
}
return answer;
}
}
위 코드에서 사용된 함수들을 잠시 알아보면
substring(start, end) 함수는 문자열을 start부터 end-1까지 잘라준다.
만약 "안녕하세요".substring(0,3)을 하게 되면 "안녕하"만큼 잘린다. 즉, 0번째부터 2번째까지 자르게 되는 것이다.
lastIndexOf(문자) 함수는 찾고자하는 문자를 뒤에서부터 찾는다.(역순) 만약 찾고자하는 값이 없다면 -1을 리턴한다.
charAt(n)함수는 n번째 위치에 있는 값을 알려준다.
위 코드를 해석해보면, 찾고자하는 문자의 위치 앞까지 자른 후 역순으로 해당 문자의 위치를 받는다.
-1(찾는 값이 없는 경우)가 아니라면 현재 인덱스에서 찾은 인덱스의 값을 빼 answer에 넣어주고, 찾는 값이 없다면 answer에 -1을 넣어준다.