알고리즘/알고리즘 연습
[BOJ_16472] 고냥이 Java (투 포인터)
aainy
2022. 5. 23. 20:34
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)이 되고 시간초과가 될 것입니다.
투 포인터 개념 정리는
투 포인터 (Two Pointers)
투 포인터 (Two Pointers) 투 포인터 알고리즘은 1차원 배열에서 두 개의 포인터를 조작하여 원하는 결과를 얻어내는 알고리즘입니다. 🎈 예제 길이가 n 인 1차원 배열이 있을 때, 그 부분 배열의 원
aainy.tistory.com
포스팅에 있습니다 ^_^