문제
설명
D2문제였지만 난이도가 그것 치고는 꽤 높은 문제였습니다.
패턴의 규칙을 찾아 아이디어로 삼는 것이 중요했는데, 저는 아래쪽, 위쪽으로 갈 경우에는 그 전보다 방문하는 칸의 수가 하나씩 줄어든다는 규칙을 사용했습니다.
또, 루프를 한번 돌 때마다 방향을 1과 -1로 번갈아 설정되게 하여 오른쪽, 아래쪽(각각 y만 증가, x만 증가하므로 dir=1) 또는 왼쪽, 위쪽(각각 y만 감소, x만 감소하므로 dir=-1) 으로 가는 경우를 계산했습니다.
그렇게 반복해서 수를 채워 나가다가, 방문해야 하는 칸의 수가 점점 줄어들어 0이 되면 칸을 다 채웠다는 의미이므로 반복문을 빠져 나와서 결과를 출력했습니다.
코드
import java.util.Scanner;
public class SWEA1954_snail {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt(); //테케 수
for(int tc=1; tc<=T; tc++) {
int n = sc.nextInt();
int[][] snail = new int[n][n];
//우 하 좌 상 순으로 감
int x=0, y=-1; //들어가기 전 배열 바깥에 있음
int dir=1; //우, 하 : 1(y증가 or x증가) / 좌, 상 : -1 (y감소 or x감소)
int cnt=1;
while(true) {
for(int i=0; i<n; i++) { //오른쪽, 왼쪽
y = y+dir;
snail[x][y] = cnt++;
}
//아래, 위로 갈때 가는 칸 숫자가 하나씩 줄어듦
n--;
if(n==0) break; //종료 조건
for(int i=0; i<n; i++) { //아래, 위쪽
x= x+dir;
snail[x][y]=cnt++;
}
//방향 전환 (오 -> 왼, 아래 -> 위)
dir = dir*-1;
}
System.out.println("#"+tc);
for(int i=0; i<snail.length; i++) {
for(int j=0; j<snail.length; j++) {
System.out.print(snail[i][j]+" ");
}
System.out.println();
}
}
}
}
'알고리즘 문제풀이 > SWEA(SW Expert Academy)' 카테고리의 다른 글
[SWEA][JAVA] 1861 - 정사각형 방 (0) | 2021.09.05 |
---|---|
[SWEA][JAVA] 1210 - Ladder1 (0) | 2021.09.03 |
[SWEA][JAVA] 1233 - 사칙연산 유효성 검사 (0) | 2021.08.23 |
[SWEA][JAVA] 1225 - 암호 생성기 (0) | 2021.08.22 |
[SWEA][JAVA]1218 - 괄호 짝짓기 (0) | 2021.08.21 |