728x90
문제
달팽이는 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
풀이
참고
import java.util.*;
class Solution
{
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T;
T=sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++)
{
int n = sc.nextInt();
int[][] arr = makeArr(n);
System.out.println("#" + test_case);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
private static int[][] makeArr(int n) {
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
int[][] arr = new int[n][n];
int dir = 0;
int x = 0;
int y = 0;
for (int i = 1; i <= n * n; i++) {
arr[x][y] = i;
if (x + dx[dir] >= n || y + dy[dir] >= n
|| x + dx[dir] < 0 || y + dy[dir] < 0
|| arr[x + dx[dir]][y + dy[dir]] != 0 ) {
dir = (dir + 1) % 4;
}
x += dx[dir];
y += dy[dir];
}
return arr;
}
}
- dx와 dy로 방향 설정 (우,하,좌,상 순서)
- dir : 방향 인덱스 (예를 들어 0이면 dx[0], dy[0]인 우측 방향을 뜻함)
- x, y : 현재 인덱스로 사용
- for문 순회 (1부터 n * n까지)
- arr[x][y]에 i 값 저장
- 조건 : 배열이 범위에서 벗어나거나, 이미 숫자가 존재한다면 dir를 다음으로 바꿔줌
- 주의할 점 : 범위 먼저 판단하고 숫자 존재 여부를 판단해야 함
- 순서가 바뀌면, 범위를 벗어난 곳이더라도 숫자 존재 여부를 판단하니 RuntimeException 발생
- x와 y 업데이트
- 시간복잡도 : O(N^2) (이 때 N은 입력받은 숫자의 크기)
프로그래머스인지, 백준인지 모르겠지만 분명 풀었던 문젠데 ㅎ... 기억이 하나도 나지 않는다.
'JAVA > Coding Test Study' 카테고리의 다른 글
[D2] SWEA - 2001. 파리퇴치 : Java (0) | 2024.11.14 |
---|---|
[D2] SWEA - 1204. [S/W 문제해결 기본] 1일차 - 최빈수 구하기 : Java (0) | 2024.10.25 |
[D2] SWEA - 1859. 백만 장자 프로젝트 : Java (1) | 2024.10.25 |
[Easy] LeetCode - no.530 Minimum Absolute Difference in BST : Java (1) | 2024.10.25 |
[Easy] LeetCode - no.637 Average of Levels in Binary Tree : Java (0) | 2024.10.25 |