-
JUNGOL...50일지 2021. 3. 17. 15:22
Beginner_Coder/도형만들기2/대각선 지그재그
문제
정사각형의 크기를 입력 받은 후 대각선으로 지그재그 형태인 다음과 같은 형태로 출력하는 프로그램을 작성하시오.
< 처리조건>
(1) 가장 왼쪽 위의 좌표부터 차례로 숫자를 대입시킨다.
(2) 대각선을 기준으로 계속 지그재그 모양으로 채워져야 하며 숫자는 1씩 증가하는 형태로 채워나가야 한다.
입력 형식
정사각형의 크기 n(1부터 100사이의 정수)을 입력받는다.
출력 형식
위에서 언급한 형태의 지그재그 모양의 정사각형의 내부 숫자를 차례로 채운 후의 모습을 출력한다.
숫자 사이는 공백으로 구분한다.
입력 예
3 | 2
출력 예
1 3 4 | 1 3
2 5 8 | 2 4
6 7 9 |Hint!
<생각하기>
이동 순서를 잘 생각해보면 다음과 같이 6가지 형태가 반복된다.
1) 아래로 한 번 이동 (불가능하면 오른쪽으로)
2) 오른쪽 위로 가능한 만큼 이동 (가장 위나 가장 오른쪽에 도달하면 종료)
3) 오른쪽으로 한 번 이동 (불가능하면 아래로)
4) 왼쪽 아래로 가능한 만큼 이동 (가장 왼쪽이나 가장 아래쪽에 도달하면 종료)
위 조건에 따라 4가지 작업을 반복해도 되고
바깥부분을 1로 채우고 0인 곳만 채워나가는 방법,
이동 횟수를 계산해서 구현하는 방법 등 다양하게 생각해 볼 수 있다.
DiagonalZigZag.h
#include <iostream>
DiagonalZigZag.cpp
void DiagonalZigZag::Code() { int n; std::cin >> n; int** arr = new int*[n]; for (int i = 0; i < n; i++) { arr[i] = new int[n]; std::fill_n(arr[i], n, 0); } int num{ 1 }; int i{ 0 }, j{ 0 }; while (num <= n * n) { while (true) { if (arr[i][j] != 0) { break; } arr[i++][j--] = num++; if (i >= n) { i -= 1; j += 2; break; } else if (j < 0) { j += 1; break; } } while (true) { if (arr[i][j] != 0) { break; } arr[i--][j++] = num++; if (j >= n) { i += 2; j -= 1; break; } else if (i < 0) { i+= 1; break; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { std::cout << arr[i][j] << ' '; } std::cout << '\n'; } for (int i = 0; i < n; i++) { delete[] arr[i]; } delete[] arr; }
NadanKim/CodingTest_JUNGOL: JUNGOL 코딩 테스트를 위한 저장소 (github.com)