https://www.acmicpc.net/problem/2816
2012년 12월 31일 새벽 4시부터 지상파 아날로그 TV방송이 종료되었다. TV를 자주보는 할머니를 위해서, 상근이네 집도 디지털 수신기를 구입했다.
원래 상근이네 집에는 KBS1과 KBS2만 나왔다. 할머니는 두 방송만 시청한다. 이제 디지털 수신기와 함께 엄청난 양의 채널을 볼 수 있게 되었다. 하지만, 할머니는 오직 KBS1과 KBS2만 보려고 한다. 따라서, 상근이는 채널 리스트를 조절해 KBS1을 첫 번째로, KBS2를 두 번째로 만들려고 한다.
티비를 켜면 디지털 수신기는 시청 가능한 채널 리스트를 보여준다. 모든 채널의 이름은 서로 다르고, 항상 KBS1과 KBS2를 포함하고 있다. 상근이는 이 리모콘을 이용해서 리스트의 순서를 바꾸는 법을 알아냈다. 리스트의 왼편에는 작은 화살표가 있고, 이 화살표는 현재 선택한 채널을 나타낸다. 가장 처음에 화살표는 제일 첫 번째 채널을 가리키고 있다.
다음과 같은 네 가지 버튼을 이용해서 리스트의 순서를 바꿀 수 있다. 각각은 1번부터 4번까지 번호가 적혀져있는 버튼이다.
화살표가 채널 리스트의 범위를 넘어간다면, 그 명령은 무시한다.
현재 채널 리스트의 순서가 주어졌을 때, KBS1를 첫 번째로, KBS2를 두 번째로 순서를 바꾸는 방법을 구하는 프로그램을 작성하시오. 방법의 길이는 500보다 작아야 한다. 두 채널을 제외한 나머지 채널의 순서는 상관없다.
첫째 줄에 채널의 수 N이 주어진다. (2 ≤ N ≤ 100)
다음 N개 줄에는 채널의 이름이 한 줄에 하나씩 주어진다. 채널의 이름은 최대 10글자이고, 알파벳 대문자와 숫자로만 이루어져 있다.
이미 KBS1이 첫 번째에, KBS2가 두 번째에 있는 입력은 주어지지 않는다.
상근이가 눌러야 하는 버튼을 순서대로 공백없이 출력한다.
import java.util.LinkedList;
import java.util.Scanner;
public class pr2816 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
LinkedList<String> channel = new LinkedList<>();
for(int i=0;i<N;i++) {
String channelName = sc.next();
channel.offer(channelName);
}
for(int i=0;i<channel.indexOf("KBS1");i++) {
System.out.print(1);
}
for(int i=0;i<channel.indexOf("KBS1");i++) {
System.out.print(4);
}
channel.addFirst(channel.remove(channel.indexOf("KBS1")));
for(int i=0;i<channel.indexOf("KBS2");i++)
System.out.print(1);
for(int i=0;i<channel.indexOf("KBS2")-1;i++)
System.out.print(4);
}
}
LinkedList의 구조를 이용하여 문제를 해결하였다. LinkedList는 중간 삽입, 삭제가 편하기 때문에 사용하였다.
해당 문제는 구현 문제이기 때문에 1번과 4번만을 이용하여 구현했다.
- LinkedList의
.offer()
메소드를 이용해 List에 채널 이름을 입력하였다.- KBS1 의 인덱스만큼 1과 4가 나와야해 for문을 이용해 출력하였다.
- KBS1 을 첫번째로 옮기기 위해
.addFirst()
메소드를 이용해 첫번째로 이동시켰다.- KBS2 의 인덱스만큼 1, 인덱스 -1만큼 4가 나와야해 for문을 이용해 출력하였다.