728x90

BOJ 7568 덩치

문제

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 

어떤 사람의 몸무게가 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명으로 이루어진 집단에서 각 사람의 덩치와 그 등수가 표시된 표이다.
이름 (몸무게, 키)덩치 등수
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명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.

시간 제한 : 1 초
메모리 제한 : 128 MB

입력

첫 줄에는 전체 사람의 수 N이 주어진다. 

그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 나타난다.

출력

여러분은 입력에 나열된 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다. 

단, 각 덩치 등수는 공백문자로 분리되어야 한다.

제한

· 2 ≤ N ≤ 50
· 10 ≤ x, y ≤ 200

예제 입력 1

5
55 185
58 183
88 186
60 175
46 155

예제 출력 1

2 2 1 2 5

풀이

n = int(input())
peoples = []

for i in range(n) :
    weight, height = map(int, input().split())
    peoples.append([weight, height])

for i in peoples :
    rank = 1
    for j in peoples :
        if i[0] < j[0] and i[1] < j[1] :
            rank += 1
    print(rank, end=' ')

 

728x90
728x90

BOJ 2231 분해합

문제

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 

어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 

예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 

물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 

반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

시간 제한 : 2 초 
메모리 제한 : 192 MB

입력

첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

출력

첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

예제 입력 1

216

예제 출력 1

198

풀이

import sys
input = sys.stdin.readline

n = int(input())
res = 0

for i in range(1, n+1) :
    n_list = list(map(int, str(i)))
    n_sum = i + sum(n_list)
    if n_sum == n :
        res = i
        break

print(res)
728x90
728x90

BOJ 2798 블랙잭

문제

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 

카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 

블랙잭은 카지노마다 다양한 규정이 있다.

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 

그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 

그런 후에 딜러는 숫자 M을 크게 외친다.

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 

블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

시간 제한 : 1 초
메모리 제한 : 128 MB

입력

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 

둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.

합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.

예제 입력 1

5 21
5 6 7 8 9

예제 출력 1

21

예제 입력 2

10 500
93 181 245 214 315 36 185 138 216 295

예제 출력 2

497

풀이

n, m = map(int,input().split())
cards = list(map(int,input().split()))
res = []

for i in range(n-2) :
    for j in range(i+1, n-1) :
        for k in range(j+1, n) :
            if cards[i] + cards[j] + cards[k] <= m :
                res.append(cards[i] + cards[j] + cards[k])

print(max(res))
728x90
728x90

BOJ 4673 셀프 넘버

문제

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 

양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 

예를 들어, d(75) = 75+7+5 = 87이다.

양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다. 

예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 

다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 

생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다. 

생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 

1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97

10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

시간 제한 : 1 초
메모리 제한 : 256 MB

입력

입력은 없다.

출력

10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.

예제 입력 1

 

예제 출력 1

1
3
5
7
9
20
31
42
53
64
 |
 |       <-- a lot more numbers
 |
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993

풀이

def self_number(num):
    self_num = num
    while num != 0:
        self_num += num%10
        num //= 10
    return self_num
        
res = set()

for i in list(range(1,10001)):
    if i not in res:
        print(i)
    res.add(self_number(i))
728x90
728x90

CodeUp 3321 : 최고의 피자

문제 설명

vega 선생님은 Miss 피자 가게의 단골 손님이다.

그는 이번 달부터 절약 생활을 시작했다.

그래서 그는 피자 가게에서 주문할 수 있는 피자 중 1 달러 당 열량이 최대가 되는 피자를 주문하고 싶어한다.

이러한 피자를 "최고의 피자"라고 부르기로 하자.

"최고의 피자"는 1종류가 아니다.

Miss 피자는 N 종류의 토핑에서 여러 종류를 자유롭게 선택하여, 도우 위에 올려 주문할 수있다.

같은 토핑을 2 개 이상 올릴 수 없다.

도우에 토핑을 하나도 하지 않은  피자도 주문할 수있다.

도우의 가격은 A 달러이며, 토핑의 가격은 모두 B 달러이다.

실제 피자 가격은 도우의 가격과 토핑 가격의 합계이다.

즉, 토핑을 k 종류 (0 ≦ k ≦ N) 한 피자의 가격은 A + k × B 원이다.

피자 전체의 칼로리는 도우 열량과 토핑 칼로리의 합계이다.

도우의 가격과 토핑의 가격, 그리고 도우와 각 토핑 열량 값이 주어 졌을 때, 

"최고의 피자"의 1 달러 당 열량의 수를 구하는 프로그램을 작성하시오.

시간 제한 : 1 Sec
메모리 제한 : 128 MB

입력

첫 번째 줄에는 토핑 종류 수를 나타내는 하나의 정수 N (1 ≦ N ≦ 100)이 입력된다.

두 번째 줄에는 두 개의 정수 A, B (1 ≦ A ≦ 1000,1 ≦ B ≦ 1000)가 공백을 구분으로 입력된다. 

A는 도우의 가격, B는 토핑의 가격을 나타낸다.

세 번째 줄에는 도우의 칼로리를 나타내는 정수 C (1 ≦ C ≦ 10000)가 입력된다.

3 + i 행 (1 ≦ i ≦ N)는 i 번째의 토핑 칼로리 수를 나타내는 정수 Di (1 ≦ Di ≦ 10,000)가 입력된다.

출력

"최고의 피자" 1 달러 당 열량의 수를 소수점 이하는 버리고 정수로 출력한다.

입력 예시

3
12 2
200
50
300
100

출력 예시

37

풀이

n = int(input())
a, b = map(int, input().split())

c = int(input())
tp_list = []
for i in range(n) :
    tp_list.append(int(input()))

tp_list.sort(reverse=True)

res = 0 
price = 0
cal = 0

for i in tp_list :
    cal += i
    price += b
    tmp=(c+cal)/float(a+price)

    if res>tmp:
        break
    else:
        res=tmp

print(int(res))
728x90
728x90

CodeUp 3301 : 거스름돈

문제 설명

어떤 가게의 욕심쟁이 점원은 거스름돈을 나눠줄때 거스름돈의 개수를 적게해서 주고자 한다.

거스름돈을 입력 받아 점원이 줄 수 있는 최소 거스름돈의 개수를 출력하시오.

예를 들어 54520원인 경우,

거스름돈으로 50000원권 1장, 1000원권 4장, 500원 1개, 10원 2개 해서 총 8개이다.

(※ 현재 우리나라가 사용하고 있는 화폐를 사용한다. 10원 50원 100원 500원 1,000원 5,000원 10,000원 50,000원)

시간 제한 : 1 Sec
메모리 제한 : 128 MB

입력

거스름돈 n이 입력된다. ( n은10이상의  int 범위 )

출력

최소 거스름돈의 개수를 출력한다.

입력 예시

54520

출력 예시

8

풀이

N = int(input())

money = [50000, 10000, 5000, 1000, 500, 100, 50, 10]
cnt = 0
for i in money :
    cnt += N // i
    N %= i

print(cnt)
728x90
728x90

CodeUp 2001 : 최소 대금

문제 설명

파파 파스타 가게는 점심 추천 파스타와 생과일 쥬스 세트 메뉴가 인기가 좋다.

이 세트 메뉴를 주문하면 그 날의 3 종류의 파스타와 2 종류의 생과일 쥬스에서 하나씩 선택한다.

파스타와 생과일 쥬스의 가격 합계에서 10%를 더한 금액이 대금된다.

어느 날의 파스타와 생과일 쥬스의 가격이 주어 졌을 때, 그 날 세트 메뉴의 대금의 최소값을 구하는 프로그램을 작성하라.

시간 제한 : 1 Sec
메모리 제한 : 128 MB

입력

입력은 5 행으로 이루어지며, 한 줄에 하나씩 양의 정수가 적혀있다.

1행의 정수는 첫 번째 파스타 가격이다.

2행의 정수는 두 번째 파스타 가격이다.

3행의 정수는 세 번째 파스타 가격이다.

4행의 정수는 첫 번째 생과일 쥬스 가격이다.

5행의 정수는 두 번째 생과일 쥬스의 가격이다.

(모든 파스타와 생과일 쥬스의 가격은 100 원이상 2000원 이하이다.)

출력

그날 세트 메뉴의 최소 대금을 소수 첫째자리까지 출력하시오.

입력 예시

800
700
900
198
330

출력 예시

987.8

풀이

pasta = []
juice = []

for i in range(3) :
    pasta.append(int(input()))

for i in range(2) :
    juice.append(int(input()))

res = (min(pasta) + min(juice)) * 1.1

print(f'{res:.1f}')

 

728x90
728x90

BOJ 2847 게임을 만든 동준이

문제

학교에서 그래픽스 수업을 들은 동준이는 수업시간에 들은 내용을 바탕으로 스마트폰 게임을 만들었다. 

게임에는 총 N개의 레벨이 있고, 각 레벨을 클리어할 때 마다 점수가 주어진다. 

플레이어의 점수는 레벨을 클리어하면서 얻은 점수의 합으로, 이 점수를 바탕으로 온라인 순위를 매긴다. 

동준이는 레벨을 난이도 순으로 배치했다. 

하지만, 실수로 쉬운 레벨이 어려운 레벨보다 점수를 많이 받는 경우를 만들었다.

이 문제를 해결하기 위해 동준이는 특정 레벨의 점수를 감소시키려고 한다. 

이렇게해서 각 레벨을 클리어할 때 주는 점수가 증가하게 만들려고 한다.

각 레벨을 클리어할 때 얻는 점수가 주어졌을 때, 몇 번 감소시키면 되는지 구하는 프로그램을 작성하시오. 

점수는 항상 양수이어야 하고, 1만큼 감소시키는 것이 1번이다. 항상 답이 존재하는 경우만 주어진다. 

정답이 여러 가지인 경우에는 점수를 내리는 것을 최소한으로 하는 방법을 찾아야 한다.

시간 제한 : 1 초
메모리 제한 : 128 MB

입력

첫째 줄에 레벨의 수 N이 주어진다. 

(1≤ N ≤ 100)다음 N개 줄에는 각 레벨을 클리어하면 얻는 점수가 첫 번째 레벨부터 마지막 레벨까지 순서대로 주어진다. 

점수는 20,000보다 작은 양의 정수이다.

출력

첫째 줄에 점수를 몇 번 감소시키면 되는지 출력한다.

예제 입력 1

3
5
5
5

예제 출력 1

3

예제 입력 2

4
5
3
7
5

예제 출력 2

6

풀이

import sys
input = sys.stdin.readline
n = int(input())
levels = [int(input()) for _ in range(n)]
cnt = 0

for i in range(n-1, 0, -1) :
    if levels[i] <= levels[i-1] :
        cnt += (levels[i-1] - levels[i]) + 1 
        levels[i-1] = levels[i] - 1

print(cnt)
728x90

+ Recent posts