21.05.29 기록

1 분 소요

  • 백준 알고리즘 1316 풀이 완료

    • 내가 푼 1316 풀이 (통과하지 못한 틀린 코드이다.)
      테스트 케이스의 결과는 잘 나왔지만 백준에서는 틀린 코드였다.
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class B1316 {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                int testCase = Integer.parseInt(br.readLine());
                int cnt = 0;
    
                for(int i = 0; i < testCase; i++) {
                    String s = br.readLine();
                    char[] sArr = new char[100];
    
                    int index = 0;
                    for(int j = 0; j < s.length()-1; j++) {
                        if(s.charAt(j) != s.charAt(j+1)) {
                            sArr[index] = s.charAt(j);
                            if (j == s.length() - 2) {
                                sArr[++index] = s.charAt(j+1);
                                break;
                            }
                            index++;
                        }
                    }
    
                    boolean isGroup = true;
                    for(int j = 0; j < sArr.length; j++) {
                        if(sArr[j] <= 0) { break; }
    
                        for(int k = j+1; k < sArr.length; k++) {
                            if(sArr[k] <= 0) { break; }
                            if (sArr[j] == sArr[k]) {
                                isGroup = false;
                                break;
                            }
                        }
                    }
    
                    if(isGroup) { cnt++; }
                }
                System.out.println(cnt);
        }
    }
    


    • 해설 풀이 (메모리 14.3MB, 시간 136ms로 통과)
      풀이에 한계를 느끼고 해설을 찾아보았다.
      boolean 배열로 check 하는 로직을 구현하고 이를 함수로 사용한 풀이이다.
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class B1316 {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            int testCase = Integer.parseInt(br.readLine());
            int cnt = 0;
    
            for(int i = 0; i < testCase; i++) {
                if( isGroup(br.readLine()) ) { cnt++; }
            }
            System.out.println(cnt);
        }
    
        public static boolean isGroup(String s) {
            boolean[] chk = new boolean[26];
            int prev = 0;
    
            for(int i = 0; i < s.length(); i++) {
                int now = s.charAt(i);
    
                if(prev != now) {
                    if(chk[now - 'a'] == false) {
                        chk[now - 'a'] = true;
                        prev = now;
                    }
                    else return false;
                }
            }
            return true;
        }
    }
    
    • 현재의 문자(now)가 이전 문자(prev)와 같지 않을 때 처음 나온 문자라면 boolean 배열의 해당 알파벳 인덱스를 true로 체크해준다.
      반대로 중복으로 나온 문자라면(boolean 배열에서 이미 true 값을 가짐) false를 return하고 함수를 종료한다.

카테고리:

업데이트: