Young

BOJ - 달팽이 리스트 (17827) 본문

코딩 테스트 대비 추천 문제

BOJ - 달팽이 리스트 (17827)

yyjjang9 2019. 12. 3. 01:28
728x90
반응형

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이 공백으로 구분되어 주어진다. 이때 Ci는 i번 노드에 저장된 값을 뜻한다. (1 ≤ Ci ≤ 1,000,000) 셋째 줄부터 M개의 줄에 걸쳐 각 질문에 해당하는 K(1 ≤ K ≤ 109)가 주어진다.

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
#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    int n, m, v;
    cin >> n >> m >> v;
 
    vector<int> vv(n);
    for (int i = 0; i < n; i++) {
        cin >> vv[i];
    }
 
    int before_cycle = v - 2;    // 사이클 전까지 배열에서의 인덱스를 구함, 
                                // v가 3일 때 3번째 노드(인덱스 2 노드)도 사이클의 일부이다. 
                                // 따라서 1번 인덱스 노드까지가 사이클에 들어가기 전이므로 v - 2 를 해줌
 
    int cycle_length = n - (v - 1);    // 사이클 전까지 노드 갯수가 v - 1 개 이므로 n 에서 이를 빼준 값이 사이클 길이다.
 
    while (m--) {
        int q;
        cin >> q;
        // 경우의 수는 총 2가지
        // 1. 사이클 들어가기 전 인덱스 노드의 값을 구할 경우
        // 2. 사이클 들어간 인덱스 노드의 값을 구할 경우
        if (q <= before_cycle) {
            cout << vv[q] << endl;
        }
        else {
            // 사이클에 들어가고 나서 몇 번을 가는지 정확히 계산하기 위해서 구해줌
            q = q - before_cycle - 1;
            // 이를 사이클 길이 나머지 값을 취하면 유효한 값이 나온다.
            q %= cycle_length;
            cout << vv[before_cycle + 1 + q] << endl;
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

 

 

728x90
반응형