본문 바로가기
일반

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

by wwns 2023. 9. 18.
반응형

코드트리 블로그 챌린지 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;
    }
}
반응형