알고리즘 역량테스트 문제/SWEA
[SWEA][D2][c++] 1954. 달팽이 숫자
coooding
2020. 7. 5. 01:05
문제
1954. 달팽이 숫자
문제 링크
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;
}