[백준] 회전 초밥

유승선 ·2022년 8월 17일
0

백준

목록 보기
44/64

최근 코딩 테스트 트랜드로 투포인터 문제들도 간간히 보이는거 같아서 오랜만에 이런 유형의 문제를 풀어보았다. 처음 읽었을때는 되게 간단해 보여서 내가 그동안 연습했던 투포인터 형식으로 문제를 풀었지만 생각보다 잘 안됐고 좀 좌절 했다.

그런데 문제를 자세히 읽다보니 회전 초밥 배열을 N 만큼만 탐색 하는게 아닌 회전 하는 형식으로 만들어야 됐었다. 즉,

0 1 2 3 4 5 가 있다고 하고 연속되는 k의 숫자가 3 이라면은 5 0 1 까지도 탐색이 되야 한다는 소리였다.

보통 투포인터를 이용할때는 i와 j 인덱스를 애용하지만 이번에는 살짝 다르게 start 와 end 인덱스를 각각 같은 지점에서 시작하는게 아닌 k만큼 벌어진 구간에서 사용했다.

#include <iostream> 
#include <bits/stdc++.h> 
#define endl "\n"
#define MAX 100010
using namespace std;

int N, d, k, c; 
int matrix[3000001];
map<int,int> hashMap; 

void Input(){
    cin >> N >> d >> k >> c;
    for(int i = 0; i < N; i++){
        cin >> matrix[i]; 
    }
}

void Solution(){
    for(int i = 0; i < k-1; i++){
        hashMap[matrix[i]]++; 
    }
    int answer = 0, len = 0, start = 0, end = k-1; 
    for(int i = 0; i < N; i++){
        int curr = matrix[end%N]; 
        int move = matrix[start]; 
        hashMap[curr]++; 
        len = hashMap.size(); 
        if(!hashMap.count(c)) answer = max(answer,len+1); 
        else answer = max(answer,len); 

        if(--hashMap[move] == 0){
            hashMap.erase(move); 
        }


        start++;
        end++; 
    }

    cout << answer; 
}


void Solve(){
    Input();
    Solution(); 
}

int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen("input.txt", "r", stdin);
    Solve();
    return 0;

}

앞으로도 투포인터 유형의 문제를 풀때 이런식으로 활용해봐야겠다.

배운점:
1. 투포인터 이론
2. 투포인터 변형

profile
성장하는 사람

0개의 댓글