🔍 문제
과일이 두 종류가 남도록 앞뒤에서 과일을 뺀다. 이때 가장 많이 남길수 있는 경우의 값 구하기
투포인터와 해쉬맵을 사용해서 풀이한다.
👾 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class P30804 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[] fruit = new int[N];
HashMap<Integer, Integer> fruitKind = new HashMap<>();
//과일 입력
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) fruit[i] = Integer.parseInt(st.nextToken());
int left = 0;
int max = 0;
for(int right = 0; right < N; right++){
//getOrDefault : 특정 키가 맵에 존재하면 그 값을 반환하고, 존재하지 않으면 기본값(0)을 반환
fruitKind.put(fruit[right], fruitKind.getOrDefault(fruit[right], 0) + 1);
//과일 종류가 2개를 초과할 경우
while(fruitKind.size() > 2){
//구간 첫번째부터 순회하며 카운트 감소
fruitKind.put(fruit[left], fruitKind.get(fruit[left]) - 1);
//만약 해당 종류의 과일이 0개가 되면 hashmap에서 지움
if(fruitKind.get(fruit[left]) == 0) fruitKind.remove(fruit[left]);
//구간축소
left++;
}
// 가장 큰 구간 구하기
max = Math.max(max, right - left + 1);
}
System.out.println(max);
}
}
💡 getOrDefault(Key, 0)
특정 키가 맵에 존재하면 그 값을 반환하고, 존재하지 않으면 기본값(여기서는 0)을 반환
'[ STUDY ] > CodingTest' 카테고리의 다른 글
백준 1389 : 케빈 베이컨 6단계 법칙 (0) | 2024.12.11 |
---|---|
BFS, DFS 어려워여 (1) | 2024.12.07 |
백준 18111 : 마인 크래프트 (1) | 2024.12.03 |
백준 1927 : 최소 힙 (3) | 2024.11.26 |
백준 1260 : DFS와 BFS(오늘의 교훈 : 문제를 잘 읽자) (2) | 2024.11.25 |