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

 

이번에 볼 문제는 백준 2713번 문제인 규현이의 사랑을 담은 문자메시지이다.
문제는 아래 링크를 확인하자.

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

 

2713번: 규현이의 사랑을 담은 문자메시지

첫째 줄에 테스트 케이스의 개수 T가 주어진다. (1 ≤ T ≤ 1,000) 각 테스트 케이스는 한 줄로 이루어져 있고, R, 공백, C, 공백, 규현이가 보내려고 하는 메시지로 이루어져 있다. (1 ≤ R,C ≤ 21) 메시

www.acmicpc.net

주어지는 문자열을 문제가 요구하는 형태로 바꿔 출력하는 구현문제이다.

 

입력으로 주어지는 문자열은 getline을 이용해 큰 문제없이 읽을 수 있다.

 

소용돌이 패턴의 구현은 visited 배열을 이용하면 "오른쪽으로 이동할 수 있을 때까지 이동", "아래로 이동할 수 있을 때까지 이동", "왼쪽으로 이동할 수 있을 때까지 이동", "위쪽으로 이동할 수 있을 때까지 이동"을 반복하는 것으로 어렵지 않게 구현할 수 있다.

 

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

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

int T, R, C;
string s, ss;
int ans[23][23];
int visited[23][23];

void solve() {
	memset(ans, 0, sizeof(ans));
	memset(visited, 0, sizeof(visited));

	ss = "";
	cin >> R >> C;
	getline(cin, s); s = s.substr(1, s.length() - 1);
	for (int r = 0; r <= R + 1; r++) visited[r][0] = visited[r][C + 1] = 1;
	for (int c = 0; c <= C + 1; c++) visited[0][c] = visited[R + 1][c] = 1;

	for (auto& l : s) {
		int x = l - 'A' + 1;
		string tmp = "";
		for (int i = 0; i < 5; i++) {
			if (x & 1) tmp += "1";
			else tmp += "0";
			x >>= 1;
		}

		while (!tmp.empty()) {
			ss += tmp.back();
			tmp.pop_back();
		}
	}

	while (ss.length() < R * C) ss += "0";

	int r = 1, c = 0, idx = 0;
	while (idx < R * C) {
		while (!visited[r][c + 1]) {
			c++;
			visited[r][c] = 1;
			ans[r][c] = ss[idx++];
		}
		while (!visited[r + 1][c]) {
			r++;
			visited[r][c] = 1;
			ans[r][c] = ss[idx++];
		}
		while (!visited[r][c - 1]) {
			c--;
			visited[r][c] = 1;
			ans[r][c] = ss[idx++];
		}
		while (!visited[r - 1][c]) {
			r--;
			visited[r][c] = 1;
			ans[r][c] = ss[idx++];
		}
	}

	for (int rr = 1; rr <= R; rr++) {
		for (int cc = 1; cc <= C; cc++) cout << (char)(ans[rr][cc]);
	}
	cout << '\n';
}

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

	cin >> T;
	while (T--) solve();
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 6844 // C++] Keep on Truckin'  (0) 2023.11.17
[BOJ 6842 // C++] Deal or No Deal Calculator  (0) 2023.11.16
[BOJ 2718 // C++] 타일 채우기  (0) 2023.11.14
[BOJ 15311 // C++] 약 팔기  (1) 2023.11.13
[BOJ 7286 // C++] Ancient Keyboard  (1) 2023.11.12

+ Recent posts