문제
우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다.
어떤 사람의 몸무게가 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());
}
}
}
}
}
모르겠다 ..ㅎㅎ
[백준] 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 |