ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 17140 이차원 배열과 연산
    백준/시뮬레이션 2024. 6. 12. 17:10
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.StringTokenizer;
    
    class Pair implements Comparable<Pair>{
    	
    	
    	int number;
    	int count;
    	
    	Pair(int number, int count) {
    		this.number = number;
    		this.count = count;
    	}
    	
    	// 리스트 정렬
    	// 1) 수의 등장 횟수 적은 -> 많은 (순서)
    	// 2) 작은 수 -> 큰 수 (순서)
    	public int compareTo(Pair p) {		
    		
    		if(this.count>p.count) {
    			return 1;
    		}else if(this.count < p.count) {			
    			return -1;
    			
    		}else {
    			
    			if(this.number>p.number) {
    				return 1;
    			}else {
    				return -1;
    			}
    			
    		}		
    	}	
    }
    
    public class Main {		
    	
    	static int r;
    	static int c;
    	static int k;
    	static int input[][];	
    	
    	public static void main(String[] args) throws IOException{	
    	
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st= new StringTokenizer(br.readLine(), " " );
    		r = Integer.parseInt(st.nextToken());
    		c = Integer.parseInt(st.nextToken());
    		k = Integer.parseInt(st.nextToken());
    		input = new int [101][101];
    		
    		
    		for(int i=1; i<=3; i++) {
    			 st= new StringTokenizer(br.readLine(), " " );
    			for(int j= 1; j<=3; j++) {
    				input[i][j] = Integer.parseInt(st.nextToken());
    				
    			}
    		}	
    		
    		int result = solve(input);		
    		
    		if(result>100) {
    			System.out.println("-1");
    		}else {
    			System.out.println(result);
    		}
    	}
    	
    
    	
    	public static int solve(int input[][]) {	
    	
    		int row_number = 3; // 행 개수  (맨 처음 = 3)
    		int col_number= 3; // 열 개수 (맨 처음 = 3)			
    		HashMap<Integer, Integer> map = new HashMap<>(); // 수의 등장 횟수 파악 -> HashMap 사용
    		List<Pair> list = new ArrayList<>(); // 정렬 위해 리스트 사용 
    		int time = 0;
    		int max_list_length =0;
    		
    		while(true) {
    				
    			if(time>100) {
    				break;
    			}
    			
    			if(input[r][c] == k) {
    				break;
    			}
    			
    			int input2[][] = new int[101][101];				
    			max_list_length = 0;
    			
    			
    			// R 연산 -> 행 기준 정렬
    			// 행 개수 >= 열 개수 
    			if(row_number>=col_number) {			
    			
    				for(int i=1; i<=row_number; i++) {
    					
    					for(int j=1; j<=col_number; j++) {
    						
    						int value = input[i][j];	
    						if(value!=0) {
    							map.put(value,map.getOrDefault(value, 0)+1);					
    						}
    					}				
    					
    					// 하나의 행이 끝나면 
    					// map 에 넣은 것을 list 에 넣어서 정렬 
    					for(Integer key:map.keySet()) {					
    						list.add(new Pair(key, map.get(key)));				
    					}
    					
    					Collections.sort(list);
    					
    					// 행렬크기 [100][100]으로 유지.
    					for (int k = list.size()-1; k >= 50; k--) {
    				            list.remove(k);
    				      }		
    					
    					// list.size()*2 -> 
    			        // 리스트에는 Pair(number, count) 로 들어가 있고
    			        // 행렬에는 number, count 값을 각각 넣어야 하므로
    			        // *2 함.		
    					max_list_length = Math.max(list.size()*2, max_list_length);
    					int n = 1;			
    					
    					//list 에 있는 것을 input 행렬의 행에 넣어줌.				 
    					for(int k = 0; k<list.size(); k++) {
    					
    						input2[i][n++] = list.get(k).number;					
    						input2[i][n++] = list.get(k).count;				
    						
    					}
    					map.clear();
    					list.clear();
    				}
    				col_number = max_list_length;				
    		
    			// C 연산 -> 열 기준 정렬
    			// 행 개수 < 열 개수 
    			}else {					
    				
    				// 여기까지
    				for(int i=1; i<=col_number; i++) {
    					
    					for(int j=1; j<=row_number; j++) {
    				
    						int value = input[j][i];
    						
    						if(value!=0) {
    							
    							map.put(value,map.getOrDefault(value, 0)+1);
    						
    						}
    					}	
    					
    					
    					// 하나의 열이 끝나면 
    					// map 에 넣은 것을 list 에 넣어서 정렬 
    					for(Integer key:map.keySet()) {					
    						list.add(new Pair(key, map.get(key)));				
    					}
    					
    					Collections.sort(list);				
    					int n = 1;
    					
    					
    			        for (int k = list.size()-1; k >= 50; k--) {
    			            list.remove(k);
    			        }
    					
    			        
    			             
    			        max_list_length = Math.max(list.size()*2, max_list_length);
    				
    					//list 에 있는 것을 input2 행렬의 열에 넣어줌.
    					for(int k = 0; k<list.size(); k++) {							
    						
    						input2[n++][i] = list.get(k).number;					
    						input2[n++][i] = list.get(k).count;					
    						
    					}
    					map.clear();
    					list.clear();
    				}
    				row_number = max_list_length;
    				
    				
    		}
    		
    	
    		// 배열 깊은 복사  
    		for(int i=0; i<input2.length; i++) {
    			System.arraycopy(input2[i],0,input[i],0, input2[0].length);
    		}
    		
    		time++;	
    	   }
    		
         return time;
    	}
    }

     

     

     

    [핵심]

    - 처음부터 배열 크기를 [100][100]으로 설정해서 계속 사용

    - hashmap을 사용해서 각 수의 등장 횟수 구함.

    - list를 이용해서 정렬

     

    참고 블로그 : https://tussle.tistory.com/819

     

    [백준] code.plus(시뮬레이션과 구현,JAVA)17140번, 이차원 배열과 연산

    문제 링크 17140번: 이차원 배열과 연산 첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자

    tussle.tistory.com

     

    '백준 > 시뮬레이션' 카테고리의 다른 글

    20165 인내의 도미노 장인 호석  (0) 2022.05.14

    댓글

Designed by Tistory.