IT recording...

[BOJ] 17140 이차원배열과연산 - Java 본문

Algorithm

[BOJ] 17140 이차원배열과연산 - Java

I-one 2022. 4. 23. 19:13

 

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

 

17140번: 이차원 배열과 연산

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

www.acmicpc.net

[풀이]

1. 행 길이와 열 길이에 따라 각 초마다의 연산이 달라지니, 각 길이를 담아놓을 변수가 필요하다.

  1-1. R 연산을 한다면 행 길이는 그대로고 열길이가 달라진다. 

  1-2. C 연산을 한다면 열 길이는 그대로고 행길이가 달라진다.

각 행,열의 길이 갱신은 모든 연산 중 가장 큰 값을 기준으로 하니, 각 행,열 연산마다 Math.max 연산을 해주며 갱신한다.

 

2. 갱신은 HashMap과 PriorityQueue를 이용해서 이뤄진다.

R,C연산에 따라 한 행 혹은 열에 대해 HashMap<Integer,Integer> 에 key로는 숫자, value에는 들어있는 횟수를 저장한다.

한 행 혹은 열에 대한 로직이 끝나면, 이를 PriorityQueue에 넣고 정렬해준다. 

Point라는 클래스를 선언해서, count순, 숫자순으로 정렬되도록 했다.

   2-1. 정렬이 끝나면 Copy배열에 정렬한 수들을 저장한다.

 

3. 모든 행 혹은 열에 대해 Copy배열이 완성되면 원본배열에 Copy를 복사한다.

 

4.Map[R][C] 값이 K인지 확인한다.

 

[코드]

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

/*
사용하는 클래스명이 Solution 이어야 하므로, 가급적 Solution.java 를 사용할 것을 권장합니다.
이러한 상황에서도 동일하게 java Solution 명령으로 프로그램을 수행해볼 수 있습니다.
*/
class Main {
	static StringTokenizer st;
	static int R,C,K;
	static int[][] Map = new int[101][101];
	static int[][] Copy;
	static int rowNum = 3;
	static int colNum = 3;
	static boolean flag = false;
	
	public static void main(String args[]) throws Exception {
		/*
		 * 아래의 메소드 호출은 앞으로 표준 입력(키보드) 대신 input.txt 파일로부터 읽어오겠다는 의미의 코드입니다. 여러분이 작성한 코드를
		 * 테스트 할 때, 편의를 위해서 input.txt에 입력을 저장한 후, 이 코드를 프로그램의 처음 부분에 추가하면 이후 입력을 수행할 때
		 * 표준 입력 대신 파일로부터 입력을 받아올 수 있습니다. 따라서 테스트를 수행할 때에는 아래 주석을 지우고 이 메소드를 사용하셔도 좋습니다.
		 * 단, 채점을 위해 코드를 제출하실 때에는 반드시 이 메소드를 지우거나 주석 처리 하셔야 합니다.
		 */
		//System.setIn(new FileInputStream("src/main/java/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		st = new StringTokenizer(br.readLine());
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		
		for(int i=1;i<rowNum+1;i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=1;j<colNum+1;j++) {
				Map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		//printMap();
		if(Map[R][C]==K) {
			System.out.println(0);
			System.exit(0);
		}
		
		//start
		for(int t=1;t<101;t++) { //100초까지
			
			Copy = new int[101][101];
			if(rowNum>=colNum) { //행 돌면서 연산
				colNum = 0;
				for(int i=1;i<rowNum+1;i++) {
					HashMap<Integer,Integer> hashMap = new HashMap<>();
					for(int j=1;j<101;j++) {
						int num = Map[i][j];
						if(num!=0) {
							if(hashMap.containsKey(num)) {
								hashMap.put(num,hashMap.get(num)+1);
							}
							else {
								hashMap.put(num, 1);
							}
						}
						
					}
					//끝나고 Copy갱신
					PriorityQueue<Point> queue = new PriorityQueue<>();
					for(int key:hashMap.keySet()) {
						queue.add(new Point(key,hashMap.get(key)));
					}
					//System.out.println(queue);
					int col = 1;
					
					//System.out.println("col 바꿈 -> "+colNum);
					while(!queue.isEmpty()) {
						if(col>=101) {
							col--;
							break;
						}
						Point now = queue.poll();
						Copy[i][col++] = now.num;
						Copy[i][col++] = now.count;
					}
					colNum = Math.max(colNum, col);
				}
			}
			else { //열 돌면서 연산
				rowNum = 0;
				for(int j=1;j<colNum+1;j++) {
					HashMap<Integer,Integer> hashMap = new HashMap<>();
					for(int i=1;i<101;i++) {
						int num = Map[i][j];
						if(num!=0) {
							if(hashMap.containsKey(num)) {
								hashMap.put(num,hashMap.get(num)+1);
							}
							else {
								hashMap.put(num, 1);
							}
						}
						
					}
					//끝나고 Copy 갱신
					PriorityQueue<Point> queue = new PriorityQueue<>();
					for(int key:hashMap.keySet()) {
						queue.add(new Point(key,hashMap.get(key)));
					}
					
					//System.out.println("row 바꿈 -> "+rowNum);
					//System.out.println(queue);
					int row = 1;
					while(!queue.isEmpty()) {
						if(row>=101) {
							row--;
							break;
						}
						Point now = queue.poll();
						Copy[row++][j] = now.num;
						Copy[row++][j] = now.count;
					}
					rowNum = Math.max(rowNum, row);
				}
			}
			
			//Copy복사하기
			for(int i=1;i<101;i++) {
				for(int j=1;j<101;j++) {
					Map[i][j] = Copy[i][j];
				}
			}
			//System.out.println(rowNum+" , "+colNum);
			//printMap();
			
			if(Map[R][C]==K) {
				flag = true;
				System.out.println(t);
				break;
			}
			
		}
		
		if(!flag) {
			System.out.println(-1);
		}
	}
	
	static void printMap() {
		System.out.println("=====================");
		for(int i=1;i<101;i++) {
			for(int j=1;j<101;j++) {
				System.out.print(Map[i][j]);
			}
			System.out.println();
		}
	}
	
	static class Point implements Comparable<Point>{
		int num;
		int count;
		
		@Override
		public String toString() {
			return "Point [num=" + num + ", count=" + count + "]";
		}

		public Point(int num, int count) {
			super();
			this.num = num;
			this.count = count;
		}

		@Override
		public int compareTo(Point o) {
			// TODO Auto-generated method stub
			int comp = Integer.compare(count, o.count);
			if(comp==0) {
				comp = Integer.compare(num,o.num);
			}
			return comp;
		}
		
	}
}

[느낀점]

시간 : 1h 10min

생각보다 복잡하지 않은 문제였다.

다만, 초기상태 점검을 한 후 로직을 돌려야 한다는 것을 명심하자!

 

'Algorithm' 카테고리의 다른 글

[BOJ] 16236 아기상어 - Java  (0) 2022.04.24
[BOJ] 17142 연구소3 - Java  (0) 2022.04.23
[BOJ] 17143 낚시왕 - Java  (0) 2022.04.22
[BOJ] 17144 미세먼지안녕 - Java  (0) 2022.04.22
[BOJ] 16235 나무재테크 - Java  (0) 2022.04.21
Comments