728x90

BOJ 2864 5와 6의 차이

문제

상근이는 2863번에서 표를 너무 열심히 돌린 나머지 5와 6을 헷갈리기 시작했다.

상근이가 숫자 5를 볼 때, 5로 볼 때도 있지만, 

6으로 잘못 볼 수도 있고, 6을 볼 때는, 6으로 볼 때도 있지만, 5로 잘못 볼 수도 있다.

두 수 A와 B가 주어졌을 때, 상근이는 이 두 수를 더하려고 한다. 이때, 

상근이가 구할 수 있는 두 수의 가능한 합 중, 최솟값과 최댓값을 구해 출력하는 프로그램을 작성하시오.

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

입력

첫째 줄에 두 정수 A와 B가 주어진다. (1 <= A,B <= 1,000,000)

출력

첫째 줄에 상근이가 구할 수 있는 두 수의 합 중 최솟값과 최댓값을 출력한다.

예제 입력 1

11 25

예제 출력 1

36 37

예제 입력 2

1430 4862

예제 출력 2

6282 6292

예제 입력 3

16796 58786

예제 출력 3

74580 85582

풀이

a, b = input().split()

min = int(a.replace('6','5'))+int(b.replace('6','5'))
max = int(a.replace('5','6'))+int(b.replace('5','6'))

print(min, max)
728x90
728x90

BOJ 2720 세탁소 사장 동혁

문제

미국으로 유학간 동혁이는 세탁소를 운영하고 있다. 

동혁이는 최근에 아르바이트로 고등학생 리암을 채용했다.

동혁이는 리암에게 실망했다.

리암은 거스름돈을 주는 것을 자꾸 실수한다.

심지어 $0.5달러를 줘야하는 경우에 거스름돈으로 $5달러를 주는것이다!

어쩔수 없이 뛰어난 코딩 실력을 발휘해 리암을 도와주는 프로그램을 작성하려고 하지만, 

디아블로를 하느라 코딩할 시간이 없어서 이 문제를 읽고 있는 여러분이 대신 해주어야 한다.

거스름돈의 액수가 주어지면 리암이 줘야할 

쿼터(Quarter, $0.25)의 개수, 다임(Dime, $0.10)의 개수, 니켈(Nickel, $0.05)의 개수, 페니(Penny, $0.01)

의 개수를 구하는 프로그램을 작성하시오. 

거스름돈은 항상 $5.00 이하이고, 손님이 받는 동전의 개수를 최소로 하려고 한다. 

예를 들어, $1.24를 거슬러 주어야 한다면, 손님은 4쿼터, 2다임, 0니켈, 4페니를 받게 된다.

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

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 

각 테스트 케이스는 거스름돈 C를 나타내는 정수 하나로 이루어져 있다. 

C의 단위는 센트이다. (1달러 = 100센트) (1<=C<=500)

출력

각 테스트케이스에 대해 필요한 쿼터의 개수, 다임의 개수, 니켈의 개수, 페니의 개수를 공백으로 구분하여 출력한다.

예제 입력 1

3
124
25
194

예제 출력 1

4 2 0 4
1 0 0 0
7 1 1 4

풀이

import sys

input = sys.stdin.readline
T = int(input())

for i in range(T):
    C = int(input())
    res = []
    coins = [25, 10, 5, 1]
    for j in range(len(coins)):
        res.append(C // coins[j])
        C %= coins[j]

    print(*res)
728x90
728x90

BOJ 10610 30

문제

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 

미르코는 30이란 수를 존경하기 때문에, 

그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

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

입력

N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 

그 수가 존재하지 않는다면, -1을 출력하라.

예제 입력 1

30

예제 출력 1

30

예제 입력 2

102

예제 출력 2

210

예제 입력 3

2931

예제 출력 3

-1

예제 입력 4

80875542

예제 출력 4

88755420

풀이

n = list(input())
n.sort(reverse=True)
nSum = 0

for i in n :
    nSum += int(i)

if nSum % 3 == 0 and '0' in n :
    print(''.join(n))
else : 
    print(-1)
728x90
728x90

BOJ 1789 수들의 합

문제

서로 다른 N개의 자연수의 합이 S라고 한다. 

S를 알 때, 자연수 N의 최댓값은 얼마일까?

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

입력

첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.

출력

첫째 줄에 자연수 N의 최댓값을 출력한다.

예제 입력 1

200

예제 출력 1

19

풀이

s = int(input())
n = 1
res = 0

for i in range(1, s+1) : 
    if s - i < 0 :
        break
    s -= i
    res = i

print(res)
728x90
728x90

BOJ 10162 전자레인지

문제

3개의 시간조절용 버튼 A B C가 달린 전자레인지가 있다. 

각 버튼마다 일정한 시간이 지정되어 있어 해당 버튼을 한번 누를 때마다 그 시간이 동작시간에 더해진다. 

버튼 A, B, C에 지정된 시간은 각각 5분, 1분, 10초이다.

냉동음식마다 전자레인지로 요리해야할 시간 T가 초단위로 표시되어 있다. 

우리는 A, B, C 3개의 버튼을 적절히 눌러서 그 시간의 합이 정확히 T초가 되도록 해야 한다. 

단 버튼 A, B, C를 누른 횟수의 합은 항상 최소가 되어야 한다. 이것을 최소버튼 조작이라고 한다. 

만일 요리시간이 100초라고 하면(T=100) B를 1번, C는 4번 누르면 된다. 

이와 다르게 C를 10번 눌러도 100초가 되지만 이 경우 10번은 최소 횟수가 아니기 때문이 답이 될 수 없다. 

이 경우 B 1번, C 4번, 총 5번이 최소버튼 조작이다. 

그리고 T=234와 같이 3개의 버튼으로 시간을 정확히 맞출 수 없는 경우도 있다. 

여러분은 주어진 요리시간 T초를 맞추기 위한 최소버튼 조작 방법을 구하는 프로그램을 작성해야 한다. 

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

입력

첫 번째 줄에는 요리시간 T(초)가 정수로 주어져 있으며 그 범위는 1 ≤ T ≤ 10,000 이다.

출력

여러분은 T초를 위한 최소버튼 조작의 A B C 횟수를 첫 줄에 차례대로 출력해야 한다. 

각각의 횟수 사이에는 빈 칸을 둔다. 해당 버튼을 누르지 않는 경우에는 숫자 0을 출력해야한다. 

만일 제시된 3개의 버튼으로 T초를 맞출 수 없으면 음수 -1을 첫 줄에 출력해야 한다.

서브태스크

번호 배점 제한
1 30 T ≤ 60
2 30 T ≤ 300
3 40 T ≤ 10,000

예제 입력 1

100

예제 출력 1

0 1 4

예제 입력 2

189

예제 출력 2

-1

풀이

T = int(input())
R = T % 300

if T % 10 != 0:
    print(-1)
else:
    A = B = C = 0
    A = T // 300
    B = R // 60
    C = R % 60 // 10
    print(A, B, C)
728x90
728x90

BOJ 1541 잃어버린 괄호

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

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

입력

첫째 줄에 식이 주어진다. 

식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 

그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 

수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

출력

첫째 줄에 정답을 출력한다.

예제 입력 1

55-50+40

예제 출력 1

-35

예제 입력 2

10+20+30+40

예제 출력 2

100

예제 입력 3

00009-00009

예제 출력 3

0

풀이

s = list(input().split('-'))

for i in range(len(s)) :
    s[i] = sum(map(int,s[i].split('+')))

res = s[0]
for i in range(1,len(s)) :
    res -= s[i]

print(res)
728x90
728x90

BOJ 2217 로프

문제

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 

이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 

각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.

하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. 

k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.

각 로프들에 대한 정보가 주어졌을 때, 

이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 

모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.

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

입력

첫째 줄에 정수 N이 주어진다. 

다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 

이 값은 10,000을 넘지 않는 자연수이다.

출력

첫째 줄에 답을 출력한다.

예제 입력 1

2
10
15

예제 출력 1

20

풀이

import sys
input = sys.stdin.readline

n = int(input())
arr = [int(input()) for i in range(n)]
res = []

arr.sort(reverse=True)

for i in range(n) :
    res.append(arr[i]*(i+1))

print(max(res))
728x90
728x90

BOJ 5585 거스름돈

문제

타로는 자주 JOI잡화점에서 물건을 산다. 

JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 

언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 

타로가 JOI잡화점에서 물건을 사고 카운터에서 1000엔 지폐를 한장 냈을 때, 

받을 잔돈에 포함된 잔돈의 개수를 구하는 프로그램을 작성하시오.

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

입력

입력은 한줄로 이루어져있고, 타로가 지불할 돈(1 이상 1000미만의 정수) 1개가 쓰여져있다.

출력

제출할 출력 파일은 1행으로만 되어 있다. 

잔돈에 포함된 매수를 출력하시오.

예제 입력 1

380

예제 출력 1

4

예제 입력 2

1

예제 출력 2

15

풀이

n = 1000 - int(input())
money = [500, 100, 50, 10, 5, 1]
cnt = 0
for i in money :
    cnt += (n//i)
    n %= i

print(cnt)
728x90

+ Recent posts