백준

[백준_2816] 디지털 티비

빙수빈수 2021. 7. 27. 17:24

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

 

2816번: 디지털 티비

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

www.acmicpc.net

[문제]

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

 

[코드]

import java.util.*;

public class BaekJoon_2816 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		String[] channel=new String[n];
		
		for(int i=0;i<n;i++)
			channel[i]=sc.next();
		
		// KBS1을 첫 번째 채널로 만들기
		for(int i=0;i<n;i++) {
			// KBS1을 찾았다면 해당 i인덱스만큼 채널 끌어 올리기
			if(channel[i].equals("KBS1")) {
				String temp="";
				for(int j=i;j>0;j--) {
					System.out.print(4);
					temp=channel[j-1];
					channel[j-1]=channel[j];
					channel[j]=temp;
				}
				break;
			}
			// KBS1 찾기 전까지 화살표 내리기
			else
				System.out.print(1);
		}
		
		// KBS1을 첫 번째로 옮기고 난 후 두 번째 채널이 KBS2라면 종료
		if(channel[1].equals("KBS2"))
			System.exit(0);
		
		// KBS2을 두 번째 채널로 만들기
		for(int i=0;i<n;i++) {
			/*
			 * KBS2을 찾았다면 해당 i인덱스만큼 채널 끌어 올리기
			 * 이때 첫 번째 채널은 KBS1인것 주의
			 */
			if(channel[i].equals("KBS2")) {
				String temp="";
				for(int j=i;j>1;j--) {
					System.out.print(4);
					temp=channel[j-1];
					channel[j-1]=channel[j];
					channel[j]=temp;
				}
				break;
			}
			// KBS2 찾기 전까지 화살표 내리기
			else
				System.out.print(1);
		}
	}
}

 

[고찰]

 이번 문제처럼 스페셜 져지 정답이 예제와는 다른 여러개가 나올 수 있는 문제로 그에 따라 여러 정답 코드가 생길 수 있다. 위의 코드는 단순히 "KBS1" 부터 첫 번째 자리로 옮기고, 후에 "KBS2"를 두 번째 자리로 옮기는 방식으로 구성되어 있다. 이렇게 코드를 짜다보니 문제에 옮기는 방법으로 주어진 2,3번은 사용하지 않게 됐다. 이를 활용하는 다른 풀이 방법은 없을까 검색도 해보았지만 다들 위와 비슷한 방법으로 해결한 것 같다. 

'백준' 카테고리의 다른 글

[백준_8979번] 올림픽  (0) 2021.07.27
[백준_11724] 연결 요소의 개수  (0) 2021.07.27
[백준_2621번] 카드게임  (0) 2021.07.27
[백준_1652번] 누울 자리를 찾아라  (0) 2021.07.27
[백준_2206번] 벽 부수고 이동하기  (0) 2021.07.26