728x90
[10162] 전자레인지(브론즈4)
import sys
input = sys.stdin.readline
N = int(input().strip())
if (N % 10 != 0):
print('-1')
else:
A, B, C = 0, 0, 0
A = N // 300
N = N % 300
B = N // 60
N = N % 60
C = N // 10
print(A, B, C)
- 10의 배수가 아니면 답이 나올 수 없기 때문에 -1을 출력함
- 가장 큰 300초로 나눠서 몫을 구함
- 나머지를 60초로 나눠서 몫을 구함
- 나머지를 10초로 나눠서 몫을 구함
[2720] 세탁소 사장 동혁(브론즈3)
import sys
input = sys.stdin.readline
N = int(input().strip())
case = []
for _ in range(N):
case.append(int(input().strip()))
for c in case:
A = c // 25
c = c % 25
B = c // 10
c = c % 10
C = (c % 10) // 5
c = c % 5
D = c
print(A, B, C, D)
import sys
input = sys.stdin.readline
N = int(input().strip())
money = [25, 10, 5, 1]
count = ['0']*4
for i in range(N):
c = int(input().strip())
for i in range(len(money)):
count[i] = str(c // money[i])
c = c%money[i]
print(' '.join(count))
- 입력받은 정수를 25로 나눈 몫을 구함
- 나머지를 10으로 나눈 몫을 구함
- 나머지를 5로 나눈 몫을 구함
- 나머지를 1로 나눈 몫을 구함
- 위에서 구한 몫들을 출력함(count)
[11034] 캥거루 세마리2(브론즈3)
import sys
input = sys.stdin.readline
while(True):
try:
a,b,c = map(int, input().strip().split())
print(max(b-a, c-b)-1)
except:
break
- try except로 여러 개의 테스트케이스를 입력받는다.
- 가정이 0<A<B<C<100 이기 때문에 입력값은 오름차순으로 넘어온다.
- b-a 와 c-b를 비교하여 큰 값을 구한다.
- 답은 (큰 값 - 1)이다.
그냥 거리의 최댓값 구해서 그 사이에 있는 정수좌표의 수를 구하는 문제
[14720] 우유 축제(브론즈3)
import sys
input = sys.stdin.readline
N = int(input().strip())
street = list(map(int, input().strip().split()))
milk = 0
drinkNum = 0
for s in street:
if s == milk:
drinkNum += 1
milk = (milk + 1) % 3
print(drinkNum)
- 먹어야하는 순서(milk)는 012가 반복되어야 하므로 %3 연산을 사용한다.
- milk와 street 가 같은 번호이면 마신 우유 수(drinkNum)를 하나 증가시킨다
[2864] 5와 6의 차이(브론즈2)
import sys
input = sys.stdin.readline
A, B = input().strip().split()
max = int(A.replace("5", "6")) + int(B.replace("5", "6"))
min = int(A.replace("6", "5")) + int(B.replace("6", "5"))
print(min, max)
- 문자열을 치환하는 방법을 사용해주었다.
- 5를 6으로 치환하면 무조건 최댓값이고 6을 5로 치환하면 무조건 최솟값
[5585] 거스름돈(브론즈2)
import sys
input = sys.stdin.readline
money = [500, 100, 50, 10, 5, 1]
price = 1000 - int(input().strip())
num = 0
for m in money:
num += (price // m)
price %= m
print(num)
[14471] 포인트 카드(브론즈2)
import sys
input = sys.stdin.readline
N, M = map(int, input().strip().split())
win = []
price = 0
for _ in range(M):
# 당첨 도장, 꽝 도장
A, B = map(int, input().strip().split())
win.append(A)
win.sort() # 오름차순 정렬
for i in range(1, len(win)): # 최소값 하나 잘라냄
price = price + (N-win[i]) if N > win[i] else price
print(price)
- 당첨도장 개수들만 win 배열에 담는다.
- 당첨도장 배열을 오름차순 정렬해준다.
- 최소값을 제외하여 win배열을 돌면서 N-win[i] 의 절댓값을 구해줌
[14487] 욱제는 효도쟁이야!!(브론즈2)
import sys
input = sys.stdin.readline
input()
distances = list(map(int, input().strip().split()))
distances.sort()
distances.pop(-1)
print(sum(distances))
그냥 제일 큰 값을 제외한 리스트의 합을 구하는 문제
[21313] 문어(브론즈2)
import sys
input = sys.stdin.readline
octoNum = int(input().strip())
isEven = (octoNum%2 == 0)
if isEven:
print(("1 2 "*(octoNum//2)).strip())
else:
print(("1 2 "*(octoNum//2) + "3").strip())
- 문어 수가 짝수면 문어 수만큼 1 2 1 2를 출력
- 문어 수가 홀수면 1 2 1 2 출력 후 마지막에 3 붙이기(1 2 1 2 3)
[22864] 피로도(브론즈2)
import sys
input = sys.stdin.readline
# 피로도증가량 일효율 피로도감소량 마지노선
plus, efficiency, minus, limit = map(int, input().strip().split())
fatigue = 0
work = 0
for _ in range(24):
if (fatigue+plus <= limit):
work += efficiency
fatigue += plus
else:
fatigue = fatigue-minus if fatigue>minus else 0
print(work)
그냥 문제대로 풀면 되는 문제
[2810] 컵홀더(브론즈1)
# 흐름대로 푼 풀이
import sys
input = sys.stdin.readline
input()
seats = input().strip()
leftEmpty = True
result = 0
while len(seats) != 0:
tmp = seats[0]
seats = seats[1:]
if (tmp == 'S'): # 왼쪽이 비어있으면 왼쪽에 놓고 아니면 오른쪽에 놓음
if not leftEmpty:
leftEmpty = False # 오른쪽에 놓음
result += 1
else: # LL일 경우-왼쪽이 비어있으면 놓고 오른쪽엔 무조건 놓음
seats = seats[1:]
if leftEmpty:
result += 1
result += 1
leftEmpty = False
print(result)
# 간단한 풀이
import sys
input = sys.stdin.readline
input()
seats = input().strip()
coupleNum = seats.count('LL')
if (coupleNum > 1):
print(len(seats) - (coupleNum - 1))
else:
print(len(seats))
- 'LL'이 하나만 포함되어 있으면 모든 사람이 컵 홀더를 사용할 수 있음
- 'LL'이 두 개 이상 포함되어 있으면 (LL의 수)-1 만큼의 사람이 컵 홀더를 사용할 수 없음
[2930] 가위 바위 보(브론즈1)
import sys
input = sys.stdin.readline
round = int(input().strip())
sangeun = input().strip() # SSPPR
friendNum = int(input().strip())
friend = [input().strip() for _ in range(friendNum)] # [SSPPR, SSPPR]
lst = ['S', 'R', 'P']
maxScore = realScore = 0
for i in range(round):
flst = [friend[j][i] for j in range(friendNum)]
count = [flst.count("S"), flst.count("R"), flst.count("P")]
maxScore += max([count[(j+2)%3]*2 + count[j] for j in range(len(count))])
idx = lst.index(sangeun[i])
realScore += count[(idx+2)%3]*2 + count[idx]
print(realScore)
print(maxScore)
- 가위 바위 보는 각각 0 1 2 인덱스로 취급함
- lst[ index ] 와 비김
- lst[ (index+1)%2 ] 에게 짐
- lst[ (index+2)%2 ] 에게 이김
- lst는 한 라운드에 친구들이 낸 가위바위보 값이다.
- flst에서 S,R,P의 빈도 수를 구해준다.
- 나올 수 있는 최대 점수(maxScore)는 구한 빈도 수를 바탕으로 나올 수 있는 모든 경우의 수 중 max값을 구한다.
- 상근이의 실제 점수(realScore)도 빈도 수를 바탕으로 구한다.
[4796] 캠핑
import sys
input = sys.stdin.readline
num = 1
while(True):
L, P, V = map(int, input().strip().split())
if (L == 0): break
useDay = (V // P) * L
remain = V % P
useDay = useDay + remain if remain < L else useDay + L
print("Case " + str(num) + ": " + str(useDay))
num += 1
몫이랑 나머지 잘 구하면 되는 문제
- V를 P로 나눈 몫을 구해서 L을 곱해준다.(P일 중 최대 L일을 이용할 수 있으니까)
- V를 P로 나눈 나머지가 L보다 작으면 useDay에 추가, L보다 크면 L을 useDay에 추가한다.
[9329] 패스트 푸드 상금(브론즈1)
import sys
input = sys.stdin.readline
caseNum = int(input().strip())
# 상금의 종류, 스티커의 종류, 상금에 관한 정보(필요스티커 개수, 스티커 종류, 상금액수)
# 코치가 가진 스티커 개수 각각
for _ in range(caseNum):
money = 0
n, m = map(int, input().strip().split())
prizes = [list(map(int, input().strip().split()[1:])) for _ in range(n)]
prizes.sort(reverse=True, key=lambda x: x[-1])
count = list(map(int, input().strip().split()))
for p in prizes:
idx = [i-1 for i in p[:-1]]
temp = [count[i] for i in idx]
if 0 not in temp:
minCount = min(temp)
for i in idx:
count[i] -= minCount
money += p[-1] * minCount
print(money)
가장 첫 번째 입력이 테스트 케이스 개수였다. 안적혀있어서 조금 헷갈렸음. 문제 이해가 제일 힘들었는데 그냥 인덱스 잘 찾아가면 되는 문제이다.
- 테스트 케이스 수(caseNum)만큼 for문 반복
- 상금을 받는데 필요한 스티커 종류와 상금을 prizes 배열에 담음. [ [1,2,3, 상금], [4,5,6,7, 상금] 이런식으로 받아짐. (상금 종류 수는 빼고 담았다)
- 혹시나 해서 상금이 높은 순으로 정렬해주었음(내림차순 정렬).
- count에 코치가 가진 스티커 개수를 받음
- prizes 배열을 돌면서 for문 진행
- 필요한 스티커 번호를 idx에 받음
- idx를 인덱스로 count에서 잘라와서 temp에 받아준다. (코치가 가진 필요한 스티커의 개수 temp)
- 0이 포함되어 있지 않은 경우 교환이 가능함.
교환: temp의 최솟값을 구해서 count를 갱신해주고, 상금 액수에 (최솟값*해당상금) 을 더해줌
[14655] 욱제는 도박쟁이야!!(브론즈1)
import sys
input = sys.stdin.readline
input()
absList = list(map(abs, map(int, input().strip().split())))
input()
print(sum(absList)*2)
그냥 처음 입력 받은 것들의 절댓값의 합의 2배를 구하면 되는 문제.
두 번째 입력도 받을 필요가 없다. 같은 동전을 쓰니까
[14659] 한조서열정리하고옴ㅋㅋ(브론즈1)
import sys
input = sys.stdin.readline
input()
heights = list(map(int, input().strip().split()))
bestKill = 0
currH = heights[0]
currkill = 0
for h in heights[1:]:
if h <= currH:
currkill += 1
else:
currkill = 0
currH = h
if bestKill < currkill:
bestKill = currkill
print(bestKill)
그냥 오른쪽으로 진행하면서 자기보다 작거나 같은 애들 수 세고, 최댓값 구하면 되는 문제
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[Java] bfs 실버모음3 (0) | 2023.02.11 |
---|---|
[Java] bfs 실버모음2 (0) | 2023.02.10 |
[Java] bfs 실버 모음1 (0) | 2023.02.09 |
[Java] Greedy 브론즈 모음 (0) | 2023.02.07 |
백준 greedy 실버5 모음1 - 파이썬 (2) | 2023.01.04 |