ice rabbit programming

[BOJ] 상금 헌터 본문

PS/BOJ

[BOJ] 상금 헌터

판교토끼 2020. 9. 6. 16:55

www.acmicpc.net/problem/15953

 

15953번: 상금 헌터

첫 번째 줄에 제이지가 상상력을 발휘하여 가정한 횟수 T(1 ≤ T ≤ 1,000)가 주어진다. 다음 T개 줄에는 한 줄에 하나씩 제이지가 해본 가정에 대한 정보가 주어진다. 각 줄에는 두 개의 음이 아닌

www.acmicpc.net

2018년 카카오 코드 페스티벌 1번 문제이다. 그냥 if-else로 분기처리하고도 풀 수 있어 난이도는 많이 쉬운 편에 속한다. 이번에 Python으로 다시 풀어보면서 포스팅을 하게 되었다.

문제는 단순하다. 대회 두 번의 등수가 주어지고, 그에 대한 상금 정보를 이용해 총 상금을 구하는 문제이다.

C++

#include <iostream>
using namespace std;
int last(int n) {
	if (n == 0 || n>21)
		return 0;
	else if (n == 1)
		return 5000000;
	else if (n > 1 && n <= 3)
		return 3000000;
	else if (n > 3 && n <= 6)
		return 2000000;
	else if (n > 6 && n <= 10)
		return 500000;
	else if (n > 10 && n <= 15)
		return 300000;
	else if (n > 15 && n <= 21)
		return 100000;
}
int present(int n) {
	if (n == 0 || n>31)
		return 0;
	else if (n == 1)
		return 5120000;
	else if (n > 1 && n <= 3)
		return 2560000;
	else if (n > 3 && n <= 7)
		return 1280000;
	else if (n > 7 && n <= 15)
		return 640000;
	else if (n > 15 && n <= 31)
		return 320000;	
}

int main() {
	cin.tie(NULL);
	ios::sync_with_stdio(false);
	int T = 0;
	cin >> T;
	while (T--) {
		int a = 0, b = 0;
		cin >> a >> b;
		cout << last(a) + present(b) << endl;
	}
	return 0;
}

이런 식으로 그냥 로직을 하드코딩해도 풀 수 있다. 1년 전에 풀었던 코드인데 그나마 함수로는 만들어 두었다..

Python

T = int(input())
a_money = {1:5000000, 2:3000000, 3:2000000, 4:500000, 5:300000, 6:100000}
b_money = {1:5120000, 2:2560000, 3:1280000, 4:640000, 5:320000}
for test_case in range(T):
    a, b = map(int, input().split())
    result = 0
    if a > 0:
        a_place = 0
        for index in range(1,7):
            a_place += index
            if a_place >= a:
                result += a_money[index]
                break

    if b > 0:
        b_place = 0
        for index in range(1,6):
            b_place += 2 ** (index-1)
            if b_place >= b:
                result += b_money[index]
                break
            

    print(result)

위처럼 단순하게 풀어도 되겠지만, 조금 더 제너럴하고 간결하게 풀고 싶어서 첫 대회와 두 번째 대회의 인원 증가의 패턴을 이용하여 반복문을 사용했다. 또한 switch-case문이 python에는 없지만 dict를 이용해 비슷하게 동작하도록 하였다. 풀고나서 보니 하나의 함수로 만들고 function delegate를 받게 처리해도 되었을 것 같다.

'PS > BOJ' 카테고리의 다른 글

[BOJ] 비밀번호 찾기  (0) 2020.09.06
[BOJ] Sort 마스터 배지훈  (0) 2020.04.18