[프로그래머스/Java] - Lv1.가장 가까운 글자

Eunjeon_g·2023년 2월 27일
0

문자열 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]가 됩니다.

입출력 예

sresult
"banana"[-1, -1, -1, 2, 2, 2]
"foobar"[-1, -1, 1, -1, -1, -1]

방법1. 이중 for문

lastIndexOf()를 알기 전에 사용한 방법이다.
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을 넣어준다.

0개의 댓글