본문 바로가기

코테문제

[백준] S16173

https://www.acmicpc.net/problem/16173

 

16173번: 점프왕 쩰리 (Small)

쩰리는 맨 왼쪽 위의 칸에서 출발해 (행, 열)로 나타낸 좌표계로,  (1, 1) -> (2, 1) -> (3, 1) -> (3, 3)으로 이동해 게임에서 승리할 수 있다.

www.acmicpc.net

 

# 아이디어

N이 2 또는 3이기 때문에 2*2 와 3*3의 지도가 존재한다.

따라서 2*2에서는 한 칸 단위로 오른쪽 이동 1회, 아래쪽 이동 1회가 일어나고

3*3에서는 한 칸 단위로 오른쪽 이동 2회, 아래쪽 이동 2회가 일어난다.

 

2*2에서의 모든 경우의 수: 2

3*3에서의 모든 경우의 수: 14

직접 if문을 이용해 체크해주자.

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int mapSize = sc.nextInt();

		int[][] map = new int[mapSize][mapSize];
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				map[i][j] = sc.nextInt();
			}
		}

		if (mapSize == 2) {
			if (map[0][0] == 1 && map[0][1] == 1 || map[0][0] == 1 && map[1][0] == 1)
				System.out.println("HaruHaru");
			else {
				System.out.println("Hing");
			}
		}
		if (mapSize == 3) {
			if (map[0][0] == 1) {
				if ((map[0][1] == 1 && map[1][1] == 1 && map[1][2] == 1)
						|| (map[1][0] == 1 && map[1][1] == 1 && map[2][1] == 1)) {
					System.out.println("HaruHaru");
					System.exit(0);
				}
				if ((map[0][1] == 2 && map[2][1] == 1) || (map[1][0] == 2 && map[1][2] == 1)
						|| (map[0][1] == 1 && map[1][1] == 1 && map[2][1] == 1)
						|| (map[1][0] == 1 && map[1][1] == 1 && map[1][2] == 1)) {
					System.out.println("HaruHaru");
					System.exit(0);
				}
				if (map[0][2] == 2 || map[2][0] == 2
						|| ((map[0][2] == 1 && map[1][2] == 1) || (map[2][0] == 1 && map[2][1] == 1))) {
					System.out.println("HaruHaru");
					System.exit(0);
				}
			}

			else if (map[0][0] == 2) {
				if (map[0][2] == 2 || map[2][0] == 2
						|| ((map[0][2] == 1 && map[1][2] == 1) || (map[2][0] == 1 && map[2][1] == 1))) {
					System.out.println("HaruHaru");
					System.exit(0);
				}
			}

			System.out.println("Hing");
		}

		sc.close();

	}

정답이긴 하지만 아무리 생각해도 이렇게 하는건 아닌거 같다...;;

 

# 블로그 참조

오른쪽과 아래쪽으로만 한 붓 그리기를 하여 출구를 찾자.

=> DFS(깊이 우선 탐색): 최대한 깊이 내려간 뒤, 더이상 내려갈 수 없는 경우 옆으로 이동

	public static void dfs(int x, int y, int[][] map, boolean[][] visited) {
		if (visited[x][y]) {
			return;
		}
		visited[x][y] = true;

		if (map[x][y] == -1) {
			System.out.println("HaruHaru");
			System.exit(0);
		}

		if (y + map[x][y] < map.length) {
			dfs(x, y + map[x][y], map, visited);
		}
		if (x + map[x][y] < map.length) {
			dfs(x + map[x][y], y, map, visited);
		}

	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int mapSize = sc.nextInt();

		int[][] map = new int[mapSize][mapSize];
		boolean[][] visited = new boolean[mapSize][mapSize];
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				map[i][j] = sc.nextInt();
				visited[i][j] = false;
			}
		}

		dfs(0, 0, map, visited);

		System.out.println("Hing");

		sc.close();

	}

dfs()함수는 매개변수로 x, y, map, visited를 갖고 (0,0)부터 탐색을 시작해 해당 위치의 값만큼 더한 좌표들을 재귀를 통해 다시 dfs 탐색을 한다.

 

🤔

보면 알겠는데... 과연 코딩을 할 수 있을까??? 라는 생각이 드는 정답 코드..

visited[][]배열 까지는 생각했는데 현재 좌표값에서 가중치를 좌표에 더하여 재귀 함수로 반복하는 아이디어를 떠오르지 못했다.. ㅠㅠ

 

💯💯💯

이제 Scanner를 버릴 때가 된거 같다.. 제출 시간이 점점 오래 걸리기 시작함.

'코테문제' 카테고리의 다른 글

[백준] S2606  (1) 2023.11.12
[백준] S1260  (0) 2023.11.05
[백준] B11170  (0) 2023.10.12
[백준] B2460  (0) 2023.09.29
[백준] S17276 미완성  (0) 2023.09.27