알고리즘

백준 - 달팽이(JAVA) - 1913

쿠키담임선생님 2024. 10. 28. 20:08

 

 

배열 돌리기 문제를 풀때 어떻게 해야하지 라는 고민이 생겨서 배열 돌리기 문제를 기초부터 한번 풀어보았다.

 

배열을 돌리기 위해서 생각해야 하는 부분은 끝부분 부터 작성해나가야 한다는 것이다.

 

 

 

이렇게 뒤에서부터 채워나가야 한다.

 

그리고 범위를 벗어나거나, 이미 숫자가 채워져있는 칸을 만났을때는 방향을 바꾸어주어야한다.

 

방향을 바꾸는것은 하 -> 우 -> 상 -> 좌 순서대로 바꾸기에 0~3인덱스를 가지고 있는 4칸의 배열을 생성한 이후 활용한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class 백준_달팽이2 { //오후 7시 35분
    private static int[]dx = {0, 1, 0, -1}; //하 우 상 좌
    private static int[]dy = {1, 0, -1, 0}; //하 우 상 좌
    private static int[][]arr;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        arr = new int[n][n];
        int start = n*n;
        int index = Integer.parseInt(br.readLine());
        //로직
        int nowX = 0;
        int nowY = 0;
        int d = 0; //방향을 나타냄
        int answerX = 0;
        int answerY = 0;
        while(start>0){
            arr[nowY][nowX] = start;
            if(start == index){
                answerX = nowX+1;
                answerY = nowY+1;
            }
            int nextY = nowY + dy[d];
            int nextX = nowX + dx[d];
            //못가는경우= 범위 벗어난 경우랑 이미 값이 들어있는 경우
            if(nextY<0 || nextX < 0 || nextY >= n || nextX >= n || arr[nextY][nextX]!=0){
                d = (d+1)%4;
                nextY = nowY + dy[d];
                nextX = nowX + dx[d];;
            }
            nowY = nextY;
            nowX = nextX;
            start--;
        }
        for(int i = 0; i<n; i++){
            for(int j =0 ; j<n; j++){
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println(answerY+" "+answerX);
    }
}

 

 

위 코드를 보면 이해 안가는 부분이 있을 수도 있다.

int nextY = nowY + dy[d];

int nextX = nowX + dx[d];

를 해준 부분인데.

 

바로 아래서 똑같이 구하는 부분이 있다.

 

헷갈리지 말아야 하는게, 두개의 작업은 독립적이다. 위의 칸에서 더해놓은 상태에서 아래 조건문에서 한번 더 더하는 것이아니라,

 

둘중에 하나만 조건을 타는 것이다.

 

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

백준 - 그룹단어체커(JAVA)  (0) 2024.10.30
NginX를 왜 사용하는가?  (0) 2024.10.26
백준 - 문자열 (JAVA)  (0) 2024.10.24
백준 - 이진수 (JAVA)  (0) 2024.10.23
백준 - 크면서 작은 수 (JAVA)  (1) 2024.10.23