문제
소프트웨어아카데미의 <달팽이 숫자>와 거의 같은 문제이다.
범위를 벗어나면 방향을 수정하는 방법으로 풀면 된다.
배열 범위를 생각하는게 넘 번거롭고 귀찮다...
import java.io.*;
import java.util.*;
public class Main {
static int[][] map;
static int C, R;
static int[] dy = { 1, 0, -1, 0 };
static int[] dx = { 0, 1, 0, -1 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
C = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(br.readLine());
map = new int[R + 1][C + 1];
if (K > C * R)
System.out.println(0);
else
check(K);
br.close();
}
private static void check(int k) {
int dir = 0;
int x = 1, y = 1;
int num = 1;
while (num <= C * R) {
map[y][x] = num++;
if (num - 1 == k) {
System.out.println(x + " " + y);
return;
}
if (x + dx[dir] < 1 || x + dx[dir] > C || y + dy[dir] < 1 || y + dy[dir] > R
|| map[y + dy[dir]][x + dx[dir]] != 0) {
dir++;
if (dir == 4)
dir = 0;
}
x = x + dx[dir];
y = y + dy[dir];
}
}
}
이건 86%에서 실패한 코드인데 왜인지 좀 알고 싶다.
import java.io.*;
import java.util.*;
public class Main {
static int[][] map;
static int C, R;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
C = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(br.readLine());
map = new int[R][C];
if (K > C * R)
System.out.println(0);
else
check(K);
br.close();
}
private static void check(int k) {
int min = Math.min(C, R) / 2;
int leftx = 0;
int rightx = C - 1;
int topy = R - 1;
int bottomy = 0;
int number = 1;
for (int n = 0; n < min; n++) {
// 상우하좌 순서
for (int y = bottomy; y <= topy; y++) {
map[y][leftx] = number++;
if (map[y][leftx] == k) {
System.out.println((leftx + 1) + " " + (y + 1));
return;
}
}
for (int x = leftx + 1; x <= rightx; x++) {
map[topy][x] = number++;
if (map[topy][x] == k) {
System.out.println((x + 1) + " " + (topy + 1));
return;
}
}
for (int y = topy - 1; y >= bottomy; y--) {
map[y][rightx] = number++;
if (map[y][rightx] == k) {
System.out.println((rightx + 1) + " " + (y + 1));
return;
}
}
for (int x = rightx - 1; x > leftx; x--) {
map[bottomy][x] = number++;
if (map[bottomy][x] == k) {
System.out.println((x + 1) + " " + (bottomy + 1));
return;
}
}
leftx++;
rightx--;
bottomy++;
topy--;
}
}
}
'Preparing Coding Test > Baekjoon' 카테고리의 다른 글
[Java/백준/투포인터] 1806번: 부분 합 (0) | 2021.06.25 |
---|---|
[Java/백준/DFS, DP] 1937번: 욕심쟁이 판다 (0) | 2021.04.23 |
[Java/백준/백트레킹] 1987번: 알파벳 (0) | 2021.02.18 |
[Java/백준/소수] 1978번: 소수 찾기 (0) | 2021.02.15 |
[Java/백준/배열] 16926번: 배열 돌리기 1, 17406번: 배열 돌리기 4 (0) | 2021.02.14 |