코테/백준

[백준/JAVA] 1913번: 달팽이

imname1am 2023. 12. 13. 16:32
반응형

🔺 문제

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

 

 

🧩  해결 아이디어

• 구현 (dx/dy technique)

  • (0,0)에서 시작해 바깥쪽에서 안쪽으로 돌며 격자를 돌며 칸을 채운다.
  • 이미 방문한 칸이거나 격자 범위를 벗어난 칸인 경우, 아래 → 오른쪽 → 위쪽 → 왼쪽 순으로 방향 전환하게 했다

 

 

💥 유의사항

  • ArrayIndexOutOfBoundsException 주의,,
  • 코드 앞뒤나 위아래 작성 순서에 따라 틀릴 수 있어서 순서를 잘 생각해야 함,,

 

🔺 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.util.*;
import java.io.*;
 
public class Main {
    static int[] dx = {10-10};   // 회전 순서 : 아래쪽 (0) → 오른쪽 (1) → 위쪽 (2) → 왼쪽 (3)
    static int[] dy = {010-1};
    
    static int N, findNum;
    static int[][] map;
    
    static int[] pos = {00};      // 현재 좌표 위치
    static int[] ans = new int[2];  // 찾는 번호 좌표
    static int dir = 0;             // 방향 : 아래쪽(0)부터 시작
    
    static StringBuilder sb = new StringBuilder();
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        N = Integer.parseInt(br.readLine());
        findNum = Integer.parseInt(br.readLine());
        
        map = new int[N][N];
        
        // 1. 달팽이 채우기
        fillSnail();
        
        // 2. 출력하기
        printSnail();
        sb.append(ans[0+ " " + ans[1]);
        
        System.out.println(sb);
    }
    
    // 회전하면서 달팽이 채우는 메소드
    private static void fillSnail() {
        map[0][0= N * N;  // 초기값 설정
        
        for(int i = N * N - 1 ; i >= 1 ; i--) {
            int nx = pos[0+ dx[dir];
            int ny = pos[1+ dy[dir];
            
            // 격자 벗어나거나 방문한 칸인 경우, 방향 전환
            if(!inRange(nx, ny) || (map[nx][ny] != 0)) {
                dir = (dir + 1) % 4;
            }
            
            // 다음 위치로 이동하고, 칸에 올바른 값 채워넣기
            pos[0+= dx[dir];
            pos[1+= dy[dir];
            
            map[pos[0]][pos[1]] = i;
        }        
    }
    
    // 격자 벗어나는지 판별용 메소드
    private static boolean inRange(int x, int y) {
        return (0 <= x && x < N && 0 <= y && y < N);
    }
    
    // 달팽이 출력 메소드
    private static void printSnail() {
        for(int i = 0 ; i < N ; i++) {
            for(int j = 0 ; j < N ; j++) {
                sb.append(map[i][j] + " ");
                
                // 찾는 번호를 발견했다면, 해당 위치 값 저장
                if(map[i][j] == findNum) {
                    ans = new int[]{i + 1, j + 1};
                }
            }
            sb.append("\n");
        }
        
        return;
    }
}
 
cs


🔺 다른 풀이들

- 안쪽에서 바깥쪽으로 푸는 풀이도.. 그리고 다들 while문 많이 사용하심

 

[BOJ] 백준 1913번 달팽이 (Java)

#1913 달팽이 난이도 : 실버 5 유형 : 구현 1913번: 달팽이 N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받

loosie.tistory.com

 

 

[백준] 1913: 달팽이 (Java)

BOJ 1913: 달팽이 https://www.acmicpc.net/problem/1913(0, 0)의 위치에 N X N 값을 넣고 시작한다.문제에 나와있는 조건대로 수를 1씩 줄여나가며 끝까지 넣어준다.반시계 방향으로 바깥 쪽에서부터 안 쪽으로

velog.io


💬 느낀 점

오랜만에 달팽이 문제 풀려니 까먹음...

복습만이 살 길이다,,

 

1회독 2회독 3회독 4회독 5회독
V 12.22      

 

 

(+ 12.22 2회독)

코드 확인하기
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import java.util.*;
import java.io.*;
 
public class Main {
    static int[] dx = {10-10};   // 아래 오른쪽 위쪽 왼쪽
    static int[] dy = {010-1};
    
    static int N, findNum;
    static int[][] map;
    
    static StringBuilder sb = new StringBuilder();
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        
        findNum = Integer.parseInt(br.readLine());
        
        map = new int[N][N];
        map[0][0= N * N;
        
        int dir = 0;
        
        int x = 0;
        int y = 0;
        
        for(int i = N * N - 1 ; i >= 1 ; i--) {
            int nx = x + dx[dir];
            int ny = y + dy[dir];
            
            if(!inRange(nx, ny) || map[nx][ny] != 0) {
                dir = (dir + 1) % 4;
            }
            
            x = x + dx[dir];
            y = y + dy[dir];
            map[x][y] = i;
            
        }
        
        int[] pos = new int[2];
        
        for(int i = 0 ; i < N ; i++) {
            for(int j = 0 ; j < N ; j++) {
                sb.append(map[i][j] + " ");
                
                if(map[i][j] == findNum) {
                    pos[0= i + 1;
                    pos[1= j + 1;
                }                
            }
            sb.append("\n");
        }
        
        sb.append(pos[0+ " " + pos[1]);
        System.out.println(sb);
    }
    
    private static boolean inRange(int x, int y) {
        return (0 <= x && x < N && 0 <= y && y < N);
    }
}
 
cs


(참고)

 

[코드트리/NOVICE MID] 빙빙 돌며 숫자 사각형 채우기 (JAVA)

🔺 문제 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

bono039.tistory.com

 

반응형