알고리즘, SQL/알고리즘

백준 7568번 : 덩치

킹갓홍 2023. 12. 12. 15:19

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

 

7568번: 덩치

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

www.acmicpc.net

예시

이름 (몸무게, 키) 등수
A (55, 185) 2
B (58, 183) 2
C (88, 186) 1
D (60, 175) 2
E (46, 155) 5

 

위 표에서 C보다 더 큰 덩치의 사람이 없으므로 C는 1등이 된다. 그리고 A, B, D 각각의 덩치보다 큰 사람은 C뿐이므로 이들은 모두 2등이 된다. 그리고 E보다 큰 덩치는 A, B, C, D 이렇게 4명이므로 E의 덩치는 5등이 된다. 위 경우에 3등과 4등은 존재하지 않는다. 여러분은 학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.


처음에 문제를 보고 제한부분에 50명 이상 안넘어간다길래 이중반복문을 사용해야겠다고 생각했다.

그런데 문제의 요구조건을 깊게 생각해보지 않고 바로 풀어버려 헤메다 보니 시간이 지체됐다.

다른 분들의 풀이를 살짝 참고해보니까 조건문을 하나만 쓰길래 문제를 다시 읽어보니 키, 몸무게의 조건을 따로 생각할게 아니라 단순하게 비교대상의 키와 몸무게 둘 다 현재요소 보다가 크다면 Rank값을 1씩 올려주면 되는 것이었다.

 

풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.io.IOException;
 
public class Main {
    public static void main(String args[]) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new  StringBuilder();

        int T = Integer.parseInt(br.readLine()); //인원수

        ArrayList<int[]> list = new ArrayList<>(); //리스트에 int배열을 넣어준다. {[A키,A몸무게],[B키,B몸무게]...}
        for(int i=0; i<T; i++) { //인원수 만큼 반복문으로 키/몸무게를 채워준다.
            String str = br.readLine();
            StringTokenizer st = new StringTokenizer(str," "); //공백을 기준으로 나누기 위한 StringTokenizer
            
            list.add(new int[]{Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())});
        }


        for(int i=0; i<list.size(); i++) {
            int rank = 1; //1순위가 가장 높은 순위기 떄문에 1로 초기화 

            for(int j=0; j<list.size(); j++) {
                if (i == j) continue;
                if(list.get(i)[0] < list.get(j)[0] && list.get(i)[1] < list.get(j)[1]) { //키와 몸무게 둘 다 크다면 rank+1  
                    rank++;
                }
            }
            sb.append(rank+" "); //결과출력을 위한 StringBuilder
        }
        System.out.println(sb);
    }
}

지난번 문제에서 다른 분이  ArrayList에 int배열 저장하는 풀이를 보고나서 한 번 활용을 해봤다.

키와 몸무게를 받을 때 ArrayList<int[ ]>를 사용하면서 하나의 변수에 다 저장할 수 있었다.

 

문제풀기 전 어떻게 풀어야하는가에 대해 좀 더 생각을 해야겠다고 느꼈다..