※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 3288번 문제인 BEER이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/3288
3288번: BEER
Dave is preparing his birthday party. Among other things, he brought non-alcoholic beer in bottles and put them in his refrigerator. He arranged them the following way: He put as much bottles he could in one row at bottom of the refrigerator. Then he put o
www.acmicpc.net
어떠한 맥주병을 회전시키면 그 맥주병의 위쪽에 있는 맥주병만이 회전하고 같은 행이나 아래의 맥주병은 움직이지 않음을 관찰하자. 즉, k 이하의 번호의 행의 맥주들을 올바른 방향으로 먼저 바꾸고 그 뒤로 k보다 큰 번호의 행의 맥주들만을 조작한다면 k 이하의 번호의 행들은 정렬된 상태로 맥주가 유지됨을 알 수 있다.
위와 같은 관찰을 이용해 1행부터 맥주들을 차례대로 원하는 모양대로 정렬해나가 문제를 해결하자. 아래 구현의 rotC(시계방향 회전;clockwise), rotA(반시계방향 회전;anticlockwise)와 같은 배열을 만들면 구현을 간단히 할 수 있을 것이다.
1행이란 가장 아래쪽의 N개의 맥주가 있는 행을 의미함에 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int N;
string beer[10];
char rotC[128], rotA[128];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
rotC['U'] = 'R';
rotC['R'] = 'D';
rotC['D'] = 'L';
rotC['L'] = 'U';
rotA['U'] = 'L';
rotA['R'] = 'U';
rotA['D'] = 'R';
rotA['L'] = 'D';
cin >> N;
for (int r = 0; r < N; r++) cin >> beer[r];
for (int r = N - 1; r > -1; r--) {
for (int c = 0; c <= r; c++) {
while (beer[r][c] != 'U') {
beer[r][c] = rotC[beer[r][c]];
if (r) {
if (c) beer[r - 1][c - 1] = rotA[beer[r - 1][c - 1]];
if (r >= c) beer[r - 1][c] = rotA[beer[r - 1][c]];
}
cout << N - r << ' ' << c + 1 << '\n';
}
}
}
}
'BOJ' 카테고리의 다른 글
[BOJ 3895 // C++] 그리고 하나가 남았다 (0) | 2023.09.07 |
---|---|
[BOJ 27285 // C++] L-Board (0) | 2023.09.06 |
[BOJ 3299 // C++] POWER (0) | 2023.09.04 |
[BOJ 3298 // C++] WEDDING (1) | 2023.09.03 |
[BOJ 3286 // C++] SHELVES (0) | 2023.09.02 |