※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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';
			}
		}
	}
}
728x90

'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

+ Recent posts