• [18868] 백준 - 멀티버스1(JAVA)

    2020. 8. 31.

    by. 데롱디롱

    728x90

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

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class 백준_멀티버스1 {
    	static int M, N, answer;
    	static int ssafy[][], numbers[], planets[];
    	static boolean notSame;
    
    	public static void main(String[] args) throws IOException {
    		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); 
    		StringTokenizer st = new StringTokenizer(bf.readLine()); 
    		M = Integer.parseInt(st.nextToken()); 
    		N = Integer.parseInt(st.nextToken()); 
    		ssafy = new int[M][N]; 
    
    		for (int i = 0; i < M; i++) {
    			st = new StringTokenizer(bf.readLine());
    			for (int j = 0; j < N; j++) {
    				ssafy[i][j] = Integer.parseInt(st.nextToken());
    			}
    		}
    
    		numbers = new int[2]; // 2개씩 우주 짝지어주기 
    		comb(0, 0);	// 일단 우주 2개씩 고르러가자 => 2개 골랐으면 그 안에서 selectPlanet()사용해서 행성들 비교도하자!!
    		System.out.println(answer);	// 
    	}
    
    	// 조합 : 우주 2개씩 고르는 경우의 수
    	private static void comb(int cnt, int cur) {
    		if (cnt == 2) {
    			planets = new int[2]; 
    			notSame = false;
    			selectPlanet(0, 0);	// 우주 2개 골랐으면, 이제 행성 크기를 비교해보자
    			if (!notSame)
    				answer++;	// 우주 대소 비교가 같았으므로 answer을 증가시키자
    			return;
    		} else {	
    			for (int i = cur; i < M; i++) {
    				numbers[cnt] = i;
    				comb(cnt + 1, i + 1);
    			}
    		}
    	}
    
    	// 조합 : 행성을 2개씩 고르는 경우의 수
    	private static void selectPlanet(int cnt, int cur) {
    		if (notSame == true) // notSame이 false일때만..
    			return;
    
    		if (cnt == 2) {
    			// numbers에는 우주의 번호가 담겨있고, planets에는 행성의 번호가 담겨 있음
    			// 각 우주의 행성끼리의 대소비교가 동일한가 => 크면 1, 같으면 0, 작으면 -1
    			// => 행성0 >= 행성1 ? (행성0 > 행성 1 ? 1 : 0) : -1;
    			int planet1 = ssafy[numbers[0]][planets[0]] >= ssafy[numbers[0]][planets[1]] ? (ssafy[numbers[0]][planets[0]] > ssafy[numbers[0]][planets[1]] ? 1 : 0) : -1;
    			int planet2 = ssafy[numbers[1]][planets[0]] >= ssafy[numbers[1]][planets[1]] ? (ssafy[numbers[1]][planets[0]] > ssafy[numbers[1]][planets[1]] ? 1 : 0) : -1;
    			if (planet1 != planet2)	
    				notSame = true;	// 다르면 다르다고 notSame을 true로 바꿔주어 더이상 비교하지 않도록하자
    			return;
    		} else {	
    			for (int i = cur; i < N && !notSame; i++) {
    				planets[cnt] = i;
    				selectPlanet(cnt + 1, i + 1); 
    			}
    		}
    	}
    }
    

    댓글