• TOC {:toc}

이 글은 백준 온라인 저지의 2484번 문제를 파이썬(Python)으로 풀이한 것을 모아놓은 글입니다.

일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.

2021.08.12

메모리 시간 코드 길이
29200 KB 80 ms 470 B
단계 시작 시각 끝난 시각 걸린 시간
문제 이해 15:59:18 16:01:16
풀이 생각 1 16:06:58 16:13:37
코딩 1 16:13:46 16:24:18
풀이 생각 2 16:24:19 16:28:34
코딩 2 16:28:38 16:36:14
import sys
input = sys.stdin.readline

P = []
for _ in range(int(input())):
    D = sorted(list(map(int, input().split())), reverse=True)
    l = len(set(D))

    if l == 1:
        P.append(D[0] * 5000 + 50000)
    elif l == 2:
        if D[1] == D[2]:
            P.append(D[1] * 1000 + 10000)
        else:
            P.append(D[1] * 500 + D[2] * 500 + 2000)
    elif l == 3:
        P.append(sum([[0, s * 100 + 1000][D.count(s) - 1] for s in set(D)]))
    else:
        P.append(D[0] * 100)

print(max(P))

아이디어 & 풀이

입력받은 리스트를 내림차순으로 정렬한 뒤 Set으로 중복 원소를 없앤다.

같은 눈의 개수와 Set의 원소 수를 정리하면 다음과 같다.

len(set(D)) 같은 원소의 개수 리스트 D
1 4개 [a, a, a, a]
2 3개 [a, a, a, b], [a, b, b, b]
2 2개 [a, a, b, b]
3 2개 [a, b, c, c], [a, b, b, c], [a, a, b, c]
4 1개 [a, b, c, d]
  • len(set(D))가 2인 경우 두, 세 번째 원소를 비교해서 같은 원소의 수가 2개인지 알 수 있다.
    • 같으면: 3개 + 1개 조합
    • 다르면: 2개 + 2개 조합

각 경우 리스트 D에서 적절한 원소를 택해 총상금을 계산하고 이를 P에 추가한다.

모든 사람의 상금을 P에 추가하면 P의 최댓값을 출력한다.

피드백

  • 같은 눈금이 2개만 나오는 경우 상금 계산을 (sum(D) - sum(set(D))) * 100으로 하면 깔끔하다.

2023.01.18

메모리 시간 코드 길이
11276 KB 132 ms 1059 B
단계 시작 시각 끝난 시각 걸린 시간
풀이 생각 18:02:16 18:06:42
코딩 18:06:45 18:15:36
const fs = require("fs");
const input = fs.readFileSync('/dev/stdin').toString().trim().split("\n");

const [N, ...lines] = input;

function score(dice) {
    const scaleCount = [...new Set(dice)].length;

    if (scaleCount === 1) {
        return 50000 + dice[0] * 5000;
    } else if (scaleCount === 2) {
        if (dice[1] === dice[2]) {
            return 10000 + dice[1] * 1000;
        } else {
            return 2000 + (dice[1] + dice[2]) * 500;
        }
    } else if (scaleCount === 3) {
        if (dice[0] === dice[1]) {
            return 1000 + dice[0] * 100;
        } else if (dice[1] === dice[2]) {
            return 1000 + dice[1] * 100;
        } else {
            return 1000 + dice[2] * 100;
        }
    } else {
        return dice[0] * 100;
    }
}

function main() {
    const res = [];
    lines.forEach((line) => {
        const dice = line
            .split(" ")
            .map((n) => parseInt(n))
            .sort((a, b) => b - a);

        res.push(score(dice));
    });

    return Math.max(...res);
}

console.log(main());