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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

골드 4치곤 제법 쉬웠던 문제네요

import java.util.*;
import java.io.*;
public class Main {
	public static int matrix[][];
	public static int copyMatrix[][];
	public static int r;
	public static int c;
	public static int n;
	public static int m;
	public static int k;

	public static class Data{
		public int index;
		public int cnt;
		public Data(int index,int cnt){
			this.index=index;
			this.cnt=cnt;
		}
	}
	public static boolean Checking(int [][]matrix,int cnt){
		for(int i=0;i<matrix.length;i++){
			for(int j=0;j<matrix[i].length;j++){
				if(r==i&&c==j){
					if(matrix[r][c]==k){
						//System.out.println();
						System.out.println(cnt);
						return true;
					}
				}
			}
		}
		return false;
	}
	public static void PrintMatrix(int [][]matrix){
		System.out.println();
		for(int i=0;i<matrix.length;i++){
			for(int j=0;j<matrix[i].length;j++){
				System.out.print(matrix[i][j]+",");
			}
			System.out.println();
		}
		System.out.println();
	}
	public static void PrintData(ArrayList<Data>datas){
		for(int i=0;i<datas.size();i++){
			System.out.print("["+datas.get(i).index+","+datas.get(i).cnt+"]"+",");
		}
		System.out.println();

	}
	public static ArrayList<Data> Sorting(ArrayList<Data>datas){
		Collections.sort(datas,  new Comparator<Data>() {
			@Override
			public int compare(Data d1, Data d2) {
				if(d1.cnt>d2.cnt){
					return 1;
				}else if(d1.cnt==d2.cnt){
					if(d1.index>d2.index){
						return 1;
					}else{
						return -1;
					}

				}else if(d1.cnt < d2.cnt){
					return -1;
				}
				return 0;
			}
		});

		return datas;
	}

	public static boolean MakeMatrix(ArrayList<ArrayList<Integer>>gdatas , boolean bRow ,int cnts){
		int imaxs=0;
		int jmaxs=0;
		for(int i=0;i<gdatas.size();i++){
			imaxs=Math.max(gdatas.size(),imaxs);
			for(int j=0;j<gdatas.get(i).size();j++){
				jmaxs=Math.max(gdatas.get(i).size(),jmaxs);
			}

		}
	//	System.out.println("imaxs:"+imaxs+","+"jmaxs"+jmaxs); //3 6

		if(bRow==true){
			matrix=new int[imaxs][jmaxs];
			n=imaxs;
			m=jmaxs;
		}else{
			matrix=new int[jmaxs][imaxs];
			n=jmaxs;
			m=imaxs;
		}

		for(int i=0;i<gdatas.size();i++){
			for(int j=0;j<gdatas.get(i).size();j++){
				//0 0  0 0
				//1 0  0 1
				// 2 0  0 2
				if(bRow==true){
					matrix[i][j]=gdatas.get(i).get(j);
				}else{
					matrix[j][i]=gdatas.get(i).get(j);
				}

			}
		}
		// PrintMatrix(matrix);
		 return Checking(matrix,cnts);
	}

	public static boolean RowCalculate(boolean bRow,int cnts){
		//row sort
		//System.out.println();
		ArrayList<ArrayList<Integer>>gdatas=new ArrayList<>();
		//System.out.println(n+","+m);
		for(int i=0;i<n;i++){
			ArrayList<Data>datas=new ArrayList<>();

			for(int j=0;j<m;j++){
				int tmp=matrix[i][j];
				boolean bCheck=false;

				for(int s=0;s<datas.size();s++){
					if(datas.get(s).index==tmp&&tmp!=0){
						bCheck=true;
						int tmpcnt=datas.get(s).cnt;
						datas.get(s).cnt=tmpcnt+1;
						break;
					}

				}
				if(bCheck==false&&tmp!=0){
					datas.add(new Data(tmp,1));
				}

			}


			//sorting
			//ArrayList<Data> tmpdatas=new ArrayList<>();
			Sorting(datas);
			//makematrix
			//PrintData(datas);

			ArrayList<Integer>tmpDatas=new ArrayList<>();

			for(int s=0;s<datas.size();s++){

				tmpDatas.add(datas.get(s).index);
				tmpDatas.add(datas.get(s).cnt);
			}
			gdatas.add(tmpDatas);

			//System.out.println();
		}

		return 	MakeMatrix(gdatas,bRow,cnts);

	}
	public static boolean ColumCalculate(boolean bRow,int cnts){
		//row sort

		ArrayList<ArrayList<Integer>>gdatas=new ArrayList<>();

		for(int i=0;i<m;i++){
			ArrayList<Data>datas=new ArrayList<>();

			for(int j=0;j<n;j++){
				int tmp=matrix[j][i];
				boolean bCheck=false;

				for(int s=0;s<datas.size();s++){
					if(datas.get(s).index==tmp&&tmp!=0){
						bCheck=true;
						int tmpcnt=datas.get(s).cnt;
						datas.get(s).cnt=tmpcnt+1;
						break;
					}

				}
				if(bCheck==false&&tmp!=0){
					datas.add(new Data(tmp,1));
				}

			}


			//sorting
			//ArrayList<Data> tmpdatas=new ArrayList<>();
			Sorting(datas);
			//makematrix
			//PrintData(datas);

			ArrayList<Integer>tmpDatas=new ArrayList<>();

			for(int s=0;s<datas.size();s++){

				tmpDatas.add(datas.get(s).index);
				tmpDatas.add(datas.get(s).cnt);
			}
			gdatas.add(tmpDatas);

			//System.out.println();
		}

		return MakeMatrix(gdatas,bRow,cnts);

	}

	public static void main(String[] args) throws Exception {
		Scanner scan = new Scanner(System.in);
		 r=scan.nextInt()-1;
		 c=scan.nextInt()-1;
		 k=scan.nextInt(); //anw
		n=3;
		m=3;

		matrix=new int[n][m];
		for(int i=0;i<3;i++){
			for(int j=0;j<3;j++){
				matrix[i][j]=scan.nextInt();
			}
		}

		boolean bCheck= Checking(matrix,0);
		//System.out.println(r+","+c);
		for(int i=1;i<=100;i++){
			if(bCheck==true){

				break;
			}
			if(n>=m){
				//r cal
				bCheck=RowCalculate(true,i);
			}else{
				//c cal
				bCheck=ColumCalculate(false,i);
				//ColumCalculate();
			}
		}
		if(bCheck==false){
			System.out.println(-1);
		}

	}
}

'알고리즘 공부' 카테고리의 다른 글

백준 구간 합 구하기  (1) 2024.04.04
백준 - 감시  (0) 2024.04.04
백준 마법사 상어와 파이어스톰  (1) 2024.04.03
백준 마법사 상어와 토네이도  (0) 2024.04.02
백준 최소 회의실 개수  (0) 2024.04.02

+ Recent posts