-
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
JUNGOL | 대각선 지그재그 > 문제은행
정사각형의 크기를 입력 받은 후 대각선으로 지그재그 형태인 다음과 같은 형태로 출력하는 프로그램을 작성하시오. < 처리조건 > (1) 가장 왼쪽 위의 좌표부터 차례로 숫자를 대입시킨다. (2) 대각선을 기준으로 계속 지그재그 모양으로 채워져야 하며 숫자는 1씩 증가하는 형태로 채워나가야 한다. 정사각형의 크기 n(1부터 100사이의 정수)을 입력받는다. 위에서 언급한 형태의 지그재그 모양의 정사각형의 내부 숫자를 차례로 채운 후의 모습을 출력한다. 숫자
www.jungol.co.kr
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
JUNGOL | 문자마름모 > 문제은행
마름모의 한 변의 길이 N을 입력받아 아래와 같이 문자마름모를 출력하는 프로그램을 작성하시오. < 처리조건 > (1) 첫 번째 행의 중앙부터 출발하여 시계 반대방향으로 'A'부터 차례대로 채워나간다. ('Z'다음에는 다시 'A'가 된다.) (2) 바깥 부분이 다 채워지면 두 번째 행 중앙부터 다시 같은 작업을 반복한다. (3) 같은 방법으로 마름모를 다 채워지도록 하여 출력한다. 마름모의 한변의 길이 N(N의 범위는 100 이하의 양의 정수)을 입력받는다
www.jungol.co.kr