[백준] 17140 - 이차원 배열과 연산

­Valentine·2022년 3월 27일

Algorithm

목록 보기
22/22

17140번: 이차원 배열과 연산

  • 코드
    package review;
    
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.StringTokenizer;
    
    public class ex_17140 {
        static int lenR,lenC;
        static int[][]A;
        private static class Node implements Comparable<Node>{
            int num;
            int count;
            Node(int num, int count){
                this.num=num;
                this.count=count;
            }
    
            @Override
            public int compareTo(Node o) {
                if(o.count==this.count) return this.num-o.num;
                return this.count-o.count;
            }
    
            @Override
            public String toString() {
                return "Node{" +
                        "num=" + num +
                        ", count=" + count +
                        '}';
            }
        }
        public static void main(String[] args) throws IOException {
            System.setIn(new FileInputStream("input/17140.txt"));
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
            int r = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            int k = Integer.parseInt(st.nextToken());
            lenR=3;
            lenC=3;
            A=new int[100][100];
    
            for(int i=0;i<3;i++){
                st = new StringTokenizer(br.readLine());
                for(int j=0;j<3;j++){
                    A[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            int answer=0;
            while(true){
                if(A[r-1][c-1]==k) break;
                if(answer>100){
                    answer=-1;
                    break;
                }
                answer++;
                if(lenR>=lenC){
                    sortR();
                }else{
                    sortC();
                }
            }
            System.out.println(answer);
        }static void sortR(){
            int maxC=0;
            for(int i=0;i<lenR;i++){
                int []temp=new int[101];
                int m=0;
                int index=0;
                ArrayList<Node>arr=new ArrayList<>();
    
                for(int j=0;j<lenC;j++){
                    temp[A[i][j]]++;
                    m=Math.max(m,A[i][j]);
                    A[i][j]=0;
                }
                for(int j=1;j<=m;j++){
                    if(temp[j]!=0) arr.add(new Node(j,temp[j]));
                }
                Collections.sort(arr);
                for(int j=0;j< arr.size()*2;j+=2){
                    A[i][j]=arr.get(index).num;
                    A[i][j+1]=arr.get(index).count;
                    index++;
                }
                maxC=Math.max(maxC,arr.size()*2);
            }
            lenC=maxC;
        }static void sortC(){
            int maxR=0;
            for(int i=0;i<lenC;i++){
                int []temp=new int[101];
                int m=0;
                int index=0;
                ArrayList<Node>arr=new ArrayList<>();
    
                for(int j=0;j<lenR;j++){
                    temp[A[j][i]]++;
                    m=Math.max(m,A[j][i]);
                    A[j][i]=0;
                }
                for(int j=1;j<=m;j++){
                    if(temp[j]!=0) arr.add(new Node(j,temp[j]));
                }
                Collections.sort(arr);
                for(int j=0;j< arr.size()*2;j+=2){
                    A[j][i]=arr.get(index).num;
                    A[j+1][i]=arr.get(index).count;
                    index++;
                }
                maxR=Math.max(maxR,arr.size()*2);
            }
            lenR=maxR;
        }
    }
  • 아이디어
    • 개수를 ArrayList에 Node 형태로 저장하고 정렬하여 집어넣기
profile
천체관측이 취미

0개의 댓글