본문 바로가기
PS/코드트리

[코드트리 챌린지] 1주차 - 빙빙 돌며 숫자 사각형 채우기(Python, Java)

by 행복한라이언 2023. 9. 7.
728x90
반응형

문제링크

https://www.codetree.ai/cote/13/problems/snail-number-square?&utm_source=clipboard&utm_medium=text 

 

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

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

www.codetree.ai

핵심

 

코드

n, m = map(int,input().split())
board = [[0 for _ in range(m)]for _ in range(n)]
# 동남서북
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
# 초기값 설정
cr, cc = 0, 0
cur_dir = 0
board[cr][cc] = 1

def in_range(r, c):
    return 0 <= r < n and 0 <= c < m

for num in range(2, n * m + 1):
    nr = cr + dr[cur_dir]
    nc = cc + dc[cur_dir]

    if not in_range(nr, nc) or board[nr][nc] != 0: 
        cur_dir = (cur_dir + 1) % 4
        nr = cr + dr[cur_dir]
        nc = cc + dc[cur_dir]

    board[nr][nc] = num

    cr, cc = nr, nc

for row in board:
    print(*row)

import java.io.*;
import java.util.*;

public class Main {
    // 변수선언
    private static final int MAX_N = 100, MAX_M = 100;
    private static int curDir = 0;
    private static int n, m;
    private static int cr = 0, cc = 0;
    // 정적 배열 생성
    private static int[][] board = new int[MAX_N][MAX_M];
    // 동남서북
    private static int[] dr = new int[]{0, 1, 0, -1};
    private static int[] dc = new int[]{1, 0, -1, 0};
    // 격자 내 범위 체크
    private static boolean inRange(int cr, int cc){
        return 0 <= cr && cr < n && 0 <= cc && cc < 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());
        // 초기값 - main에서 실행해야함.
        board[cr][cc] = 1;
        for(int i = 2; i < n * m + 1; i++){
            int nr = cr + dr[curDir];
            int nc = cc + dc[curDir];

            if(!inRange(nr, nc) || board[nr][nc] != 0){
                curDir =(curDir + 1) % 4;
                nr = cr + dr[curDir];
                nc = cc + dc[curDir];
            }
            board[nr][nc] = i;
            // 마지막 좌표가 바뀜
            cr = nr;
            cc = nc;
        }
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                System.out.print(board[i][j] + " ");
            }
            System.out.println();
        }
    }
}
728x90
반응형