삽질도사

[백준] 달팽이 1913 자바 본문

백준

[백준] 달팽이 1913 자바

전성진블로그 2021. 3. 9. 20:55

기본적인 구현문제였습니다만, 구현문제가 대부분 그렇기는 하지만 이건 효율적으로 짜여진 코드는 아닙니다.

매우 부끄러운 코드임으로 구냥 참고용으로 보시면 좋겠습니다...(_ _)..

 

1,1에서 시작해서,

-1하면서 (아래쪽으로 끝까지 -> 오른쪽끝 -> 위로 끝까지 -> 왼쪽) 끝까지 방문체크하여 중복없이 4가지 이동을 

좌표가 x,y 둘다 (n+1)/2인 가운데(1)에 다다르면 끝나는 것이고, 이전에 원하는 숫자를 찾으면 좌표을 출력 후 종료했습니다. 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 달팽이 {

	static int n, k, resy = 1, resx = 1, y = 1, x = 1;
	static int[][] map;
	static boolean[][] visited;

	static boolean isrange(int y, int x) {
		return y >= 1 && y <= n && x >= 1 && x <= n;
	}

	static void go(int n) {
		switch (n) {
		case 1:
			y = y + 1;
			break;
		case 2:
			x = x + 1;
			break;
		case 3:
			y = y - 1;
			break;
		case 4:
			x = x - 1;
			break;
	
		default:
			throw new IllegalArgumentException("Unexpected value: " + n);
		}
	}

	static void bfs() {

		while(true)
		for (int q = 1; q <= 4; q++)
			while (true) {

				int temp = map[y][x];
				int dy = y;
				int dx = x;
				go(q);

				if (isrange(y, x) && !visited[y][x]) {
					visited[y][x] = true;
					map[y][x] = temp - 1;
					if (map[y][x] == k) {
						resy = y;
						resx = x;
					}
					if (x == (n + 1) / 2 && y == x)
						return;

				} else {
					y = dy;
					x = dx;
					break;
				}
			}

	}

	static void func() {

		map[1][1] = n * n;
		visited[1][1] = true;

		bfs();

	}

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		n = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		k = Integer.parseInt(st.nextToken());
		map = new int[n + 1][n + 1];
		visited = new boolean[n + 1][n + 1];

		func();

		for (int y = 1; y <= n; y++) {
			for (int x = 1; x <= n; x++) {
				System.out.print(map[y][x] + " ");
			}
			System.out.println();
		}

		System.out.println(resy + " " + resx);

	}

}

 

'백준' 카테고리의 다른 글

[백준] 파일정리 20291 자바  (0) 2021.03.12
[백준] 스위치 켜고 끄기 1244 자바  (0) 2021.03.12
[백준] 빙고 2578 자바  (0) 2021.03.09
[백준] 택배 8980 자바  (0) 2021.03.09
[백준] 오리 12933 자바  (0) 2021.03.09