Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Design Pattern
- 프로그래머스
- 디자인패턴
- 재밌게 할래요
- 점프 점프
- d4
- Initiative Q
- SWEA
- Meta Quest3
- 논블록
- spring
- SOLID
- 리퍼럴
- 알고리즘
- 블록
- 자료구조
- 어싱크
- 메타퀘스트3
- 백준
- Java
- 이니셔티브 q
- 삼성 SW 역량 테스트 기출 문제
- 레퍼럴
- 10505
- D3
- D2
- 11060
- BOJ
- C++
- level2
Archives
- Today
- Total
아직은 정체성이 없는 블로그
[SWEA][D2][c++] 1954. 달팽이 숫자 본문
문제
1954. 달팽이 숫자
문제 링크
풀이과정
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;
}
'알고리즘 역량테스트 문제 > SWEA' 카테고리의 다른 글
[SWEA][D4][c++] 1249. [S/W 문제해결 응용] 4일차 - 보급로 (4) | 2020.07.08 |
---|---|
[SWEA][D4][c++] 3752. 가능한 시험 점수 (0) | 2020.07.08 |
[SWEA][D2][c++] 1961. 숫자 배열 회전 (0) | 2020.07.04 |
[SWEA][D2][c++] 1966. 숫자를 정렬하자 (0) | 2020.07.04 |
[SWEA][D2][c++] 1970. 쉬운 거스름돈 (0) | 2020.07.04 |
Comments