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

 

이번에 볼 문제는 백준 28285번 문제인 육각형 순회이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/28285 

 

28285번: 육각형 순회

정후는 펜타곤에서 영감을 얻어 지었다는 유명 건축가의 육각형 형태의 건축물에 방문한 뒤 이색적인 아름다움에 매료되었다. 건축물은 $3N^2-3N+1$ 개의 정육각형 방으로 이루어져 있고, 이 방들

www.acmicpc.net

주어진 육각형을 순회하는 회로는 다양하게 존재한다. 이 중 규칙적으로 생성하기 쉬운 방법을 찾아 문제를 해결하자.

 

특히, 주어지는 시작점 대신 고정된 하나의 위치(글쓴이의 경우 마지막 행 첫 번째 칸)에서 출발하는 경로 중 문제의 조건을 만족하는 것을 하나 찾고 이를 따라 주어진 칸에서 출발해 한 바퀴를 도는 경로를 출력하면 문제를 간편하게 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <deque>;
using namespace std;

int N, R, C, r, c;
deque<char> dqL, dqR;
int initX, initY;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> R >> C;
	r = N * 2 - 1, c = 1;
	if (N < 4) {
		if (N == 3) {
			dqR.push_back('Q');
			dqR.push_back('Q');
			dqR.push_back('E');
			dqR.push_back('E');
			dqR.push_back('D');
			dqR.push_back('Z');
			dqR.push_back('Z');
			dqR.push_back('C');
			dqR.push_back('E');
			dqR.push_back('C');
			dqR.push_back('E');
			dqR.push_back('Q');
			dqR.push_back('E');
			dqR.push_back('C');
			dqR.push_back('C');
			dqR.push_back('Z');
			dqR.push_back('Z');
			dqR.push_back('A');
			dqR.push_back('A');
		}
		else {
			dqR.push_back('Q');
			dqR.push_back('E');
			dqR.push_back('C');
			dqR.push_back('E');
			dqR.push_back('C');
			dqR.push_back('Z');
			dqR.push_back('A');
		}
	}
	else {
		dqL.push_front('A');
		int n = N;
		while (n > 3) {
			for (int i = 1; i < n; i++) dqR.push_back('Q');
			for (int i = 1; i < n; i++) dqR.push_back('E');
			for (int i = 2; i < n; i++) dqR.push_back('D');
			dqR.push_back('Z');
			for (int i = 3; i < n; i++) dqR.push_back('A');
			for (int i = 2; i < n; i++) dqR.push_back('Z');
			for (int i = 2; i < n; i++) dqR.push_back('C');
			dqR.push_back('E');

			for (int i = 2; i < n; i++) dqL.push_front('A');
			for (int i = 1; i < n; i++) dqL.push_front('Z');
			for (int i = 1; i < n; i++) dqL.push_front('C');
			dqL.push_front('E');
			for (int i = 2; i < n; i++) dqL.push_front('Q');
			for (int i = 2; i < n; i++) dqL.push_front('E');
			for (int i = 3; i < n; i++) dqL.push_front('D');
			dqL.push_front('Z');

			n -= 2;
		}

		if (n == 3) {
			dqR.push_back('Q');
			dqR.push_back('Q');
			dqR.push_back('E');
			dqR.push_back('E');
			dqR.push_back('D');
			dqR.push_back('Z');
			dqR.push_back('Z');
			dqR.push_back('C');
			dqR.push_back('E');
			dqR.push_back('C');
			dqR.push_back('E');
			dqR.push_back('Q');
			dqR.push_back('E');
			dqR.push_back('C');
			dqR.push_back('C');
			dqR.push_back('Z');
			dqR.push_back('Z');
			dqR.push_back('A');
		}
		else {
			dqR.push_back('Q');
			dqR.push_back('E');
			dqR.push_back('C');
			dqR.push_back('E');
			dqR.push_back('C');
			dqR.push_back('Z');
		}

		while (!dqL.empty()) {
			dqR.push_back(dqL.front());
			dqL.pop_front();
		}
	}

	while (r != R || c != C) {
		char& cur = dqR.front();
		if (cur == 'A') c--;
		else if (cur == 'D') c++;
		else if (cur == 'Q') {
			if (r <= N) c--;
			r--;
		}
		else if (cur == 'E') {
			if (r > N) c++;
			r--;
		}
		else if (cur == 'Z') {
			if (r >= N) c--;
			r++;
		}
		else {
			if (r < N) c++;
			r++;
		}

		dqR.push_back(cur);
		dqR.pop_front();
	}

	while (!dqR.empty()) {
		cout << dqR.front();
		dqR.pop_front();
	}
}
728x90

+ Recent posts