5/ 15 파이썬 공부
1. 백준 2476 주사위 게임
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.
(1) 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
(2) 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
(3) 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다.
또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다.
3개의 눈이 6, 2, 5로 주어지면 그 중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.
N(2 ≤ N ≤ 1,000)명이 주사위 게임에 참여하였을 때,
가장 많은 상금을 받은 사람의 상금을 출력하는 프로그램을 작성하시오.
첫째 줄에는 참여하는 사람 수 N이 주어지고 그 다음 줄부터 N개의 줄에 사람들이 주사위를 던진 3개의 눈이 빈칸을 사이에 두고 각각 주어진다. 첫째 줄에 가장 많은 상금을 받은 사람의 상금을 출력한다.
>>>코드
N = int(input())
prize = []
for i in range(N):
dot = list(map(int, input().split()))
if dot[0] == dot[1] and dot[1] == dot[2]:
prize.append(10000+dot[0]*1000)
elif dot[0] == dot[1]:
prize.append(1000+dot[0]*100)
elif dot[1] == dot[2]:
prize.append(1000+dot[1]*100)
elif dot[2] == dot[0]:
prize.append(1000+dot[2]*100)
else:
prize.append(max(dot)*100)
print(max(prize))
조건에 따라 하나하나 구분하는 방법밖에 없나보다.
2. 백준 2490 윷놀이
우리나라 고유의 윷놀이는 네 개의 윷짝을 던져서 배(0)와 등(1)이 나오는 숫자를 세어 도, 개, 걸, 윷, 모를 결정한다.
네 개 윷짝을 던져서 나온 각 윷짝의 배 혹은 등 정보가 주어질 때 도(배 한 개, 등 세 개), 개(배 두 개, 등 두 개), 걸(배 세 개, 등 한 개), 윷(배 네 개), 모(등 네 개) 중 어떤 것인지를 결정하는 프로그램을 작성하라.
첫째 줄부터 셋째 줄까지 각 줄에 각각 한 번 던진 윷짝들의 상태를 나타내는 네 개의 정수(0 또는 1)가 빈칸을 사이에 두고 주어진다. 첫째 줄부터 셋째 줄까지 한 줄에 하나씩 결과를 도는 A, 개는 B, 걸은 C, 윷은 D, 모는 E로 출력한다.
>>>코드
for i in range(3):
stick = list(map(int, input().split()))
if stick.count(1) == 4:
print('E')
elif stick.count(1) == 3:
print('A')
elif stick.count(1) == 2:
print('B')
elif stick.count(1) == 1:
print('C')
else:
print('D')
리스트로 저장해서 개수를 반환하는 리스트.count(요소) 함수 이용해서 각 조건에 맞는 결과 출력
3. 백준 2501 약수 구하기
어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다.
6을 예로 들면
6 ÷ 1 = 6 … 0
6 ÷ 2 = 3 … 0
6 ÷ 3 = 2 … 0
6 ÷ 4 = 1 … 2
6 ÷ 5 = 1 … 1
6 ÷ 6 = 1 … 0
그래서 6의 약수는 1, 2, 3, 6, 총 네 개이다.
두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오.
첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.
첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다.
만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.
>>>코드
N, K = map(int, input().split())
n = []
for i in range(N):
if N%(i+1) == 0:
n.append(i+1)
try:
print(n[K-1])
except:
print(0)
문제의 의도 대로 나누어서 나머지가 0이 나오는 것을 리스트에 저장하고 K번째 약수를 출력한다
4. 백준 2765 자전거 속도
대부분의 자전거 속도계는 앞 포크에 설치된 홀 효과 센서로 동작한다.
자석이 앞 바퀴의 포크중 하나에 부착되어, 홀 효과를 이용해 속도계가 바퀴의 회전수를 측정한다.
따라서 바퀴의 지름을 안다면 회전수를 통해 이동 거리를 측정할 수 있다.
또한 바퀴가 회전하는 동안 걸린 시간을 안다면 평균 속도 역시 알 수 있다.
바퀴의 지름, 회전수, 걸린 시간이 주어졌을 때, 총 이동 거리와 평균 속도를 계산하여라.
앞바퀴는 땅에서 떨어지거나 미끄러지거나 공전하지 않았다고 가정한다.
이동 거리의 단위는 miles이고, 평균 속도의 단위는 miles/hour 이다.
입력은 여러 줄의 데이터로 구성된다.
각 데이터는 지름, 회전수, 시간이 공백으로 구분되어 주어진다.
지름은 inch단위의 실수이며, 회전수는 정수이다. 시간은 초단위의 실수로 주어진다.
입력은 회전수가 0이면 끝난다. 실수는 소수점 셋째자리이하까지 주어진다.
각각의 데이터에 대해 다음을 출력한다
Trip #N: distance MPH
N은 각각의 데이터 번호를 출력해야 하며, distance는 총 거리(Miles)를 소수 둘째 자리까지 반올림하여 나타내며, MPH는 평균 속도(miles per hour)를 소수 둘째 자리까지 반올림하여 나타낸다.
회전수가 0인 데이터에 대해서는 출력하지 않는다.
π의 값은 3.1415927을 사용하면 된다.
1마일은 5280피트이다.
1피트는 12인치이다.
1시간은 60분이다.
1분은 60초이다.
1펄롱은 201.168미터이다
>>>코드
N = 1
while True:
rr, RPM, Time = map(float, input().split())
if RPM == 0:
break
distance = 3.1415927*rr*RPM/(12*5280)
MPH = distance/(Time/3600)
print('Trip #%d: %.2f %.2f' %(N, round(distance, 2), round(MPH, 2)))
N += 1
단위 변환을 신경써서 해주자
5. 백준 2783 삼각 김밥
유명 편의점 체인점 세븐25는 삼각 김밥을 전국에서 가장 싸게 판매하고 있다.
이 회사의 직원들은 삼각 김밥의 가격을 전국 최저가를 유지하기 위해 매일 근처의 편의점을 방문한다.
그리고 나서 세븐25의 삼각 김밥보다 싼 가격을 발견하면, 삼각 김밥의 가격을 그 가격으로 바꿔 최저가를 유지한다.
매일 아침, 점심, 저녁으로 삼각 김밥을 먹는 상근이와 정인이는 정말 세븐25가 제일 싼지 궁금해졌다.
이들은 학교 근처에 있는 세븐 25와 세븐 25를 제외한 서로 다른 N개의 편의점 체인을 방문 할 것이다.
이 편의점을 방문하면서 세븐25보다 싼 삼각김밥을 찾을 것이다.
또, 전체 편의점에서 가장 싼 삼각 김밥은 어디인지 찾을 것이다.
어느 편의점의 삼각 김밥이 제일 싼지 고객들이 쉽게 알지 못하기 하기 위해서,
모든 편의점은 삼각 김밥의 가격을 다음과 같이 표시한다. "삼각 김밥 Y그램 당 X원"
상근이와 정인이는 삼각 김밥을 1,000그램 살 것이다.
세븐 25의 삼각 김밥 가격과, 다른 N개 편의점의 삼각 김밥 가격이 주어졌을 때,
1,000그램의 삼각 김밥을 가장 싸게 사려면 얼마면 되는지 구하는 프로그램을 작성하시오.
삼각 김밥은 여러 군데에서 돌아가면서 사도 되고, 세븐 25와 N개 편의점 이외의 다른 곳에서는 살 수 없다.
첫째 줄에 세븐25의 삼각 김밥 가격 정보 X와 Y가 주어진다. (Y그램 당 X원) (1 ≤ X ≤ 100, 1 ≤ Y ≤ 1,000)
둘째 줄에는 세븐25를 제외한 편의점의 개수 N이 주어진다. (1 ≤ N ≤ 100)
다음 N개의 줄에는 i번째 편의점의 삼각 김밥 가격 정보 Xi와 Yi가 주어진다.
(Yi그램 당 Xi원) (1 ≤ Xi ≤ 100, 1 ≤ Yi ≤ 1,000)
첫째 줄에 삼각 김밥 1,000그램 가격의 최저가를 출력한다. 정답과의 오차는 0.01까지 허용한다.
>>>코드
X, Y = map(float, input().split())
P = X*(1000/Y)
N = int(input())
for i in range(N):
x, y = map(float, input().split())
p = x*(1000/y)
if p<P:
P = p
print('%.2f' %(P))
입력되는 수마다 해당하는 삼각김밥 가격을 계산하여 원래 가격이랑 비교 및 교체한다.
6. 백준 2857 FBI
5명의 요원 중 FBI 요원을 찾는 프로그램을 작성하시오.
FBI요원은 요원의 첩보원명에 FBI가 들어있다.
5개 줄에 요원의 첩보원명이 주어진다.
첩보원명은 알파벳 대문자, 숫자 0~9, 대시 (-)로만 이루어져 있으며, 최대 10글자이다.
첫째 줄에 FBI 요원을 출력한다.
이때, 해당하는 요원이 몇 번째 입력인지를 공백으로 구분하여 출력해야 하며, 오름차순으로 출력해야 한다.
만약 FBI 요원이 없다면 "HE GOT AWAY!"를 출력한다.
>>>코드
n = []
for i in range(5):
name = input()
if 'FBI' in name:
n.append(i+1)
if len(n) == 0:
print('HE GOT AWAY!')
else:
print(*n)
1) 새로운 사실
- '구분자'.join(리스트) 라는 리스트요소들을 구분자로 구분하여 한번에 출력하도록 도와주는 리스트 내장 함수는 리스트의 요소들이 "문자열" 일때만 사용가능하다.
- 리스트 대괄호 없이 공백 구분하여 출력하는 방법
>>>print(*리스트)
리스트의 요소가 문자열이든 숫자든 상관없이 공백 구분으로 출력해준다
7. 백준 2935 소음
수업 시간에 떠드는 두 학생이 있다.
두 학생은 수업에 집중하는 대신에 글로벌 경제 위기에 대해서 토론하고 있었다.
토론이 점점 과열되면서 두 학생은 목소리를 높였고, 결국 선생님은 크게 분노하였다.
이렇게 학생들이 수업 시간에 떠드는 문제는 어떻게 해결해야 할까?
얼마전에 초등학교 선생님으로 취직한 상근이는 이 문제를 수학 문제로 해결한다.
학생들을 진정시키기 위해 칠판에 수학 문제를 써주고, 아이들에게 조용히 이 문제를 풀게 한다.
학생들이 문제를 금방 풀고 다시 떠드는 것을 방지하기 위해서, 숫자를 매우 크게 한다.
아직 초등학교이기 때문에, 학생들은 덧셈과 곱셈만 배웠다. 또, 아직 10의 제곱꼴을 제외한 다른 수는 학교에서 배우지 않았기 때문에, 선생님이 써주는 수는 모두 10의 제곱 형태이다.
쉬는 시간까지 문제를 푸는 것을 막기 위해서, 선생님이 써주는 숫자는 최대 100자리이다.
칠판에 쓰여 있는 문제가 주어졌을 때, 결과를 구하는 프로그램을 작성하시오.
첫째 줄에 양의 정수 A가 주어진다.
둘째 줄에 연산자 + 또는 *가 주어진다.
셋째 줄에 양의 정수 B가 주어진다.
A와 B는 모두 10의 제곱 형태이고, 길이는 최대 100자리이다.
첫째 줄에 결과를 출력한다. 결과는 A+B 또는 A*B이며, 입력에서 주어지는 연산자에 의해 결정된다.
>>>코드
A = int(input())
calculation = input()
B = int(input())
if calculation == '*':
print(A*B)
else:
print(A+B)
8. 백준 2953 나는 요리사다
"나는 요리사다"는 다섯 참가자들이 서로의 요리 실력을 뽐내는 티비 프로이다.
각 참가자는 자신있는 음식을 하나씩 만들어오고, 서로 다른 사람의 음식을 점수로 평가해준다.
점수는 1점부터 5점까지 있다.
각 참가자가 얻은 점수는 다른 사람이 평가해 준 점수의 합이다.
이 쇼의 우승자는 가장 많은 점수를 얻은 사람이 된다.
각 참가자가 얻은 평가 점수가 주어졌을 때, 우승자와 그의 점수를 구하는 프로그램을 작성하시오.
총 다섯 개 줄에 각 참가자가 얻은 네 개의 평가 점수가 공백으로 구분되어 주어진다.
첫 번째 참가자부터 다섯 번째 참가자까지 순서대로 주어진다. 항상 우승자가 유일한 경우만 입력으로 주어진다.
첫째 줄에 우승자의 번호와 그가 얻은 점수를 출력한다.
>>>코드
score =[]
for i in range(5):
s = list(map(int, input().split()))
score.append(sum(s))
print('%d %d' %(score.index(max(score))+1, max(score)))
9. 백준 2965 캥거루 세마리
캥거루 세 마리가 사막에서 놀고 있다. 사막에는 수직선이 하나 있고, 캥거루는 서로 다른 한 좌표 위에 있다.
한 번 움직일 때, 바깥쪽의 두 캥거루 중 한 마리가 다른 두 캥거루 사이의 정수 좌표로 점프한다.
한 좌표 위에 있는 캥거루가 두 마리 이상일 수는 없다.
캥거루는 최대 몇 번 움직일 수 있을까?
첫째 줄에 세 캥거루의 초기 위치 A, B, C가 주어진다. (0 < A < B < C < 100)
캥거루가 최대 몇 번 움직일 수 있는지 출력한다.
>>>코드
A, B, C = map(int, input().split())
x1, x2 = B-A-1, C-B-1
if x1> x2:
print(x1)
else:
print(x2)
그냥 초기 위치에서 거리가 가장 먼 두 캥거루의 거리-1 만큼 이동할 수 있다.
계속 1만큼 안쪽으로 번갈아가면서 이동한다고 상상해보자
10. 백준 2991 사나운 개
창영 마을의 우체부, 우유배달원, 신문배달원은 상근이네 집에 가는 것을 매우 싫어한다.
그 이유는 상근이네 집에는 사나운 개 두 마리가 지키고 있기 때문이다.
하지만, 그들은 이 개의 행동이 예측 가능하다는 것을 모르고 있다.
매일 아침, 개 한마리는 A분동안 공격적이고, B분동안 조용히 쉬고 있다.
또다른 개는 C분동안 공격적이고, D분동안 조용히 쉰다. 두 개는 이 행동을 계속해서 연속적으로 반복한다.
우체부, 신문배달원, 우유배달원의 도착 시간이 주어졌을 때,
개 몇 마리에게 공격을 받는지 알아내는 프로그램을 작성하시오.
첫째 줄에 A, B, C, D가 주어진다.
둘째 줄에는 P, M, N가 주어진다.
P는 우체부의 도착 시간, M은 우유배달원의 도착 시간, N은 신문배달원의 도착 시간이다.
매일 아침이 시작하는 시간을 0이라고 한다. 도착 시간은 아침이 시작한 후 지난 시간이다.
예를 들어, P가 3이면, 우체부는 아침이 시작하고 세 번째 분이 진행되는 중에 도착했다는 뜻이다.
모든 수는 1보다 크거나 같고, 999보다 작거나 같은 정수이다.
첫째 줄에는 우체부, 둘째 줄에는 우유배달원, 셋째 줄에는 신문배달원이 개 몇 마리에게 공격 받는지 출력한다.
>>>코드
A, B, C, D = map(int, input().split())
H = list(map(int, input().split()))
D1, D2 = A+B, C+D
for i in range(3):
Dcount = 0
if (H[i]-1)%D1 <A:
Dcount += 1
if (H[i]-1)%D2 <C:
Dcount += 1
print(Dcount)
주기 함수라고 생각해보자
주기는 A+B와 C+D 이고 주기로 소요되는 시간의 -1 을 나눈 값이 각각 A,C보다 작으면 개는 공격적이다
11. 백준 4458 첫 글자를 대문자로
문장을 읽은 뒤, 줄의 첫 글자를 대문자로 바꾸는 프로그램을 작성하시오.
첫째 줄에 줄의 수 N이 주어진다. 다음 N개의 줄에는 문장이 주어진다.
각 문장에 들어있는 글자의 수는 30을 넘지 않는다. 모든 줄의 첫 번째 글자는 알파벳이다.
각 줄의 첫글자를 대문자로 바꾼뒤 출력한다.
>>>코드(오답)
N = int(input())
for i in range(N):
sentence = input()
print(sentence.capitalize())
1) 문자열.capitalize(): 문자열의 첫 문자만 알파벳 대문자로 바꿔주는 함수
바로 출력하거나, 다른 변수에 저장해야 사용가능하다.(원래 문자열을 변형시키지 않는다)
왜 틀렸는지 몰랐으나
예제를 입력해 보고 알았다.
capitalize 함수는 첫문자'만' 알파벳 대문자로 만드는 함수로서 첫문자 이외에 대문자가 있다면 소문자로 바꾸어 버린다. 우리는 나머지 문자를 건드리면 안되기 때문에 이번 문제에 적합한 함수가 아니다.
>>>코드(정답)
N = int(input())
for i in range(N):
sentence = input()
sentence = sentence[0].upper()+sentence[1:]
print(sentence)
2) 문자열.upper(): 해당 문자열 전체를 알파벳 대문자로 바꾸어주는 함수
바로 출력하거나, 다른 변수에 저장해야 사용가능하다.(원래 문자열을 변형시키지 않는다)
'백준 > 백준 파이썬' 카테고리의 다른 글
백준 파이썬 Today I Learn 2023.05.17 (1) | 2023.05.18 |
---|---|
백준 파이썬 Today I Learn 2023.05.16 (0) | 2023.05.17 |
백준 파이썬 Today I Learn 2023.05.13 (0) | 2023.05.15 |
백준 파이썬 Today I Learn 2023.05.12 (0) | 2023.05.13 |
백준 파이썬 Today I Learn 2023.05.11 (0) | 2023.05.12 |