일반

[코드트리 챌린지] 빙빙 돌며 숫자 사각형 채우기

wwns 2023. 9. 18. 19:47
반응형

코드트리 블로그 챌린지 2주차 인증입니다

 

저는 기업별 커리큘럼을 신청하였고 오늘은 삼성 커리큘럼을 풀어 보았습니다

빙빙 돌며 숫자 사각형 채우기 문제를 리뷰해보고자 합니다

 

https://www.codetree.ai/cote/13/problems/snail-number-square/submissions

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 


풀이방법

  • n x m의 배열에서 오른쪽 -> 아래 -> 왼쪽 -> 위쪽 방향으로 돌면서 숫자를 채운다
  • 이미 방문한 위치 혹은 범위를 벗어나면 방향을 바꾼다
  • 반복횟수는 n*m번이므로 범위를 벗어날 때 방향만 바꾸면 된다
import java.io.*;
import java.util.*;

public class Main {
    public static int[][] direction = {{0,1}, {1,0}, {0,-1}, {-1,0}};
    public static int n, m;
    public static void main(String[] args) throws IOException {
        // 여기에 코드를 작성해주세요.
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        int[][] answer = new int[n][m];
        int x = 0, y = 0, dir = 0;
        answer[x][y] = 1;
        for (int i=2; i<=n*m; i++) {
            int nx = x + direction[dir][0], ny = y + direction[dir][1];
            if(!inRange(nx, ny) || answer[nx][ny] != 0) dir = (dir + 1) % direction.length;
            
            x += direction[dir][0];
            y += direction[dir][1];
            answer[x][y] = i;
        }

        StringBuilder sb = new StringBuilder();
        
        for(int i=0; i<n; i++) {
            for(int j=0; j<m; j++) {
                sb.append(answer[i][j]).append(" ");
            }
            sb.append("\n");
        }

        System.out.print(sb);
        br.close();
    }

    public static boolean inRange(int x, int y) {
        return x<0 || x>=n || y<0 || y>=m ? false : true;
    }
}
반응형