fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 28361 (C++) 크리스마스
최초 업로드: 2025-11-04 23:16:48
최근 수정 시간: 2025-11-04 23:16:48
게시자: rlatjwls3333
카테고리: 백준
조회수: 10
# [Gold IV] 크리스마스 [문제 링크](https://www.acmicpc.net/problem/28361) ## 문제 설명 <p>20XX년의 크리스마스가 다가옴에 따라 산타클로스는 선린 마을에 선물을 나눠주려고 한다. 선린 마을에는 $1$부터 $N$까지의 번호가 매겨진 집이 있다. 집은 번호가 증가하는 순으로 원형을 이루고 있다. 즉, $1 \le i < N$인 모든 $i$에 대해 $i$번 집과 $i+1$번 집은 이웃해 있고, $N$번 집과 $1$번 집 또한 이웃해 있다. 이웃한 집 사이의 거리는 $1$이다. 산타클로스는 $1$번 집부터 시작해서 모든 집에 방문해 선물을 나눠준 뒤, 다시 $1$번 집으로 돌아올 것이다.</p> <p>산타클로스는 마을 사람들이 잠에서 깨지 않도록 하기 위해 아래 규칙을 따라 이동하려 한다.</p> <ul> <li>시계 방향 또는 반시계 방향으로 현재 집에서 거리가 $2$ 이하인 집에만 갈 수 있다.</li> <li>세 번 연속 같은 방향으로 갈 수 없다.</li> <li>같은 집을 두 번 연속으로 방문할 수 없다.</li> </ul> <p>같은 집을 두 번 연속으로 방문할 수 없지만, 다른 집을 거친 다음에 다시 방문하는 것은 가능하다.</p> <p>$1$번 집에서 출발하여 가능한 한 적게 이동하며 모든 집을 방문하고 $1$번 집으로 돌아올 때 이동 횟수와 방문 순서를 출력하여라.</p> ## 입력 <p>첫째 줄에 마을에 있는 집의 수 $N$이 주어진다. $( 5 \le N \le 1\,000\,000 )$</p> ## 출력 <p>첫 번째 줄에는 가장 적게 이동했을 때 이동 횟수 $K$를 출력한다.</p> <p>두 번째 줄에는 이동하며 방문한 집의 번호를 나타내는 $K+1$개의 정수를 공백으로 구분하여 출력한다. 집의 번호는 방문한 순서대로 출력한다.</p> <p>반드시 $1$번 집에서 출발하여 모든 집을 방문하고 $1$번 집으로 돌아온 뒤 이동을 마쳐야 한다. 즉, 두 번째 줄에 출력하는 첫 정수와 마지막 정수는 항상 $1$이다.</p> <p>가능한 답이 여러 가지라면 아무거나 출력한다.</p> ## 풀이 - n이 3의 배수일 때는, +2 -1 +2를 반복하여 해결할 수 있다. - n이 3의 배수가 아닐 때는 처음에 +1 +2 -1를 가고 +2 -1 +2를 반복하여 해결할 수 있다. ``` c++ #include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; cout << n << "\n1"; int cur=1; if(n%3) { cout << " 2 4 3 5"; cur=5; } while(cur<n-1) { cout << ' ' << cur+2 << ' ' << cur+1 << ' ' << (cur+2)%n+1; cur+=3; } if(cur==n) cout << " 1"; } ```