코딩테스트/⚪백준_ 단계별로 풀어보기

[브루트포스] 덩치

1son 2023. 3. 8. 11:37
문제

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다.

어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다.

두 사람 A 와 B의 덩치가 각각 (x, y), (p, q)라고 할 때 x > p 그리고 y > q 이라면

우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다.

 

예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56, 177), (45, 165) 라고 한다면

A의 덩치가 B보다 큰 셈이 된다. 그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다.

예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55, 173)이라면

몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로,

 

"덩치"로만 볼 때 C와 D는 누구도 상대방보다 더 크다고 말할 수 없다.

N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 "큰 덩치"의 사람의 수로 정해진다. 만일 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다. 이렇게 등수를 결정하면 같은 덩치 등수를 가진 사람은 여러 명도 가능하다. 아래는 5명으로 이루어진 집단에서 각 사람의 덩치와 그 등수가 표시된 표이다.

 

 

위 표에서 C보다 더 큰 덩치의 사람이 없으므로 C는 1등이 된다.

그리고 A, B, D 각각의 덩치보다 큰 사람은 C뿐이므로 이들은 모두 2등이 된다.

그리고 E보다 큰 덩치는 A, B, C, D 이렇게 4명이므로 E의 덩치는 5등이 된다.

위 경우에 3등과 4등은 존재하지 않는다.

여러분은 학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.

 

 

입력

첫 줄에는 전체 사람의 수 N이 주어진다.

그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 나타난다.

 

출력

여러분은 입력에 나열된 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다.

단, 각 덩치 등수는 공백문자로 분리되어야 한다.

 

import java.util.*;
import java.io.*;

public class Main{
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[][] arr = new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++){
                for(int k=j;k<n;k++){
                    arr[][] =Integer.parseInt(st.nextToken());
                    arr[][] = Integer.parseInt(st.nextToken());
                }
            }
            
        }
        
        
    }
}

모르겠다 ..ㅎㅎ

https://st-lab.tistory.com/99

 

[백준] 7568번 : 덩치 - JAVA [자바]

 

st-lab.tistory.com

+ 먼저 문제를 보면 '덩치가 크다'는 기준은 키와 몸무게가 모두 비교하려는 대상보다 클 때이다.

즉, 어느 한 쪽이라도 만족 못할 경우 덩치가 크다고 할 수 없다.

 

 

그럼 브루트포스로 어떻게 풀 수 있을까?

일단 키와 몸무게를 담는 2차원 배열을 생성한 뒤,

이중 반복문을 통해 각 배열의 인덱스를 모두 탐색하는 방법이다.

 

 

이때 각 비교되는 두 인덱스의 각각의 키와 몸무게를 비교하여 랭크를 지정해주는 방식이다.

좀 더 상세하게 말하자면 rank = 1 부터 시작하여 해당 사람보다 덩치가 큰 사람이 있을 경우

해당 사람은 순위는 뒤로 밀리기 때문에 rank 값을 증가시키는 것이다.

 

 

이렇게 자기 자신을 제외한 나머지 사람들을 모두 비교하여 rank 값을 출력하면 된다.

 

만약 자기보다 덩치가 큰 사람이 없을 경우 rank 는 1 이 될 것이고,

덩치가 큰 사람이 K 명 있을 경우 rank + K 가 자신의 랭크(순위)가 될 것이다.

 

+ 문자열을 입력받아서 split 이용해서 분리해주었다. 

import java.util.*;
import java.io.*;

public class Main{
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        
        int[][] arr = new int[n][2];
        
        String[] sp;
        for(int i=0;i<n;i++){
            sp = br.readLine().split(" "); //문자열 분리
            arr[i][0] =Integer.parseInt(sp[0]); //[i][0]:몸무게
            arr[i][1] = Integer.parseInt(sp[1]);//[i][1]:키     
        }
        
        for(int i=0;i<n;i++){
            int rank = 1; //1로 초기화 1등이 제일 초기값이니까
            
            for(int j=0;j<n;j++){
                if(i==j) continue; //같은 거를 비교하는 꼴이 되니까?
                if(arr[i][0] < arr[j][0] && arr[i][1] < arr[j][1]){//무게 비교 && 키 비교
                    rank++; //i가 기준이니까, 나보다 덩치큰 사람 발견했으니 +1
                }
            }
            System.out.print(rank+" ");
        }
        
        
    }
}

sp 문자열 선언해서 

.split(" ")이용해서 각각을 arr에 넣어준다는 것 

'코딩테스트 > ⚪백준_ 단계별로 풀어보기' 카테고리의 다른 글

[백트래킹] N과 M(1)  (0) 2023.03.10
[브루트포스] 영화감독 숌  (0) 2023.03.09
[브루트 포스] 블랙잭  (0) 2023.03.07
[재귀] 재귀의 귀재  (0) 2023.03.06
[재귀] 피보나치수 5  (0) 2023.03.05