자바생
Published 2021. 10. 2. 17:20
자바(백준) 16472 고냥이 BOJ(Java)
728x90

오답 노트 & 새로 알게 된 점

문제에서 최대 N개의 연속된 문자열로 투 포인터에 대한 힌트를 주었다.

 

처음에 문제 접근을 할 때, possible 배열을 boolean으로 했다.

그러나 abbcc와 같은 경우 b의 개수는 2개이므로 b를 하나 없애도 결국 하나 남기 때문에,

b가 모두 없어져야 알파벳의 한 종류가 사라지게 된다.

 

그래서 boolean으로 하면 틀리게 된다!! 처음부터 int로 할껄 그랬나보다..

 

아무튼 위에서 말했듯이 b의 개수가 2개라면 0개가 되야지 한 종류의 알파벳이 사라지게 된다.

따라서 s를 움직일 때, possible의 값이 0이 되야지 cnt(종류의 개수를 나타냄)를 -1 할 수 있다.

 

또한, e를 움직이면서 possible값을 ++ 해줄 때, possible이 1이 되면 처음 나오는 알파벳으로

cnt를 늘려줘야한다.

 

여기서 중요한 점은 cnt < N일 때까지 while문을 돌린다.

만약 cnt <= N일 때까지 돌리게 된다면 새로운 종류가 나오는 그 index까지 e가 늘어나게 되므로 

끝까지 탐색을 하지 않는다.

 

따라서 cnt < N까지 탐색을 한 뒤, while문을 한개 더 사용하여 possible의 개수가 > 0 인 곳까지 e를 늘려주고

len을 구하면 된다.

 


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package TwoPointers;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class BOJ16472 {
    static int atoi(String str) {
        return Integer.parseInt(str);
    }
 
    static int N;
    static int A[];
    static int possible[] = new int[27];
    static String str;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        N = atoi(br.readLine());
        str = br.readLine();
 
        pro();
    }
 
    static void pro() {
        int e = -1, len = Integer.MIN_VALUE, cnt = 0;
 
        for (int s = 0; s < str.length(); s++) {
            if(s>=1 && possible[str.charAt(s-1- 'a'> 0){
                possible[str.charAt(s-1- 'a']--;
                if(possible[str.charAt(s-1- 'a'== 0) cnt--;
            }
 
            while (e + 1 < str.length() && cnt < N) {
                possible[str.charAt(++e) - 'a']++;
 
                if(possible[str.charAt(e) - 'a'== 1) cnt++;
            }
 
            while(e+1 < str.length() && possible[str.charAt(e+1- 'a'> 0){
                possible[str.charAt(++e) - 'a']++;
            }
 
            len = Math.max(len, e - s + 1);
        }
        System.out.println(len);
    }
}
 
cs
728x90

'BOJ(Java)' 카테고리의 다른 글

자바(백준) 1253 좋다  (0) 2021.10.08
자바(백준) 13144 List of Unique Numbers  (0) 2021.10.02
자바(백준) 2230 수 고르기  (0) 2021.09.29
자바(백준) 3273 두 수의 합  (0) 2021.09.29
자바(백준) 22945 팀 빌딩  (0) 2021.09.28
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그