-
[SWEA 1954] 달팽이 숫자C 프로그래밍/SWEA 2022. 8. 18. 00:57728x90
https://swexpertacademy.com/main/solvingProblem/solvingProblem.do
#include <stdio.h> int T; //테케수 int N; //달팽이 크기 int board[10 + 2][10 + 2]; int dir_x[4] = { 0, 1, 0, -1 }; //달팽이 방향 따라 //rdlu int dir_y[4] = { 1, 0, -1, 0 }; void get_snail(int N) { int num = 1; int i = 0; int j = 0; int p = 0; for (;;) { if (num > N * N) break; board[i][j] = num; int ni = i + dir_x[p]; int nj = j + dir_y[p]; if (ni < 0 || ni > N - 1 || nj < 0 || nj > N - 1 || board[ni][nj] != 0) { p = (p + 1) % 4; ni = i + dir_x[p]; nj = j + dir_y[p]; } i = ni; j = nj; num++; } } void get_output(int n, int N) { printf("#%d\n", n + 1); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%d ", board[i][j]); board[i][j] = 0; //다음 테케를 위한 초기화 ㅋㅋㅋ } printf("\n"); } } int main(void) { scanf("%d", &T); for (int i = 0; i < T; i++) { scanf("%d", &N); get_snail(N); get_output(i, N); } return 0; }
아니 매번 백준만 풀다가 역테때문에 swea 처음 써봤는데... 이사이트 왜이렇게 무서움... ?
제출 횟수 제한되어 있는거 실화... ? ㄷ ㄷ ㄷ ㄷ ㄷ
아무튼 달팽이 숫자 문제를 풀어봤다.
일단 테케를 여러개 입력받아야 하므로, 그냥 main 함수에서 루프 돌려서 N을 계속 받아줬다.
get_snail(N); 함수로 초기화된 board에 숫자를 채우고, get_output(i, N)함수를 통해 board 출력 및 다음 테케를 위한 초기화를 진행했다.
//get_snail(N) 함수
num은 1부터 입력받은 N의 제곱수까지 커진다. 따라서 num이 N * N보다 커지면 루프를 빠져나온다.
board의 (0, 0)부터 num을 채워주는데, ni 와 nj는 다음 좌표를 뜻한다. 좌표의 이동은 dir_x와 dir_y의 방향벡터를 통해 구현했다. p = 0일 때 부터 3이 될 때 까지 (dir_x[p], dir_y[p])는 우 / 하 / 좌 / 상 이다. 이 순서는 달팽이 모양으로 board를 채우기 기 위함이다.
그런데 만약 다음 좌표가 board의 크기를 벗어나거나, 이미 숫자가 적힌 좌표라면 p의 값을 변경하여 방향을 바꾸도록 해줬다. 여기서 p += 1이 아니라 p = (p + 1) % 4를 해준 이유는 만들어 놓은 4개의 방향을 벗어나지 않도록 하기 위함이다.
마지막으로 좌표를 전진하기 위해 i = ni; j = nj;를 해줬다.
//get_output 함수
보이는 바와 같고, 해당 좌표의 값을 인쇄한 후 굳이 board[i][j] = 0; 이렇게 초기화 해준 이유는 다음 테케때 깨끗한 보드에 달팽이 숫자를 입력하기 위함이다.
이 과정을 해주지 않으면 쓰레기 같이 입력된다.728x90'C 프로그래밍 > SWEA' 카테고리의 다른 글
[SWEA 6808] 규영이와 인영이의 카드게임 (0) 2022.11.04 [SWEA 5653] 줄기세포 배양 (0) 2022.10.15 [SWEA 2112] 보호 필름 (0) 2022.10.12 [SWEA 1953] 탈주범 검거 (0) 2022.10.11 [SWEA 5650] 핀볼 게임 (0) 2022.10.05