본문 바로가기

Algorithm/Math

(C++) - 백준(BOJ) 17827번 : 달팽이 리스트

반응형

https://www.acmicpc.net/problem/17827

 

17827번: 달팽이 리스트

첫째 줄에 노드의 개수 N(2 ≤ N ≤ 200,000), 질문의 횟수 M(1 ≤ M ≤ 200,000), N번 노드가 가리키는 노드의 번호 V(2 ≤ V ≤ N)가 공백으로 구분되어 주어진다. 둘째 줄에 N개의 정수 C1, C2, …, CN이 공백

www.acmicpc.net

순회하는 공식을 찾는 수학문제였습니다.

 

 

 

풀이방법

 1. 1번노드를 제외한 2번부터 사이클의 첫 번째이므로 v의 값을 입력받은뒤 1을 빼줘야 합니다. 그 외 적절히 입력받습니다.

 

 2. k < n인 경우에는 사이클을 순회하지 않으므로 그대로 k번째 값을 출력합니다. 이외의 경우에는 사이클을 적절히 돌게 됩니다. 사이클에 해당하지 않는 노드의 방문에 해당하는 k-v값에 대해 cycle만큼 돈 후의 위치를 얻고 다시 v만큼 더한 부분을 출력해줍니다.

 

Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
int n, m, v, snail[200001];

int main(){
    fastio;
    cin >> n >> m >> v;
    for(int i = 0; i < n; i++) cin >> snail[i];
    v--;
    int cycle = n - v;
    for(int i = 1, k; i <= m; i++){
        cin >> k;
        if(k < n) cout << snail[k] << '\n';
        else cout << snail[(k-v) % cycle + v] << '\n';
    }
}