본문 바로가기
Preparing Coding Test/Baekjoon

[Java/백준/구현,배열] 10157번: 자리 배정

by weero 2021. 2. 25.

문제

www.acmicpc.net/problem/10157

 

10157번: 자리배정

첫 줄에는 공연장의 격자 크기를 나타내는 정수 C와 R이 하나의 공백을 사이에 두고 차례대로 주어진다. 두 값의 범위는 5 ≤ C, R ≤ 1,000이다. 그 다음 줄에는 어떤 관객의 대기번호 K가 주어진다.

www.acmicpc.net

 

소프트웨어아카데미의 <달팽이 숫자>와 거의 같은 문제이다.

 

범위를 벗어나면 방향을 수정하는 방법으로 풀면 된다.

배열 범위를 생각하는게 넘 번거롭고 귀찮다...

 

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--;

		}
	}
}