코테/백준

[백준/JAVA] 20922번: 겹치는 건 싫어

imname1am 2023. 8. 7. 16:13
반응형

🔺 문제

 

20922번: 겹치는 건 싫어

홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 $K$개 이하로 들어 있는 최장 연속 부분 수열

www.acmicpc.net

 

 

🔺 코드

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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        
        int[] A = new int[N];
        st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0 ; i < N ; i++) {
            A[i] = Integer.parseInt(st.nextToken());
        }
        
        int result = 0// 같은 정수를 K개 이하로 포함한 최장 연속 부분 수열 길이
 
        int left = 0;
        int right = 0;
        int[] counting = new int[100001];    // 카운팅 배열 !
        
        // 수열 탐색하면서 각 원소가 몇 개 있는지 카운트
        while(left <= right) {
            // 길이 늘릴 수 있는 경우
            if(right <= N - 1 && counting[A[right]] < K) {
                counting[A[right]]++;
                right++;
            }
            // 더 이상 늘릴 수 없는 경우, left 이동
            else if(counting[A[right]] == K) {
                counting[A[left]]--// 기존에 left였던 원소의 카운팅 하나 빼기
                left++;              // left를 오른쪽으로 이동
            }
 
            // 더 이상 늘릴 수 없는 경우
            result = Math.max(result, right - left);
            
            if(right == N)  break;
        }
        
        System.out.println(result);
    }
}
cs
✅ 해결 아이디어
✔ 투 포인터
- 같은 정수를 K개 이하로 포함한 최장 연속 부분 수열 길이를 구하는 것이므로
  카운팅 배열을 생성해 해당 정수의 갯수 구함.
→ right가 K번 사용되지 않아 길이를 늘릴 수 있는 경우, 해당 원소의 사용횟수를 + 1하고, right를 늘려준다.
→ 이미 K번 사용된 경우, 기존에 left였던 원소의 카운팅 갯수를 하나 빼고, left을 오른쪽으로 이동

 

 


🔺 다른 풀이들

- while문이 조금 다름

 

백준 20922 겹치는 건 싫어 (Java,자바)

이번에 풀어본 문제는 백준 20922번 겹치는 건 싫어 입니다.

velog.io


💬 느낀 점

투 포인터를 이렇게...?

복습을 해야겄다..

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 풀이 참고...😅

 

백준 20922[자바] java 겹치는 건 싫어

문제 링크: https://www.acmicpc.net/problem/20922 20922번: 겹치는 건 싫어 홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를

dingdingmin-back-end-developer.tistory.com

 

백준 20922번 - 겹치는 건 싫어

문제를 본 순간 투포인터를 사용해야될 것 같다는 느낌이 들었다.어떤 숫자가 몇번이 사용됐는지 체크하는 cnt배열을 사용하면 풀 수 있다.l=0, r=0 부터 시작해서 r번째에 있는 숫자가 k번 미만으

velog.io

 

반응형