[백준] 1022_소용돌이 예쁘게 출력하기 C++
in Study on Coding Test
오랜만에 풀어본 빡구현 문제
정답제출코드
#include <iostream>
#include <cmath>
using namespace std;
int r1, r2, c1, c2;
int map[50][5] = { 0, };
int m_max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
void Write()
{
int MAX = m_max(m_max(abs(r1), abs(c1)), m_max(abs(r2), abs(c2)));
int val = 1;
if (0 >= r1 && 0 >= c1 && 0 <= r2 && 0 <= c2)
map[0 - r1][0 - c1] = val;
int cnt = 0;
int x = 0, y = 0;
for (int i = 1; i <= MAX + 1; ++i)
{
for (int j = 1; j <= 1 + cnt * 2; ++j)
{
// 오른쪽 방향
val++;
x++;
if (y >= r1 && x >= c1 && y <= r2 && x <= c2)
map[y - r1][x - c1] = val;
}
for (int j = 1; j <= 1 + cnt * 2; ++j)
{
// 위쪽 방향
val++;
y--;
if (y >= r1 && x >= c1 && y <= r2 && x <= c2)
map[y - r1][x - c1] = val;
}
for (int j = 1; j <= 2 + cnt * 2; ++j)
{
// 왼쪽 방향
val++;
x--;
if (y >= r1 && x >= c1 && y <= r2 && x <= c2)
map[y - r1][x - c1] = val;
}
for (int j = 1; j <= 2 + cnt * 2; ++j)
{
val++;
y++;
if (y >= r1 && x >= c1 && y <= r2 && x <= c2)
map[y - r1][x - c1] = val;
}
cnt++;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> r1 >> c1 >> r2 >> c2;
Write();
int h = abs(r2 - r1);
int w = abs(c2 - c1);
int MAX = 0;
for (int i = 0; i <= h; i++)
{
for (int j = 0; j <= w; j++)
MAX = m_max(MAX, map[i][j]);
}
int max_digit = 0;
for (int i = 1; i <= MAX; i *= 10)
max_digit++;
for (int i = 0; i <= h; i++)
{
for (int j = 0; j <= w; j++)
{
int current_digit = 0;
for (int k = 1; k <= map[i][j]; k *= 10)
current_digit++;
for (int k = current_digit; k < max_digit; k++)
cout << ' ';
cout << map[i][j] << ' ';
}
cout << '\n';
}
return 0;
}
수학적 규칙을 찾고 구현을 하는 문제이다.
하지만 모두 저장한 다음에 출력을 하려고 했다는 실수를 범했다는 점과
예쁘게 출력해야 한다는 점이 아이디어가 안 떠올라서 (그리고 솔직히 당시에 조금 귀찮아서)
참고링크를 참조하여 문제를 풀었다.
정말로 다행스럽게도, 출력해야 하는 열의 수는 최대 4개, 행의 수는 49개라는 점이다.
더 많이 출력해야 했으면 구현하기 힘들었을지도 몰라..
값을 모두 map 배열에 저장해서 메모리 초과를 일으키지 말고
val 값을 계속 더해주는 과정에서 범위 안에 들어가는 것만 map에 저장을 하도록 구현하자.
그리고 출력하는 과정에서 줄 맞춤 해주는 부분도 문제다.
최대 자리수 까지 있는지(max_digit) 구하고 차이 만큼 띄어쓰기를 하면 된다.
int current_digit = 0;
for (int k = 1; k <= map[i][j]; k *= 10)
current_digit++;
for (int k = current_digit; k < max_digit; k++)
cout << ' ';
이렇게 이해하고 구현하였다.