[Study] lv.1 가장 가까운 같은 글자( 67% )

ayboori·2023년 8월 4일
0

Java Study

목록 보기
23/34

풀이 로직

  1. String > char 배열로 변환
  2. 이중 for문을 사용해 i번째 인덱스 당 0번째 ~ i번째 인덱스 - 1까지 검사
  3. charArray[i]가 charArray[j]와 같을 시 두 값의 차이, 아닐 경우 -1으로 answer[i] 세팅

실패한 코드 - 1

class Solution {
    public int[] solution(String s) {
        int [] answer = new int[s.length()]; // 정답으로 return할 배열
        char[] charArray = s.toCharArray(); // 입력받은 String을 문자열 하나씩 분리하여 배열로 만들기
        
        answer[0] = -1; // 0번째 인덱스는 무조건 -1, 아래 for문에서 answer[0] 세팅 불가함
        
        for(int i = 0 ; i < s.length() ; i++){
            for(int j = 0 ; j < i ; j++){
                // charArray[i]가 charArray[j]와 같을 시 두 값의 차이, 아닐 경우 -1으로 answer[i] 세팅
               answer[i] = charArray[i] == charArray[j] ? i-j : -1;
            }   
        }
        
        return answer;
    }
}

실패 사유를 못 찾아 System.out을 사용해서 값을 찍어보고 깨달았다
j를 끝 (i 직전)까지 검사하고 최후로 같은 값이 발생했을 때 answer[i]를 세팅해야 하는데, j=0에서 값을 세팅해버려서 끝까지 값을 검사하지 못했다!

실패한 코드 - 2

class Solution {
    public int[] solution(String s) {
        int [] answer = new int[s.length()]; // 정답으로 return할 배열
        char[] charArray = s.toCharArray(); // 입력받은 String을 문자열 하나씩 분리하여 배열로 만들기
        int check = -1;
        
        answer[0] = -1; // 0번째 인덱스는 무조건 -1, 아래 for문에서 answer[0] 세팅 불가함
        
        
        for(int i = 0 ; i < s.length() ; i++){
            for(int j = 0 ; j < i ; j++){
                check = -1; // check를 따로 세팅하지 않으면 (아래 조건에 안 걸리면) -1
                if(charArray[i] == charArray[j]) check = i-j;
            }   
               answer[i] = check;
        }
        
        return answer;
    }
}
테스트 1
입력값 〉	"banana"
기댓값 〉	[-1, -1, -1, 2, 2, 2]
실행 결과 〉	실행한 결괏값 [-1,-1,-1,-1,-1,-1]이 기댓값 [-1,-1,-1,2,2,2]과 다릅니다.

테스트 2
입력값 〉	"foobar"
기댓값 〉	[-1, -1, 1, -1, -1, -1]
실행 결과 〉	테스트를 통과하였습니다.

i 직전의 인덱스에서 check가 세팅되는 게 아니면 check를 세팅한 이후에도 check 값이 계속 -1로 세팅되어 버려서 제대로 검사하지 못한다.

정답 코드

class Solution {
    public int[] solution(String s) {
        int [] answer = new int[s.length()]; // 정답으로 return할 배열
        char[] charArray = s.toCharArray(); // 입력받은 String을 문자열 하나씩 분리하여 배열로 만들기
        int check = -1; // answer[i]에 세팅될 두 인덱스의 차이
        
        answer[0] = check; // 0번째 인덱스는 무조건 -1, 아래 for문에서 answer[0] 세팅 불가함
                
        for(int i = 0 ; i < s.length() ; i++){
           check = -1; // check를 따로 세팅하지 않으면 (아래 조건에 안 걸리면) -1
            for(int j = 0 ; j < i ; j++){ // i번째 인덱스 전까지 검사
                
                // 같은 값 검사 시 check세팅, 가장 가까운 값을 검사하므로 check는 변경될 수 있음.
                // 가장 먼 같은 글자 찾기였다면 continue; 걸어서 더 이상 검사하지 않으면 되겠다!
                if(charArray[i] == charArray[j]) check = i-j; 
            }   
               answer[i] = check;
        }
        
        return answer;
    }
}

통과 시간

0.02ms ~ 178.69ms

테스트 1 〉	통과 (0.02ms, 79.4MB)
테스트 2 〉	통과 (0.19ms, 79.2MB)
테스트 3 〉	통과 (0.10ms, 85.3MB)
테스트 4 〉	통과 (5.99ms, 76.2MB)
테스트 5 〉	통과 (87.70ms, 80.3MB)
테스트 6 〉	통과 (21.31ms, 73MB)
테스트 7 〉	통과 (152.06ms, 79.6MB)
테스트 8 〉	통과 (22.89ms, 74.6MB)
테스트 9 〉	통과 (178.69ms, 105MB)
테스트 10 〉	통과 (13.70ms, 81.8MB)
테스트 11 〉	통과 (92.20ms, 76.5MB)
테스트 12 〉	통과 (0.02ms, 76.3MB)
테스트 13 〉	통과 (0.01ms, 76.5MB)
테스트 14 〉	통과 (1.61ms, 77.7MB)
테스트 15 〉	통과 (0.02ms, 73.3MB)
테스트 16 〉	통과 (0.04ms, 79.1MB)
테스트 17 〉	통과 (0.04ms, 66.7MB)
테스트 18 〉	통과 (11.76ms, 83MB)
테스트 19 〉	통과 (9.54ms, 74.3MB)
테스트 20 〉	통과 (1.77ms, 64.3MB)
테스트 21 〉	통과 (0.06ms, 75.1MB)
테스트 22 〉	통과 (18.01ms, 75.5MB)
테스트 23 〉	통과 (1.73ms, 73.6MB)
테스트 24 〉	통과 (2.11ms, 78.1MB)
테스트 25 〉	통과 (2.71ms, 73MB)
테스트 26 〉	통과 (0.30ms, 68.9MB)
테스트 27 〉	통과 (3.06ms, 78MB)
테스트 28 〉	통과 (2.43ms, 74.2MB)
테스트 29 〉	통과 (0.04ms, 75.8MB)
테스트 30 〉	통과 (146.20ms, 80.6MB)
profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글