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

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

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

문제링크

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

 

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

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

www.codetree.ai

 

핵심 

1.  시계방향에 따라 움직임 : dx-dy 테크닉 사용 + 시계방향(curDir = (curDir + 1) % 4)

2. 격자 내 움직임  : inRange 함수로 판단

3. 도착 유무 파악 : board[nr][nc] != 0 판단

4. 알파벳 채우기 A - Z 반복 : 모듈러 연산 활용 ( idx % 26)

코드(Java)

// 좌표, dr - dc tech
// 시계방향
// 알파벳 채우기 -> a to z -> 모듈러 연산 이용하기
import java.io.*;
import java.util.*;

public class Main {
    // 변수 선언
    private static int n, m, curDir = 0, cr = 0, cc = 0, idx = 0;
    private static int[] dr = new int[]{0, 1, 0, -1};
    private static int[] dc = new int[]{1, 0, -1, 0};
    private static String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    // 정적 배열 선언
    private static int MAX_N = 100, MAX_M = 100;
    private static char[][] board = new char[MAX_N][MAX_M];
    //  격자내 범위 체크
    private static boolean inRange(int r, int c){
        return 0 <= r && r < n && 0 <= c && c < m;
    }
    //
    private static void simulate(int curDir, int cr, int cc){
        board[cr][cc] = alphabet.charAt(idx);
        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];
            }
            idx ++;
            // A to Z 다시 돌아옴 -> 모듈러 연산 이용
            idx %= 26;
            board[nr][nc] = alphabet.charAt(idx);
            cr = nr; cc = nc;
        }
    }

    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());
        simulate(curDir, cr, cc);

        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                System.out.print(board[i][j] + " ");
            }
            System.out.println();
        }
    }
}
728x90
반응형