
-Code
import java.io.*;
import java.util.*;
public class BOJ30804 {
public static void main(String[] args) throws Exception {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
int cnt = Integer.parseInt(br.readLine());
// 과일 받기
StringTokenizer st = new StringTokenizer(br.readLine());
int[] fruits = new int[cnt];
for (int i = 0; i < cnt; i++) {
fruits[i] = Integer.parseInt(st.nextToken());
}
// 과일 갯수를 저장할 map
Map<Integer, Integer> fruitsCnt = new HashMap<>();
// 2개의 포인터로 최대 갯수 계싼
int answer = 0;
int left = 0;
for (int right = 0; right < cnt; right++) {
// 과일 갯수 추가
fruitsCnt.put(fruits[right], fruitsCnt.getOrDefault(fruits[right], 0) + 1);
// 과일 종류가 2개 이상인 경우
while (fruitsCnt.size() > 2) {
int leftFruit = fruits[left];
// 2개 이하가 될때까지 왼쪽 포인터를 움직이며 제거
Integer leftFruitCnt = fruitsCnt.get(leftFruit);
// 없는 값인 경우 넘어가기
if (leftFruitCnt == null) continue;
// 1개인 경우 제거
if (leftFruitCnt == 1) {
fruitsCnt.remove(leftFruit);
} else {
// 1개 초과면 -1
fruitsCnt.put(leftFruit, leftFruitCnt - 1);
}
left++;
}
// 어차피 갯수는 오른쪽에서 왼쪽 위치를 빼고 +1한 값
answer = Math.max(answer, right - left + 1);
}
System.out.println(answer);
}
}
처음에는 투포인터를 사용하나 2중 for문으로 log(n^2)이 나와서 틀렸었습니다. 그래서 슬라이딩 윈도우를 적용해 해결했습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 5427번 불 (0) | 2026.01.22 |
|---|---|
| [백준/Java] 1495번 기타리스트 (0) | 2026.01.22 |
| [백준/Java] 1926번 그림 (0) | 2026.01.21 |
| [백준/Java] 19947번 투자의 귀재 배주형 (0) | 2026.01.21 |
| [백준/Java] 2502번 떡 먹는 호랑이 (0) | 2026.01.21 |