아직은 정체성이 없는 블로그

[SWEA][D2][c++] 1954. 달팽이 숫자 본문

알고리즘 역량테스트 문제/SWEA

[SWEA][D2][c++] 1954. 달팽이 숫자

coooding 2020. 7. 5. 01:05

문제

1954. 달팽이 숫자

 

문제 링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE

 

SW Expert Academy

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

swexpertacademy.com

 

풀이과정

 

1. 시계 방향의 방향을 가리키는 배열을 생성한다(아래 소스코드에서의 dx, dy).

2. 현재 위치에서 앞으로 갈 곳이 위치가 배열의 크기를 벗어나는지, 이미 숫자가 채워졌는지 확인한다.

3. 크기를 벗어났거나 이미 숫자가 채워졌다면 방향을 바꾼다.

4. 정상적이라면 현재 cnt 값을 저장하고 +1을 한 뒤 i, j (현재 위치)를 ty, tx (갈 곳)로 갱신한다.

5. 2~4위 과정을 반복하고 cnt가 마지막으로 들어갈 숫자보다 커진다면 반복문을 종료한다.

 

다른 사람들의 풀이과정을 보면 재귀로 푼 사람들도 많아짔만 이 방법이 편하다고 생각되어서 이렇게 풀었다.

 

소스코드

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

//방향
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};

int main(int argc, char** argv)
{
    int map[10][10];
	int test_case;
	int T;
	cin>>T;
	for(test_case = 1; test_case <= T; ++test_case)
	{
        memset(map,0,sizeof(map));
        int n;
        cin >> n;
        int i=0,j=0,dir=0;
        map[0][0]=1;
        int cnt=2;
        int size=n*n;
 

        while(size>=cnt){
        	//앞으로 갈 곳 위치
            int ty=i+dy[dir];
            int tx=j+dx[dir];
            
            //갈 방향이 배열의 크기를 벗어나거나
            //이미 숫자가 쓰여진 경우 방향을 바꿈
            if(ty<0 || tx<0 || ty>=n ||tx>=n || map[ty][tx]>0){
            	dir+=1;
                if(dir==4)
                    dir=0;
                continue;
            }
            map[ty][tx]=cnt;
            i=ty;
            j=tx;
            cnt++;
        }

        //출력
        cout << "#"<<test_case<<"\n";
        for(i=0; i<n; i++){
        	for(j=0; j<n; j++){
            	cout<<map[i][j]<<" ";
            }
            cout<<"\n";
        }
      
	}
	return 0;
}

 

Comments