알고리즘/JavaScript(node.js)

[백준/Node.js] 7568번: 덩치

dev-power 2026. 1. 5. 13:23

문제 URL: https://www.acmicpc.net/problem/7568

 

순위를 매기는 문제입니다. 모든 사람을 다른 모든 사람과 비교해야 하는 전형적인 "완전탐색" 문제입니다.

 

문제 이해하기

"덩치"는 키와 몸무게 둘 다 커야 인정됩니다. 키만 크거나 몸무게만 많이 나가면 안됩니다.

  • A: 키 180, 몸무게 80
  • B: 키 175, 몸무게 90

A가 B보다 키는 크지만 몸무게는 적습니다. 그래서 둘은 비교 불가능합니다. 이런 경우 둘 다 1등이 될 수 있습니다.

 

 

입력 처리 - map과 타입 변환 주의

const input = require('fs').readFileSync('/dev/stdin').toString()
const lines = input.split('\n')
const n = Number(lines[0])

const people = lines.slice(1, n + 1).map(line => {
    const [weight, height] = line.split(' ').map(Number)
    return { weight, height }
})

여기서 중요한 포인트가 두 가지 있습니다.

 

1. split 후에는 무조건 문자열입니다

"55 185".split(' ')을 하면 ['55', '185'] 가 나옵니다. 숫자처럼 보이지만 따옴표 안에 있는 문자열입니다. 그래서 바로 .map(Number)를 붙여서 숫자로 바꿔줘야 합니다.

 

2. map은 배열을 반환합니다.

line.split(' ').map(Number)의 결과는 [55, 185] 같은 배열이고, 이거 ㄹ구조분해할당 [weight, height]로 받아서 객체로 만듭니다. map은 항상 새로운 배열을 만든다는 걸 기억해야합니다.

 

 

순위 계산하기

const ranks = people.map((person, i) => {
    let rank = 1  // 기본적으로 1등
    
    for (let j = 0; j < n; j++) {
        if (i === j) continue  // 자기 자신은 비교 안 함
        
        const other = people[j]
        // 상대방이 키도 크고 몸무게도 많이 나가면
        if (other.weight > person.weight && other.height > person.height) {
            rank++  // 내 순위는 한 단계 밀림
        }
    }
    
    return rank
})

console.log(ranks.join(' '))

로직은 단순합니다. 각 사람마다 "나보다 덩치 큰 사람이 몇 명인가?"를 세면 됩니다.

 

만약 나보다 덩치 큰 사람이 2명이면, 내 순위는 3등입니다. 나보다 큰 사람이 0명이면 1등이고요.

 


전체 풀이

const input = require('fs').readFileSync('/dev/stdin').toString()
const lines = input.split('\n')
const n = Number(lines[0])

const people = lines.slice(1, n + 1).map(line => {
    const [weight, height] = line.split(' ').map(Number)
    return { weight, height }
})

const ranks = people.map((person, i) => {
    let rank = 1
    
    for (let j = 0; j < n; j++) {
        if (i === j) continue
        
        const other = people[j]
        if (other.weight > person.weight && other.height > person.height) {
            rank++
        }
    }
    
    return rank
})

console.log(ranks.join(' '))