티스토리 뷰

알고리즘

백준 - 달팽이

koyuchang 2021. 4. 5. 02:15

문제 출처:www.acmicpc.net/problem/1913

 

1913번: 달팽이

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

www.acmicpc.net

 

아래와 같은 모양을 구현하기 위해 규칙성을 찾아보기로 하였다. 

 

1. 우선 상 후 하 좌 로 이동.

2. 1칸 채우고 방향 이동 -> 1칸 채우고 방향 이동 -> 2칸 채우고 방향이동 -> 2칸 채우고 방향이동 -> 3칸 채우고 방향이동... 이런식으로 채우는 칸수가 증가

 

규칙을 찾고 의사코드를 만들어보니, 아래와 같이 나오게 되었다.

for(N번)                                                                               ->1

     if(N번째 이전까지)                                                       ->2

           for(가장 외곽의 for문의 인덱스만큼 실행)       ->3

     else(N번쨰)                                                                  ->4

           for(N-1만큼 실행)                                                  ->5

 

3번을 실행하면서 좌표에 값을 넣어주고 현재 좌표값(행, 열)을 갱신한다. 그리고 해당 좌표가 구할려는 값이면 해당 좌표값을 저장한다.

 

 

마지막은 N-1번 만큼 숫자를 증가하면서 같은 방향으로 입력해주면 된다.

 

 

 

전체코드는 아래와 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class B1913_달팽이 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int K = Integer.parseInt(br.readLine());
        int map[][] = new int[N][N];
        int r = N / 2;
        int c = r;

        int dr[] = {-1, 0, 1, 0};
        int dc[] = {0, 1, 0, -1};
        int idx = 1;
        int x = 0;
        int y = 0;
        map[r][c] = idx++;
        int k = 0;//숫자가 넣어지는 방향
        //outer for문은 N번 실행
        for (int i = 1; i <= N; i++) {
            if (i < N) {
                for (int m = 0; m < 2; m++) { //매 idx마다 두번씩 돈다.
                    for (int j = 0; j < i; j++) { //i칸만큼만 이동
                        r = r + dr[k];
                        c = c + dc[k];
                        map[r][c] = idx++;
                        if (map[r][c] == K) {
                            x = r + 1;
                            y = c + 1;
                        }
                    }
                    k++;
                    if (k == 4)
                        k = 0;
                }
            } else {
                for (int j = 0; j < N - 1; j++) {
                    r = r + dr[k];
                    c = c + dc[k];
                    map[r][c] = idx++;
                    if (map[r][c] == K) {
                        x = r + 1;
                        y = c + 1;
                    }
                }
            }
        }
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println(x + " " + y);
    }
}

'알고리즘' 카테고리의 다른 글

백준 - 늑대와 양  (0) 2021.04.09
백준 - 소가 길을 건너간 이유1  (0) 2021.04.06
백준 - 암호 만들기  (0) 2021.03.26
백준 - 외판원 순회2  (0) 2021.03.14
백준 - 동전0  (0) 2021.02.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함