-
JUNGOL 실력키우기 도형만들기2 - 대각선 지그재그 | 문자마름모보관함 2020. 1. 24. 10:48
기초 다지기에서 배운 내용을 응용하여 문제를 해결해야 하는 실력 키우기입니다.
실력 키우기는 비슷한 문제 유형별로 묶어서 풀어보겠습니다.
이번 포스팅에서는 도형만들기2의 대각선 시리즈를 풀어보겠습니다.
1495 : 대각선 지그재그
이 문제도 방향별로 나눠서 생각하면 된다는 점에서 달팽이 시리즈와 기본적으로는 같은 구조를 가지고 있다고 볼 수 있습니다. 다만 이 문제는 방향이 두가지인 대신 다음으로 넘어가는 부분에서 분기가 발생하는 점이 다릅니다.
방향은 좌하단, 우상단으로 두가지이고 각각 값을 바꿔줘야 하는 경우는 x가 범위를 넘어갔을 때, y가 범위를 넘어갔을 때를 각각 생각해 줘야 합니다.
#include <iostream> using namespace std; void MoveLeftDown(int n); void MoveRightUp(int n); enum Direction { LD, RU }; Direction dir{ Direction::LD }; int arr[101][101]; int x{ 0 }, y{ 0 }; int num{ 1 }; int main(void) { int n; cin >> n; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { arr[i][j] = -1; } } while (true) { if (dir == Direction::LD) { MoveLeftDown(n); } else { MoveRightUp(n); } if (num > n* n) break; } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cout << arr[i][j] << ' '; } cout << endl; } } void MoveLeftDown(int n) { if (y < n && x >= 0) { arr[y++][x--] = num++; } if (y >= n) { y--; x += 2; dir = Direction::RU; } else if (x < 0) { x++; dir = Direction::RU; } } void MoveRightUp(int n) { if (x < n && y >= 0) { arr[y--][x++] = num++; } if (x >= n) { x--; y += 2; dir = Direction::LD; } else if (y < 0) { y++; dir = Direction::LD; } }
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=767&sca=2020
1331 : 문자마름모
이 문제엔 주의할 점이 몇 가지 존재합니다.
1. 좌측 상단으로 이동한 뒤 다음 시작은 왼쪽으로 한 칸 이동해야 한다.
2. 입력은 한 변의 길이이며 중앙의 길이(가장 긴 길이)는 2 * n - 1 이다.
먼저 첫 번째 주의점은 문제의 그림에서 드러나는데 그림을 다시 살펴보면 다음과 같습니다.
바로 중앙에 가로로 이동하는 부분이 존재한다는 것입니다. 단순하게 다음 위치를 재 지정하지 않고 바로 좌하단으로 이동하면 안된다는 것을 유의해야 합니다.
두 번째 주의점은 시작점을 찾기 위해 알야아 하는 것 입니다. 반복적으로 설명하지 않고 넘어가겠습니다.
#include <iostream> using namespace std; void MoveLeftDown(); void MoveRightDown(); void MoveRightUp(); void MoveLeftUp(); void AdjustChar(); void PrintSquare(); enum Direction { LD, RD, RU, LU }; Direction dir{ Direction::LD }; char arr[201][201]{}; int n{}, total{}; int x{}, y{}; char c{ 'A' }; int routine{}; int main(void) { cin >> n; total = (2 * n - 1); int center = x = total / 2; for (int i = 0; i < total; ++i) { for (int j = 0; j < total; ++j) { arr[i][j] = ' '; } } while (true) { switch (dir) { case LD: MoveLeftDown(); break; case RD: MoveRightDown(); break; case RU: MoveRightUp(); break; case LU: MoveLeftUp(); break; } AdjustChar(); if(arr[center][center] != ' ') break; } PrintSquare(); } void MoveLeftDown() { if (x >= routine) { arr[y++][x--] = c++; } if (x < routine) { x += 2; dir = Direction::RD; } } void MoveRightDown() { if (y < total - routine) { arr[y++][x++] = c++; } if (y >= total - routine) { y -= 2; dir = Direction::RU; } } void MoveRightUp() { if (x < total - routine) { arr[y--][x++] = c++; } if (x >= total - routine) { x -= 2; routine++; dir = Direction::LU; } } void MoveLeftUp() { if (y >= routine) { arr[y--][x--] = c++; } if (y < routine) { y++; dir = Direction::LD; } } void AdjustChar() { if (c > 'Z') { c = 'A'; } } void PrintSquare() { for (int i = 0; i < total; ++i) { for (int j = 0; j < total; ++j) { cout << arr[i][j] << ' '; } cout << endl; } }
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2073&sca=2020