본문 바로가기
C++ 알고리즘

SWEA D2 1954 달팽이 숫자

by hoshi03 2024. 10. 10.

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=&orderBy=INQUERY_COUNT&selectCodeLang=JAVA&select-1=2&pageSize=10&pageIndex=1&&&&&&&&&&

 

SW Expert Academy

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

swexpertacademy.com

 

달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.


[예제]

N이 3일 경우,
 


N이 4일 경우,
 

[제약사항]

달팽이의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)


[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스에는 N이 주어진다.


[출력]

각 줄은 '#t'로 시작하고, 다음 줄부터 빈칸을 사이에 두고 달팽이 숫자를 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
입력2    
3   
4             
 
 
출력#1
1 2 3
8 9 4
7 6 5
#2
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
 

 

• 풀이

 

빡구현 문제 같아서 우하좌상 순서로  벽에 닿을때(n과 같거나 0보다 작아지는 시점)까지 진행하고

벽에 닿으면 한칸 밀어넣어준 다음에 다음 방향으로 진행하는 방식으로 구현했다

 

첨엔 밀어넣어주는거를 생각 못해서 무한루프를 돌다 디버그 된거 보고 확인했다.. 

싸피 테스트때는 디버깅이 되는지를 몰라서 잘 생각해보자

 

#include <iostream>
#include <vector>
using namespace std;


int main () {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;
    cin >> n;

    for(int current = 1; current <= n; current++){
        int tmp;
        cin >> tmp;

        vector<vector<int>> arr(tmp,vector<int>(tmp,0));
        arr[0][0] = 1;

        // y 앞 x 뒤

        int cnt = 2;
        int dy = 0;
        int dx = 0;
        int dir = 0;
        // n*n을 다 채울때까지
        while(cnt <= tmp*tmp){

            // 우
            if (dir == 0){
                dx++;
            }
            // 하
            else if( dir == 1){
               dy++;
            }
            // 좌
            else if( dir == 2){
                dx--;
            }
            // 상
            else if( dir == 3){
                dy--;
            }

            // 범위 벗어가나거 갚 덮어씌우지 않는지
            if(dy >= 0 && dy < tmp && dx >= 0 && dx < tmp && arr[dy][dx] == 0){
                arr[dy][dx] = cnt++;
            }

            else{
                //범위 조절
                if(dir == 0)      dx--;  // 우
                else if( dir == 1) dy--;  // 하
                else if( dir == 2) dx++;  // 좌
                else if( dir == 3) dy++;  // 상

                dir++;
                dir %= 4;
            }
        }

        // 달팽이 출력
        cout << "#" << current <<'\n';
        for(int i = 0; i < tmp; i++){
            for(int j = 0; j < tmp; j++){
                cout << arr[i][j] << " ";
            }
            cout << '\n';
        }
    }
}

 

'C++ 알고리즘' 카테고리의 다른 글

SWEA D2 2005 파스칼의 삼각형  (0) 2024.10.11
SWEA D2 1926 간단한 369  (0) 2024.10.10
프로그래머스 폰켓몬(해쉬)  (1) 2024.09.30
백준 2910 빈도정렬(map, vector)  (1) 2024.09.29
백준 1992 쿼드트리(재귀)  (0) 2024.09.29