ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA 1954] 달팽이 숫자
    C 프로그래밍/SWEA 2022. 8. 18. 00:57
    728x90

    https://swexpertacademy.com/main/solvingProblem/solvingProblem.do

     

    SW Expert Academy

    SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

    swexpertacademy.com

    #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

    댓글

Designed by Tistory.