문제 : boj10997
1.
일단 규칙부터 유추해보자. 대강 n이 주어질 때 우측상단부터 시작해서 n-0.5 바퀴 돌리는 별찍기라 볼 수 있다. 예를들어 3이라면 2.5바퀴를 돌린 형태이다.
2.
좀 더 구체적으로 짤 수 있는 로직을 생각해 보자면, 1일 때는 그냥 예외로써 '*' 하나만 출력해주면 되겠고, n이 2 이상이라면 row의 개수는 3+4*n, column의 개수는 1+4*n 이 된다. 그리고 우측 상단부터 시작해서 좌,하,우,상의 방향을 순서대로 돌리면서 갈 수 있는 곳까지 별을 찍으면 된다. 갈 수 있는 조건은 배열의 끝 혹은 가려는 방향으로 2칸 앞이 이미 별인 경우 해당 위치까지만 찍을 수 있다.
즉 row와 column 개수에 대한 점화식만 잘 세우고, 그 이후로는 단순 구현으로 풀 수 있는 문제이다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
private static final int[] DR = {0, 1, 0, -1};
private static final int[] DC = {-1, 0, 1, 0};
private int[][] makeStarArr(int n) {
int[][] arr = new int[3+4*(n-1)][1+4*(n-1)];
int r = 0;
int c = arr[0].length-1;
arr[r][c] = 1;
while (true) {
for (int i = 0; i < 4; i++) {
int cnt = 0;
while (true) {
if (r+DR[i]<0 || r+DR[i]>=arr.length || c+DC[i]<0 || c+DC[i]>=arr[0].length) break;
if (r+2*DR[i]>=0 && r+2*DR[i] < arr.length && c+2*DC[i]>=0 && c+2*DC[i] < arr[0].length && arr[r+2*DR[i]][c+2*DC[i]] == 1) break;
r += DR[i];
c += DC[i];
cnt++;
arr[r][c] = 1;
}
if (cnt == 0)
return arr;
}
}
}
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
if (n == 1) {
System.out.println("*");
return;
}
int[][] arr = makeStarArr(n);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
if (i == 1) {
sb.append('*').append('\n');
continue;
}
for (int j = 0; j < arr[0].length; j++) {
sb.append(arr[i][j] == 1 ? '*':' ');
}
sb.append('\n');
}
System.out.print(sb);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
백준 2012 자바 - 등수 매기기 (BOJ 2012 JAVA) (0) | 2021.12.27 |
---|---|
백준 20127 자바 - Y-수열 (BOJ 20127 JAVA) (0) | 2021.12.26 |
백준 4485 자바 - 녹색 옷 입은 애가 젤다지? (BOJ 4485 JAVA) (2) | 2021.12.24 |
백준 2670 자바 - 연속부분최대곱 (BOJ 2670 JAVA) (0) | 2021.12.23 |
백준 9001 자바 - Rectangle Coloring (BOJ 9001 JAVA) (0) | 2021.12.22 |
댓글