Problem Solving/BOJ

[백준 / BOJ] C++ 27920 카드 뒤집기

nageune 2023. 3. 27. 11:05
728x90
반응형

27920번: 카드 뒤집기

 

문제

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

 

27920번: 카드 뒤집기

$1$부터 $N$까지 서로 다른 정수가 적혀있는 카드를 $N$장 가지고 있다. 각 카드에는 앞면과 뒷면이 존재한다. 카드의 앞면에는 숫자가 적혀있고, 뒷면에는 카드의 무늬가 그려져 있다. $N$장의 카

www.acmicpc.net

 

 

풀이

카드를 어떻게 해야 조건을 만족하며 모두 뒤집을 수 있을지 구성하는 문제다. 처음부터 든 생각은 N은 마지막에 배치해야 하기 때문에 양쪽 끝부터 수를 줄여가며 구성하면 될 것 같았다. 노트에 한 번 적어보고 바로 구현해서 풀었다. 예를 들어 N이 4인 경우 카드 배치는 3 1 4 2, 순서는 1 4 2 3으로 하면 가능하다. N이 5인 경우엔 4 2 5 1 3, 1 5 2 4 3이다. 이로써 N이 홀수인지 짝수인지에 따라 수를 몇 개나 출력할지 정할 수 있다.

 

그리고 N-1부터 1씩 줄여가며 왼쪽, 오른쪽에 배치하고 점점 안쪽으로 좁혀들어가다 1을 배치한 다음 N을 배치하면 된다. 카드를 뒤집는 순서는 홀수 짝수와 상관없이 같은 방식으로 했다. 바로 출력을 해주기 위해 홀짝 구분을 하고 반복문을 사용했다. 자세한 설명은 코드에서 하겠다.

 

 

코드

#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  cout << "YES\n";
  if (n % 2) { // N이 홀수일 때
  	// N-1부터 2씩 줄여가며 2까지 출력
    for (int i = n - 1; i > 1; i -= 2)
      cout << i << ' ';
    // N 출력
    cout << n << ' ';
    // 1부터 2씩 증가시키며 N-2까지 출력
    for (int i = 1; i < n; i += 2)
      cout << i << ' ';
    cout << '\n';
  } else { // N이 짝수일 때
    // N-1부터 2씩 줄여가며 1까지 출력
    for (int i = n - 1; i > 0; i -= 2)
      cout << i << ' ';
    // N 출력
    cout << n << ' ';
    // 2부터 2씩 증가시키며 N-2까지 출력
    for (int i = 2; i < n; i += 2)
      cout << i << ' ';
    cout << '\n';
  }
  // 홀수번째는 1부터 1씩 증가
  // 짝수번째는 N부터 1씩 감소
  int odd = 1, even = n;
  for (int i = 1; i <= n; i++) { // 총 N번 출력 (1부터 N까지 모두 출력)
    if (i % 2) { // 홀수번째인 경우
      cout << odd << ' '; // 홀수일 때 출력할 수 출력
      odd++; // 1 증가
    } else { // 짝수번째인 경우
      cout << even << ' '; // 짝수일 때 출력할 수 출력
      even--; // 1 감소
    }
  }
  return 0;
}

 

728x90
반응형