https://www.acmicpc.net/problem/10157
- 시계방향으로 배열을 초기화 시켜준다.
- 배열의 범위를 벗어나거나 이미 자리가 배정된 경우 방향을 전환해준다.
- 자리 배정이 끝나면 대기 순서가 K인 자리(x, y)를 찾아 출력한다.
[Java]
import java.io.*;
import java.util.*;
public class Main {
// 위, 오른쪽, 아래쪽, 왼쪽 순으로 방향을 전환 (시계방향)
static int dx[] = {0, 1, 0, -1};
static int dy[] = {-1, 0, 1, 0};
// 방향을 전환할 시기에 배열의 범위를 벗어나게 되는데
// 방향에 맞게 적절한 위치로 초기화 시켜주기 위한 배열
// ex) 위 -> 오른쪽 전환할 시기에 y: -1, 오른쪽 -> 아래쪽 x: m
// 아래쪽-> 왼쪽 y: n, 왼쪽 -> 위: x: -1
static int change_dx[] = {1, 0, -1, 0};
static int change_dy[] = {0, 1, 0, -1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken()); // 열
int n = Integer.parseInt(st.nextToken()); // 행
int target = Integer.parseInt(br.readLine());
int arr[][] = new int[n][m];
int num = 1;
int moveIdx = 0;
int curY = n-1;
int curX = 0;
while(num <= n*m){
if(curY >= n || curY < 0 || curX >= m || curX <0 || arr[curY][curX] != 0) {
moveIdx++;
curY += change_dy[moveIdx%4];
curX += change_dx[moveIdx%4];
}
else arr[curY][curX] = num++;
curY += dy[moveIdx % 4];
curX += dx[moveIdx % 4];
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(arr[i][j] == target){
bw.write((j+1) + " " + (n-i));
bw.flush();
return;
}
}
}
bw.write("0");
bw.flush();
}
}
'PS > 백준' 카테고리의 다른 글
[백준] - 암기왕 2776 (0) | 2022.11.09 |
---|---|
[백준] - 키 큰 사람 11292 (0) | 2022.11.07 |
백준 1753 - 최단 경로 (다익스트라) (0) | 2022.09.20 |
백준 안전영역 2468 - java (0) | 2022.08.26 |
알고리즘 수업 - 깊이 우선 탐색 (0) | 2022.08.19 |