본문 바로가기

Algorithms/PS

[PS] 백준 #21313. 문어

문제 정보

 

문제

문어에게 여덟개의 팔이 있다는 사실은 잘 알려져 있다. 하지만 문어들이 자신의 팔들을 1번, 2번, 3번, ..., 8번이라고 부른다는 말은 오늘 처음 들었을 것이다! 단, 시계방향으로 오름차순이라던가 하는 규칙은 없다. (물론 그러한 문어도 존재할 수 있다.) 문제에선 편의상 팔 대신 손이라고 부르자.

문어들은 정월 대보름을 맞아 강강술래를 하려고 한다. 각 문어는 양 옆의 서로 다른 두 문어와 손을 맞잡아 원을 만든다. 문어끼리 손을 잡을 때 지켜야 할 예절이 있다.

  • 서로 같은 번호의 손을 잡아야 한다.
  • 한 문어와 둘 이상의 손을 잡을 수 없다.
  • 한 손으로 여러 문어의 손을 잡을 수 없다.

모든 문어들은 예의바르기 때문에 예절을 항상 따른다.

강강술래를 하는 N마리의 문어 중 하나를 골라 1번 문어라 하자. 1번 문어를 기준으로 시계방향 순으로 2번, 3번, 4번, ..., N번 문어라고 부르자. 우리는 인접한 두 문어가 잡은 손의 번호를 이용하여 길이 N의 수열을 만들 것이다. 1번과 2번 문어가 잡은 손의 번호는 1번째 항, 2번과 3번 문어가 잡은 손의 번호는 2번째 항, ..., N - 1번과 N번 문어가 잡은 손의 번호는 N - 1번째 항, N번 문어와 1번 문어가 잡은 손의 번호는 N번째 항이다.

문어의 수 N이 주어질 때, 이렇게 만들 수 있는 수열 중 사전순으로 제일 앞서는 수열을 알아보자. 다음은 문어가 4마리일 때 사전순으로 제일 앞서는 수열인 1 2 1 2 를 만드는 방법이다.

 

나의 풀이

이 문제는 상황이 되게 복잡해보였지만, n이 4일때부터 차근차근 써보니 "사전순으로 제일 앞서기"라는 조건 때문에 답이 매우 쉬워지는 것을 알 수 있었다. 최대한 1을 많이 써야되기 때문에 짝수면 "1 2 1 2 1 2 ..."가 답이고, 홀수면 "1 2 1 2 1 2 ... 3" 이 답이다. 이런 식으로 특이한 발상을 요구하는 문제 유형을 "애드 혹" 이라고 한다는 것을 알게 되었다.

#include <bits/stdc++.h>

using namespace std;

int main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int n; cin >> n;

	// n이 짝수면 1 2만 반복
	if (n % 2 == 0) {
		for (int i = 0; i < n / 2; i++) {
			cout << "1 2 ";
		}
	}
	else {
		// n이 홀수면?
		for (int i = 0; i < n / 2; i++) {
			cout << "1 2 ";
		}
		cout << "3";
	}
}

'Algorithms > PS' 카테고리의 다른 글

[PS] 백준 #9417. 최대 GCD  (0) 2022.01.31
[PS] 백준 #2012. 등수 매기기  (0) 2022.01.31
[PS] 백준 #21968. 선린의 터를  (0) 2022.01.27
[PS] 백준 #21966. (중략)  (0) 2022.01.27
[PS] 백준 #1708. 볼록 껍질  (0) 2022.01.17