728x90

BOJ 1783 병든 나이트

문제

병든 나이트가 N × M 크기 체스판의 가장 왼쪽아래 칸에 위치해 있다. 

병든 나이트는 건강한 보통 체스의 나이트와 다르게 4가지로만 움직일 수 있다.

1. 2칸 위로, 1칸 오른쪽
2. 1칸 위로, 2칸 오른쪽
3. 1칸 아래로, 2칸 오른쪽
4. 2칸 아래로, 1칸 오른쪽

병든 나이트는 여행을 시작하려고 하고, 여행을 하면서 방문한 칸의 수를 최대로 하려고 한다. 

병든 나이트의 이동 횟수가 4번보다 적지 않다면, 이동 방법을 모두 한 번씩 사용해야 한다. 

이동 횟수가 4번보다 적은 경우(방문한 칸이 5개 미만)에는 이동 방법에 대한 제약이 없다.

체스판의 크기가 주어졌을 때, 병든 나이트가 여행에서 방문할 수 있는 칸의 최대 개수를 구해보자.

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

입력

첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. 

N과 M은 2,000,000,000보다 작거나 같은 자연수이다.

예제 입력 1

100 50

예제 출력 1

48

예제 입력 2

1 1

예제 출력 2

1

예제 입력 3

17 5

예제 출력 3

4

예제 입력 4

2 4

예제 출력 4

2

예제 입력 5

20 4

예제 출력 5

4

풀이

n, m = map(int, input().split())
res = 0
if n == 1 :
    res = 1
elif n == 2 :
    res = min(4, (m+1)//2)
elif m < 7 :
    res = min(4, m)
else :
    res = m-2

print(res)
728x90
728x90

BOJ 1449 수리공 항승

문제

항승이는 품질이 심각하게 나쁜 수도 파이프 회사의 수리공이다. 

항승이는 세준 지하철 공사에서 물이 샌다는 소식을 듣고 수리를 하러 갔다.

파이프에서 물이 새는 곳은 신기하게도 가장 왼쪽에서 정수만큼 떨어진 거리만 물이 샌다.

항승이는 길이가 L인 테이프를 무한개 가지고 있다.

항승이는 테이프를 이용해서 물을 막으려고 한다. 

항승이는 항상 물을 막을 때, 적어도 그 위치의 좌우 0.5만큼 간격을 줘야 물이 다시는 안 샌다고 생각한다.

물이 새는 곳의 위치와, 항승이가 가지고 있는 테이프의 길이 L이 주어졌을 때, 

항승이가 필요한 테이프의 최소 개수를 구하는 프로그램을 작성하시오. 

테이프를 자를 수 없고, 테이프를 겹쳐서 붙이는 것도 가능하다.

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

입력

첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 

둘째 줄에는 물이 새는 곳의 위치가 주어진다. 

N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 항승이가 필요한 테이프의 개수를 출력한다.

예제 입력 1

4 2
1 2 100 101

예제 출력 1 

2

예제 입력 2

4 3
1 2 3 4

예제 출력 2

2

예제 입력 3

3 1
3 2 1

예제 출력 3

3

풀이

N, L = map(int, input().split())
hole = list(map(int, input().split()))

hole.sort()

start = hole[0]
end = hole[0] + L
cnt = 1

for i in range(N) : 
    if start <= hole[i] < end :
        continue
    else :
        start = hole[i]
        end = hole[i] + L
        cnt += 1

print(cnt)
728x90
728x90

BOJ 1439 뒤집기

문제

다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 

다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 

다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 

뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.

예를 들어 S=0001100 일 때,

1. 전체를 뒤집으면 1110011이 된다.

2. 4번째 문자부터 5번째 문자까지 뒤집으면 1111111이 되어서 2번 만에 모두 같은 숫자로 만들 수 있다.
   하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 
   1번 만에 모두 같은 숫자로 만들 수 있다.

문자열 S가 주어졌을 때, 다솜이가 해야하는 행동의 최소 횟수를 출력하시오.

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

입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100만보다 작다.

출력

첫째 줄에 다솜이가 해야하는 행동의 최소 횟수를 출력한다.

예제 입력 1

0001100

예제 출력 1 

1

예제 입력 2

11111

예제 출력 2

0

예제 입력 3

00000001

예제 출력 3

1

예제 입력 4

11001100110011000001

예제 출력 4

4

예제 입력 5 

11101101

예제 출력 5

2

풀이

S = input()
zero_cnt = 0
one_cnt = 0

if S[0] == '0' :
    zero_cnt += 1
else :
    one_cnt += 1

for i in range(len(S)-1) :
    if S[i] != S[i+1] :
        if S[i+1] == '0' :
            zero_cnt += 1
        elif S[i+1] == '1' :
            one_cnt += 1

print(min(zero_cnt, one_cnt))
728x90
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

+ Recent posts