승코딩당당당

[C++] 백준 2816: 디지털 티비 본문

PS/BOJ

[C++] 백준 2816: 디지털 티비

승코딩당당당 2025. 12. 29. 16:57

문제

[C++] 백준 2816: 디지털 티비 BRONZE 1
https://www.acmicpc.net/problem/2816

 


 

접근 방법

이 문제는 TV 채널 목록이 주어졌을 때,
리모컨 버튼 조작을 통해 KBS1을 0번 위치, KBS2를 1번 위치로 옮기는 문제이다.

 

또한 이 문제는 스페셜 저지(Special Judge) 문제이므로,
정답이 하나로 고정되어 있지 않고 여러가지 답이 허용된다.

 

처음에 스페셜 저지 문제가 뭔지 몰라서 모든 조작 방법을 다 고려해 구현하다 보니 시간이 많이 소요됐다....

 

그래서 가능한 버튼 중에서도 1번(아래로 이동)4번(위 채널과 교환) 만 사용해서 풀 수 있도록 구현했다.

 

방법은 시뮬레이션 방식이다.

  1. 화살표를 아래로 이동(버튼 1 출력)하면서 "KBS1"의 위치를 찾는다.
  2. 찾은 위치에서 위로 끌어올리며(버튼 4 출력 + swap) "KBS1"을 0번으로 만든다.
  3. 다시 아래로 이동하면서 "KBS2"의 위치를 찾는다.
  4. "KBS2"를 위로 끌어올려 1번 위치까지 이동시킨다.

 

구현 시 주의할 점

  • "KBS1"을 먼저 0번으로 옮긴 뒤 "KBS2"를 처리해야 흐름이 안정적이다.
  • "KBS2"는 최종적으로 1번 인덱스에 와야 하므로, 끌어올릴 때 조건은 now > 1로 둔다.

지금 코드는 while문이 다소 많은 편이라, 추후에 구조를 정리하면서 더 깔끔하게 최적화해볼 필요가 있을 것 같다.

 


 

코드

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int n;
vector<string> chennel;

void find_up()  // KBS를 찾아서 위로 올리기
{
	int now = 0;  // 현재 화살표 위치
	while (now < n)
	{
		if (chennel[now] == "KBS1")
			break;

		cout << 1;
		now++;
	}
	while (now > 0)
	{
		swap(chennel[now], chennel[now - 1]);

		cout << 4;
		now--;
	}
	while (now < n)
	{
		if (chennel[now] == "KBS2")
			break;

		cout << 1;
		now++;
	}
	while (now > 1)
	{
		swap(chennel[now], chennel[now - 1]);

		cout << 4;
		now--;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n;

	chennel.resize(n, "");
	for (int i = 0; i < n; i++)
		cin >> chennel[i];

	find_up();

	return 0;
}

'PS > BOJ' 카테고리의 다른 글

[C++] 백준 9655: 돌 게임  (0) 2025.12.30
[C++] 백준 11723: 집합  (1) 2025.12.30
[C++] 백준 1157: 단어 공부  (0) 2025.12.29
[C++] 백준 1927: 최소 힙  (0) 2025.12.29
[C++] 백준 2292: 벌집  (2) 2025.12.29