https://www.acmicpc.net/problem/1022
사용 알고리즘
구현
아이디어
1. 주어진 입력 값의 시작점을 0, 0으로 옮기고, 이 크기의 배열 arr을 생성한다.
2. 이를 기준으로 했을 때 0, 0 지점 (-r1, -c1)부터 1을 소용돌이 모양으로 채운다.
3. dx, dy 배열로 우/상/좌/하 방향으로 이동할 수 있도록 한다.
4. 이때, 같은 방향으로 1, 2, 3, ... 씩 증가하며 움직이는 게 2번씩 반복된다.
(즉, 우 -> 상 -> 좌 -> 좌 -> 하 -> 하 -> 우 -> 우 -> 우 -> 상 -> 상 -> 상 -> ... 식으로 늘어나는 규칙의 코드를 반복문으로 짜야 함)
5. 이동할 때 주어진 arr 배열 범위 밖이면 무시, 범위 안이면 배열에 값을 저장한다.
6. 이를 길이를 맞춰.. 오른쪽 정렬해 출력한다..
유의점
1. 출력 형식이 안맞아서 제일 골치 아팠다!!!
// String.format("%nd ", value) → n 자리 맞춰 출력
sb.append(String.format("%" + maxLen + "d", arr[i][j]));
제출코드
package BOJ.Implementation;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_1022_소용돌이예쁘게출력하기 {
static int[] dx = {0, -1, 0, 1};
static int[] dy = {1, 0, -1, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
int n = Math.max(Math.abs(x1), Math.max(Math.abs(y1), Math.max(Math.abs(x2), Math.abs(y2))));
int r = x2 - x1 + 1;
int c = y2 - y1 + 1;
int[][] arr = new int[r][c];
int num = 2;
int cnt = 1;
int idx = 0;
int x = -x1;
int y = -y1;
int color = r * c;
if(x >= 0 && y >= 0 && x < r && y < c) {
arr[x][y] = 1;
color--;
}
boolean flag = false;
int maxNum = 0;
while(true){
if(color == 0){
flag = true;
break;
}
for(int i=0; i<2; i++){
for(int j=0; j<cnt; j++){
int nx = x + dx[idx % 4];
int ny = y + dy[idx % 4];
if(nx < 0 || ny < 0 || nx >= r || ny >= c) {
x = nx;
y = ny;
num++;
continue;
}
maxNum = Math.max(maxNum, num);
arr[nx][ny] = num++;
color--;
x = nx;
y = ny;
}
if(flag) break;
idx++;
}
if(flag) break;
cnt++;
}
int maxLen = String.valueOf(maxNum).length();
StringBuilder sb = new StringBuilder();
for(int i=0; i<r; i++){
for(int j=0; j<c; j++){
if (j > 0) sb.append(" ");
sb.append(String.format("%" + maxLen + "d", arr[i][j]));
}
if (i < r-1) sb.append("\n");
}
System.out.println(sb.toString());
}
}
'코테 > 백준' 카테고리의 다른 글
99클럽 코테 스터디 11일차 TIL 백트래킹(N-Queen) (1) | 2025.02.03 |
---|---|
[BOJ] 1865 웜홀(Java) (0) | 2025.01.29 |
99클럽 코테 스터디 10일차 TIL BFS(빙산) (0) | 2025.01.24 |
99클럽 코테 스터디 7일차 TIL 백트래킹(주사위 윷놀이) (0) | 2025.01.22 |
99클럽 코테 스터디 6일차 TIL 다익스트라(특정한 최단 경로) (1) | 2025.01.20 |