JAVA/문제 풀이

[백준 / BOJ] 30024번 : 옥수수밭 - JAVA

ahue 2023. 9. 18. 22:19
728x90

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

 

30024번: 옥수수밭

옥수수밭 주인 민석이는 한 해 동안 열심히 기른 옥수수를 수확하려고 한다. 옥수수밭은 $N$행 $M$열의 격자로 생각할 수 있는데, 격자의 각 칸에는 한 그루의 옥수수가 심어져 있다. 민석이는 각

www.acmicpc.net

문제 조건

이 문제는 조건이 아주 단순해서 깊게 구현할 필요가 없었다. '현재 접근할 수 있는 옥수수 중 가장 가치가 높은 것'만 확인하면 된다. 이에 따라 제일 처음 2차원 map 배열을 받으면서 가장자리에 있는 옥수수들의 값을 우선순위 큐에 넣었다.

 

PriorityQueue<int[]> que = new PriorityQueue<>(new Comparator<int[]>() {

    @Override
    public int compare(int[] o1, int[] o2) {
        int n = Integer.compare(o2[0], o1[0]);
        return n;
    }

});

boolean[][] v = new boolean[N][M];
int min = Integer.MAX_VALUE;
for (int i = 0; i < N; i++) {
    st = new StringTokenizer(br.readLine());
    for (int j = 0; j < M; j++) {
        map[i][j] = Integer.parseInt(st.nextToken());
        if(i == 0 || j == 0 || i == N - 1 || j == M - 1) {
            que.offer(new int[] {map[i][j], i, j});
            v[i][j] = true;
        }
    }
}

 

PriorityQueue의 우선순위 기준

여기서 중요한 건 PriorityQueue에 옥수수의 가치와 위치를 모두 넣어주어야 하기 때문에(그래야 나중에 사방 탐색을 할 수 있다) 1차원 int 배열의 우선순위 기준을 정해야 한다. 값이 클수록 좋기 때문에 Integer.compare(o2[0], o1[0]) 값을 리턴하도록 했다. o2를 먼저 두면 큰 값을 우선하고, o1을 먼저 두면 작은 값을 우선하게 된다.

 

이후에는 가장 큰 값을 poll하고, 해당하는 위치에서 사방탐색을 진행하여 문제를 풀 수 있었다.

 

전체 코드

// 시간 : 756ms
// 메모리 : 131884KB
public class Main {

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

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		
		int[][] map = new int[N][M];
		
		PriorityQueue<int[]> que = new PriorityQueue<>(new Comparator<int[]>() {

			@Override
			public int compare(int[] o1, int[] o2) {
				int n = Integer.compare(o2[0], o1[0]);
				return n;
			}
			
		});
		
		boolean[][] v = new boolean[N][M];
		int min = Integer.MAX_VALUE;
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				if(i == 0 || j == 0 || i == N - 1 || j == M - 1) {
					que.offer(new int[] {map[i][j], i, j});
					v[i][j] = true;
				}
			}
		}
		
		int K = Integer.parseInt(br.readLine());
		
		int[] dr = {-1,0,1,0};
		int[] dc = {0,-1,0,1};
		
		StringBuilder sb = new StringBuilder();
		while(K > 0) {
			int[] cur = que.poll();
			int r = cur[1];
			int c = cur[2];
			K--;
			sb.append(r + 1).append(" ").append(c + 1).append("\n");
			
			for (int d = 0; d < 4; d++) {
				int nr = r + dr[d];
				int nc = c + dc[d];
				if(nr >= N || nc >= M || nr < 0 || nc < 0) continue;
				if(v[nr][nc]) continue;
				v[nr][nc] = true;
				que.offer(new int[] {map[nr][nc], nr, nc});
			}
			
		}
		
		System.out.print(sb);
	}

}
반응형