본문 바로가기

백준/C++

[Baekjoon/C++] 2816번 - 디지털 티비

[백준] Baekjoon Online Judge

문제로 이동

 

문제

2012년 12월 31일 새벽 4시부터 지상파 아날로그 TV방송이 종료되었다. TV를 자주보는 할머니를 위해서, 상근이네 집도 디지털 수신기를 구입했다.

원래 상근이네 집에는 KBS1과 KBS2만 나왔다. 할머니는 두 방송만 시청한다. 이제 디지털 수신기와 함께 엄청난 양의 채널을 볼 수 있게 되었다.  하지만, 할머니는 오직 KBS1과 KBS2만 보려고 한다. 따라서, 상근이는 채널 리스트를 조절해 KBS1을 첫 번째로, KBS2를 두 번째로 만들려고 한다.

티비를 켜면 디지털 수신기는 시청 가능한 채널 리스트를 보여준다. 모든 채널의 이름은 서로 다르고, 항상 KBS1과 KBS2를 포함하고 있다. 상근이는 이 리모콘을 이용해서 리스트의 순서를 바꾸는 법을 알아냈다. 리스트의 왼편에는 작은 화살표가 있고, 이 화살표는 현재 선택한 채널을 나타낸다. 가장 처음에 화살표는 제일 첫 번째 채널을 가리키고 있다.

다음과 같은 네 가지 버튼을 이용해서 리스트의 순서를 바꿀 수 있다. 각각은 1번부터 4번까지 번호가 적혀져있는 버튼이다.

  1. 화살표를 한 칸 아래로 내린다. (채널 i에서 i+1로)
  2. 화살표를 위로 한 칸 올린다. (채널 i에서 i-1로)
  3. 현재 선택한 채널을 한 칸 아래로 내린다. (채널 i와 i+1의 위치를 바꾼다. 화살표는 i+1을 가리키고 있는다)
  4. 현재 선택한 채널을 위로 한 칸 올린다. (채널 i와 i-1의 위치를 바꾼다. 화살표는 i-1을 가리키고 있다)

화살표가 채널 리스트의 범위를 넘어간다면, 그 명령은 무시한다.

현재 채널 리스트의 순서가 주어졌을 때, KBS1를 첫 번째로, KBS2를 두 번째로 순서를 바꾸는 방법을 구하는 프로그램을 작성하시오. 방법의 길이는 500보다 작아야 한다. 두 채널을 제외한 나머지 채널의 순서는 상관없다.

 

입력

첫째 줄에 채널의 수 N이 주어진다. (2 ≤ N ≤ 100)

다음 N개 줄에는 채널의 이름이 한 줄에 하나씩 주어진다. 채널의 이름은 최대 10글자이고, 알파벳 대문자와 숫자로만 이루어져 있다.

이미 KBS1이 첫 번째에, KBS2가 두 번째에 있는 입력은 주어지지 않는다.

 

출력

상근이가 눌러야 하는 버튼을 순서대로 공백없이 출력한다.

 


풀이

#include <iostream>
using namespace std;

string arr[101];

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

    int N;
    int k1 = 0, k2 = 0;

    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> arr[i];

        if (arr[i] == "KBS1") k1 = i;
        if (arr[i] == "KBS2") k2 = i;
    }

    for (int i = 0; i < k1; i++) cout << 1;
    for (int i = 0; i < k1; i++) cout << 4;

    if (k1 > k2) k2++;

    for (int i = 0; i < k2; i++) cout << 1;
    for (int i = 1; i < k2; i++) cout << 4;

    return 0;
}

 KBS1와 KBS2를 4로 올려서 제자리를 찾아가도록 하는 방식으로 구현하였다. KBS1와 KBS2의 인덱스 위치를 저장하고, 그 숫자만큼 1과 4를 출력하는데, 이때 KBS2가 KBS1보다 위에 있었다면 KBS1이 위로 가면서 한칸 밀리기에 1를 더해야 한다.