Notice
Recent Posts
Recent Comments
Link
승코딩당당당
[C++] 백준 2816: 디지털 티비 본문
문제
[C++] 백준 2816: 디지털 티비 BRONZE 1
https://www.acmicpc.net/problem/2816

접근 방법
이 문제는 TV 채널 목록이 주어졌을 때,
리모컨 버튼 조작을 통해 KBS1을 0번 위치, KBS2를 1번 위치로 옮기는 문제이다.
또한 이 문제는 스페셜 저지(Special Judge) 문제이므로,
정답이 하나로 고정되어 있지 않고 여러가지 답이 허용된다.
처음에 스페셜 저지 문제가 뭔지 몰라서 모든 조작 방법을 다 고려해 구현하다 보니 시간이 많이 소요됐다....
그래서 가능한 버튼 중에서도 1번(아래로 이동) 과 4번(위 채널과 교환) 만 사용해서 풀 수 있도록 구현했다.
방법은 시뮬레이션 방식이다.
- 화살표를 아래로 이동(버튼 1 출력)하면서 "KBS1"의 위치를 찾는다.
- 찾은 위치에서 위로 끌어올리며(버튼 4 출력 + swap) "KBS1"을 0번으로 만든다.
- 다시 아래로 이동하면서 "KBS2"의 위치를 찾는다.
- "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 |