PS/코드트리
[코드트리 챌린지] 1주차 - 빙빙 돌며 사각형 채우기(Java)
행복한라이언
2023. 9. 8. 16:47
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
반응형