티스토리 뷰

https://www.acmicpc.net/problem/16472

 

16472번: 고냥이

고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    static int n;
    static int maxLength = 0;
    static int[] check = new int[26]; // 알파벳 몇번 나왔는지 기록
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        char[] arr = br.readLine().toCharArray();

        int start = 0;
        int end = 0;
        int count = 1; // 지금까지 나온 알파벳 종류 수
        check[arr[0]-'a'] = 1;

        while(true) {
            end++;

            // 종료 조건: 끝까지 봤음
            if(end == arr.length) {
                break;
            }

            int right = arr[end] - 'a';
            check[right]++;

            if(check[right] == 1) {
                count++;
            }

            // 알파벳 종류가 n보다 큰 상태
            while(count > n) {
                // start를 앞으로 한칸 옮길 것

                int left = arr[start] - 'a';
                check[left]--;

                // 이제 check[left] 알파벳은 문자열에 없음
                if(check[left] == 0) {
                    count--;
                }

                start++;
            }

            maxLength = Math.max(maxLength, end-start+1);
        }

        System.out.println(maxLength);
    }
}

1차원 배열에서 두 개의 포인터를 두고 조작하여 원하는 값을 알아내는 투 포인터 알고리즘을 활용하는 문제입니다.
이 문제에서 투 포인터를 사용하지 않고 모든 부분 배열을 완전 탐색한다면 O(n^2)이 되고 시간초과가 될 것입니다.

 

 

투 포인터 개념 정리는

https://aainy.tistory.com/5

 

투 포인터 (Two Pointers)

투 포인터 (Two Pointers) 투 포인터 알고리즘은 1차원 배열에서 두 개의 포인터를 조작하여 원하는 결과를 얻어내는 알고리즘입니다. 🎈 예제 길이가 n 인 1차원 배열이 있을 때, 그 부분 배열의 원

aainy.tistory.com

포스팅에 있습니다 ^_^