[2816] 디지털 티비

Update:     Updated:

카테고리:

태그:

[Bronze I] 디지털 티비 - 2816

문제 링크

성능 요약

메모리: 14160 KB, 시간: 136 ms

분류

구현, 구성적

문제 설명

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가 두 번째에 있는 입력은 주어지지 않는다.

출력

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

아이디어

사실 좀 더 멋지게 풀고 싶었으나, 별다른 해법이 떠오르지 않아 그냥 greedy하게 풀었다.
1번과 4번 버튼만 이용해도 차근차근 다 풀 수 있다.

답안코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        String[] channel = new String[n];
        for (int i = 0; i < n; i++) {
            channel[i] = br.readLine();
        }

        // KBS1 설정
        setting(channel, "KBS1", 0);

        // KBS2 설정
        setting(channel, "KBS2", 1);
    }

    public static void swap(String[] channel, int idx) {
        String temp = channel[idx];
        channel[idx] = channel[idx - 1];
        channel[idx - 1] = temp;
    }

    public static void setting(String[] channel, String targetName, int targetIdx) {
        int kbsIdx = 0;

        for (int i = 0; i < channel.length; i++) {
            if (channel[i].equals(targetName)) {
                kbsIdx = i;
                break;
            }
            System.out.print(1);
        }

        while (kbsIdx > targetIdx) {
            swap(channel, kbsIdx--);
            System.out.print(4);
        }
    }
}

BOJ 카테고리 내 다른 글 보러가기

댓글 남기기