[삼성기출]백준17140 - 이차원 배열과 연산

 
by 박신종

이 문제는 주어진 조건을 그대로 구현하였습니다.

진행과정은 다음과 같습니다.

  1. 행(R)과 열(C)의 갯수를 받아서, 조건에 맞는 정렬을 해줍니다.
  2. 이때, 정렬된 최대 size를 찾아서 새로운 배열을 만들어주고,
  3. 정렬된 값을 넣어줍니다.


문제풀기 : [백준17140 - 이차원 배열과 연산]


import java.io.*;
import java.util.*;

public class Main {
	static int r, c, k;
	static int[][] map;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] input = br.readLine().trim().split(" ");
		r = Integer.parseInt(input[0]) - 1;			// 인덱스 0부터 시작하기 때문에 -1처리
		c = Integer.parseInt(input[1]) - 1;
		k = Integer.parseInt(input[2]);
		map = new int[3][3];
		for (int i = 0; i < 3; i++) {
			input = br.readLine().trim().split(" ");
			for (int j = 0; j < 3; j++) {
				map[i][j] = Integer.parseInt(input[j]);
			}
		}
		
		for (int t = 0; t <= 100; t++) {
			R = map.length;
			C = map[0].length;
			
			if (r<R && c<C && map[r][c] == k) { // 해당 r,c 위치에 k 값 있는지 체크.
				System.out.println(t);			// 있으면 프린트하고 return.
				return;
			}
			play();			// 연산
//			print();
		}
		System.out.println(-1);
	}
	static Queue<Number> addNumber(int[] numbers) {		// 디버깅하기 편하게 함수화
		Queue<Number> qu = new PriorityQueue<>();
		for (int j = 1; j < 101; j++) {
			if (numbers[j] != 0) qu.add(new Number(j, numbers[j]));
		}
		return qu;
	}
	static int R, C;
	static void initArr() {
		for (int i = 0; i < 20001; i++) {
			if (arr[i] != 0)
			arr[i] = 0;
			else return;
		}
	}
	static int[] arr = new int[20001];
	static void play() {
		initArr();
		Queue<Number> qu;
		int[] numbers;
		Number number;
		int size, seq;
		if(R >= C) {
			size = 3;
			seq = 0;
			for (int i = 0; i < R; i++) {
				numbers = new int[101];
				for (int j = 0; j < C; j++) {
					numbers[map[i][j]]++;
				}
				qu = addNumber(numbers);
				if (size < qu.size() * 2)
				size = qu.size() * 2;
				while (!qu.isEmpty()) {
					number = qu.poll();
					arr[seq++] = number.num;
					arr[seq++] = number.cnt;
				}
				arr[seq++] = -1;
			}
			seq = 0;
			C = size;
			map = new int[R][C];
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C + 1; j++) {
					if (arr[seq] == -1) {
						seq++;
						break;
					}
					else if (j < C)
					map[i][j] = arr[seq++];
				}
			}
		}else {
			seq = 0;
			size = 3;
			for (int j = 0; j < C; j++) {
				numbers = new int[101];
				for (int i = 0; i < R; i++) {
					numbers[map[i][j]]++;
				}
				qu = addNumber(numbers);
				if (size < qu.size() * 2)
				size = qu.size() * 2;
				while (!qu.isEmpty()) {
					number = qu.poll();
					arr[seq++] = number.num;
					arr[seq++] = number.cnt;
				}
				arr[seq++] = -1;
			}
			seq = 0;
			R = size;
			map = new int[R][C];
			for (int j = 0; j < C; j++) {
				for (int i = 0; i < R + 1; i++) {
					if (arr[seq] == -1) {
						seq++;
						break;
					}
					else if (i < R)
					map[i][j] = arr[seq++];
				}
			}
		}
	}
	static class Number implements Comparable<Number> {
		int num, cnt;
		public Number(int num, int cnt) {
			this.num = num;
			this.cnt = cnt;
		}
		@Override
		public String toString() {
			return "[" + num + "," + cnt + "]";
		}
		/*
         * 
         * cnt 오름차순, num 오름차
         * 
         */
		@Override
		public int compareTo(Number o) {
			if (this.cnt < o.cnt)
			return -1;
			else if (this.cnt == o.cnt) {
				if (this.num < o.num)
				return -1;
				else return 1;
			}
			else return 1;
		}
	}
	static void print() {
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println("========================");
	}
}



저는 한참 풀다가 런타임에러가 많이 발생했는데, 다음과 같은 예외가 있었습니다.

input:
4 4 1
1 2 1
2 1 3
3 3 3

output:
2