문제풀이/BruteForce

[JAVA] 백준 7568번 덩치 : 브루트 포스 (이차원 배열)

IT록흐 2021. 7. 29. 10:52
반응형
 

7568번: 덩치

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩

www.acmicpc.net

 

1. 문제 추상화

A(x, y), B(p, q)에서 x > p 그리고 y > q 이면 A가 B보다 크다고 할 때,입력된 값들의 크기 순위를 매겨라. 순위는 자신보다 큰 수의 개수 + 1이다. 

 

2. 알고리즘

풀이는 쉽지만 문제 뉘앙스가 헷갈릴 여지가 있다. 상식적으로 몸무게가 같고 키가 크면 덩치가 더 크다 말할 수 있다. 그러나 여기서는 아니다. 키와 몸무게가 둘 다 커야 덩치가 큰거다. 문제를 풀 때는 상식이 아닌 조건으로 풀어야 한다.

 

1. 이차원 배열 생성 및 입력

2.  [ A(x, y), B(p, q)에서 x > p 그리고 y > q ] 조건에 부합하는 경우 탐색 ( 브루트 포스 )

 

3. 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	private static StringTokenizer stz;
	private static BufferedReader br; 
	private static BufferedWriter bw;
	private static StringBuilder sb;
	private static int[][] people;

	public static void main(String[] args) throws NumberFormatException, IOException {
		createObjects();
		createPeopleArr(); // 이차원 배열 생성 및 초기화
		processRank(); // 랭크 연산 처리
	}
	
	public static void createObjects(){
		 br = new BufferedReader(new InputStreamReader(System.in));
		 bw = new BufferedWriter(new OutputStreamWriter(System.out));
		 sb = new StringBuilder();
	}
	
	public static void createPeopleArr() throws NumberFormatException, IOException {
		makePeopleArr();
		setPeopleArr();
	}
	
	public static void processRank() throws IOException {
		getRank();
		printRank();
       		closeIO();
	}
	
	public static void makePeopleArr() throws NumberFormatException, IOException{
		int testcase = Integer.parseInt(br.readLine());
		people = new int[testcase][2];
	}
	
	public static void setPeopleArr() throws IOException {
		for(int i=0;i<people.length;i++) {
			stz = new StringTokenizer(br.readLine());
			int weight = Integer.parseInt(stz.nextToken());
			int height = Integer.parseInt(stz.nextToken());
			
			people[i][0] = weight;
			people[i][1] = height;
		}
	}
	
	public static void getRank() {
		for(int i=0; i<people.length;i++) {
			sb.append(countRank(i)+1).append(" ");
		}
	}
	
	public static void printRank() throws IOException {
		bw.write(sb.toString());
		bw.flush();
	}
	
	public static void closeIO() throws IOException {
		bw.close();
		br.close();
	}
	
	public static int countRank(int i) {
		int weight = people[i][0];
		int height = people[i][1];
		int count = 0;
		for(int j=0; j<people.length;j++) {
			if(i==j)continue;
			if(isBig(weight,height,j)) {
				count++;
			}
		}
		return count;
	}
	
	public static boolean isBig(int weight, int height, int j) {
		if( weight < people[j][0] && height < people[j][1]) {
			return true;	
		}
		return false;
	}

}
반응형