백준 파이썬 Today I Learn 2023.05.08
5/ 08 파이썬 공부
1. 백준 11948 과목선택
JOI는 물리, 화학, 생물, 지구과학, 역사, 지리 총 6 과목의 시험을 봤다. 각 시험의 만점은 100점이다.
JOI는 물리, 화학, 생물, 지구과학 4과목 중에서 3 과목을 선택하고 역사, 지리 2 과목 중에서 한 과목을 선택한다.
시험 점수의 합이 가장 높게 나오도록 과목을 선택할 때, JOI가 선택한 과목의 시험 점수의 합을 구하시오.
입력은 6행으로 되어있으며, 각 행에 1개의 정수가 주어진다.
1행에는 JOI의 물리 시험의 점수 A가 주어진다.
2행에는 JOI의 화학 시험의 점수 B가 주어진다.
3행에는 JOI의 생물 시험의 점수 C가 주어진다.
4행에는 JOI의 지구과학의 시험 점수 D가 주어진다.
5행에는 JOI의 역사 시험의 점수 E가 주어진다.
6행에는 JOI의 지리 시험의 점수 F가 주어진다.
입력한 정수 A, B, C, D, E, F는 모두 0이상 100이하이다.
JOI가 선택한 과목의 총 점수를 1행에 출력하시오.
>>>코드
score1, score2 = [], []
for i in range(4):
score1.append(int(input()))
score1.sort(reverse = True)
r = sum(score1[:3])
for i in range(2):
score2.append(int(input()))
score2.sort(reverse = True)
r = r+ score2[0]
print(r)
1) 리스트.append(): 리스트에 요소 추가
2) 리스트 정렬 함수
리스트.sort(): 리스트 내장 함수, 오름차순 정렬(내림차순을 하고 싶으면 괄호 안에 'reverse =True'입력)
sorted(): 파이썬 함수, 오름차순 정렬(내림차순을 하고 싶으면 괄호 안에 'reverse =True'입력)
2. 백준 2530 인공지능 시계
KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다.
인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다.
그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 초 단위로 자동적으로 계산한다.
KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털 시계가 있다.
훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 초 단위로 주어졌을 때,
오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.
첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23), 분 B (0 ≤ B ≤ 59)와 초 C (0 ≤ C ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 D (0 ≤ D ≤ 500,000)가 초 단위로 주어진다.
첫째 줄에 종료되는 시각의 시, 분, 초을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수이며, 분, 초는 0부터 59까지의 정수이다. 디지털 시계는 23시 59분 59초에서 1초가 지나면 0시 0분 0초가 된다.)
>>>코드
A, B, C = map(int, input().split())
t = int(input())
C += t
if C>59:
B += (C//60)
C = C%60
if B>59:
A += (B//60)
B = B%60
if A>23:
A = A%24
print('%d %d %d' %(A,B,C))
그냥 나누기 몫과 나머지만 잘 이용하기
3. 백준 5575 타임카드
JOI 상사는 직원의 근무시간을 타임 카드로 관리하고있다.
직원들은 전용 장비를 사용하여 타임 카드에 출근 시간을 기록한다.
근무를 마치고 퇴근할 때도 타임 카드에 퇴근 시간을 기록한다.
타임카드에서 사용하는 시간단위는 24 시간제를 사용한다.
보안상의 이유로 직원들의 출근 시간은 7시 이후이다.
또한, 모든 직원은 23시 이전에 퇴근한다. 직원의 퇴근 시간은 항상 출근 시간보다 늦다.
입력으로 JOI 상사의 3 명의 직원 A 씨, B 씨, C 씨의 출근 시간과 퇴근 시간이 주어 졌을 때 각 직원의 근무시간을 계산하는 프로그램을 작성하라.
입력은 3 행으로 구성된다.
첫 번째 줄에는 A 씨의 출근 시간과 퇴근 시간,
두 번째 줄에는 B 씨의 출근 시간과 퇴근 시간,
세 번째 줄에는 C 씨의 출근 시간과 퇴근 시간이 각각 공백으로 구분되어 있다.
시간은 각각 공백으로 구분된 3 개의 정수로 쓰여져있다.
3 개의 정수 h(7 ≦ h ≦ 22), m(0 ≦ m ≦ 59), s(0 ≦ s ≦ 59)는 h시 m 분 s 초를 나타낸다.
첫 번째 줄에 A 씨의 근무 시간,
두 번째 줄에 B 씨의 근무 시간,
세 번째 줄에 C 씨의 근무 시간을 출력하라.
근무 시간이 h 시간 m 분 s 초이면 h, m, s의 순으로 공백으로 분리하여 출력하라.
>>>코드
for i in range(3):
h1, m1, s1, h2, m2, s2 = map(int, input().split())
h = h2-h1
m = m2-m1
s = s2-s1
if s<0:
s = 60+s
m = m-1
if m<0:
m = 60+m
h = h-1
print('%d %d %d' %(h,m,s))
3번 반복
시간, 분, 초 뺀 후에 그 값이 음수면 60과 더하고, 그 위 단위 -1
출력
4. 백준 13118 뉴턴과 사과
첫 번째 줄에 사람들의 위치를 나타내는 네 정수 p1, p2, p3, p4 (−109 ≤ p1 < p2 < p3 < p4 ≤ 109)가 공백을 사이로 두고 주어진다. i번 (1 ≤ i ≤ 4) 사람은 (pi, 0) 위에 서 있다.
두 번째 줄에 사과의 정보를 나타내는 세 정수 x, y, r (−109 ≤ x ≤ 109, 0 < y ≤ 109, 1 ≤ r ≤ 109)이 공백을 사이로 두고 주어진다. 이 정수들은 사과의 중심이 점 (x, y)에 있고, 사과의 반지름이 r임을 나타낸다. 사과가 x축 위에 떠 있다는 것이 보장된다
첫 번째 줄에 사과와 충돌하는 사람의 번호를 출력한다. 단, 사과와 충돌하는 사람이 없다면 0을 대신 출력한다.
>>>코드
p = list(map(int, input().split()))
x, y, r = map(int, input().split())
c = 0
for i in range(4):
if p[i] == x:
c = i+1
print(c)
막 여려워 보일 수 있지만 핵심은 그냥 사과 중심점의 x좌표와 사람의 좌표가 동일하면 출력하는 간단한 코드이다.
5. 백준 10808 알파벳 개수
알파벳 소문자로만 이루어진 단어 S가 주어진다.
각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오.
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.
>>>코드
word = input()
print(word.count('a'), word.count('b'), word.count('c'), word.count('d'), word.count('e'), word.count('f'), word.count('g'), word.count('h'), word.count('i'), word.count('j'), word.count('k'), word.count('l'), word.count('m'), word.count('n'), word.count('o'), word.count('p'), word.count('q'), word.count('r'), word.count('s'), word.count('t'), word.count('u'), word.count('v'), word.count('w'), word.count('x'), word.count('y'), word.count('z'), sep=' ')
1) str.count('문자'): 문자의 총 개수를 출력하는 함수
2) print('a','b','c', sep =' '): a b c를 공백을 구분자로 하여 출력하는 함수(결과: a b c)
6. 백준 13866 팀 나누기
4명의 친구가 탁구를 하고 있다.
각각은 정수형으로 표현된 스킬 레벨을 가지고 있고, 숫자가 높을수록 더 좋은 플레이어다.
4명의 친구는 각각 두 명씩 구성된 두 팀을 구성하려고 한다.
게임이 더 흥미롭게 하기 위해서 팀의 스킬 레벨을 최대한 가깝게 유지하기를 원한다.
팀의 스킬 레벨은 팀원의 스킬 레벨의 합계이다.
그들은 탁구 선수로는 탁월하지만, 수학이나 컴퓨터와 같은 다른 것들에 능숙하지 않다.
팀의 스킬 레벨이 가능한 작은 차이를 갖도록 도와주자.
입력은 네 개의 정수 A, B, C 및 D가 포함된 한 줄로 구성되며 4명의 스킬 레벨이 주어진다.
(0 ≤ A ≤ B ≤ C ≤ D ≤ 10**4)
두 팀의 스킬 레벨 차이의 최솟값을 출력한다.
>>>코드
level = list(map(int, input().split()))
print(abs(level[0]+level[3]-level[1]-level[2]))
스킬레벨 차이가 최소가 되려면, 최대값과 최소값끼리 더하고 나머지 두값끼리 더하면 된다
원래라면 sort 함수를 이용하여 정렬 후에 해야겠지만 조건에 (0 ≤ A ≤ B ≤ C ≤ D ≤ 10**4)가 있으므로 정렬 없이
계산하면 된다.
음수일 경우를 고려하여 절대값을 반환하는 abs()함수를 이용한다
1) abs(숫자형): 숫자의 절대값을 반환한다.
7. 백준 14470 전자레인지
JOI 군은 식사 준비를 위해 A℃의 고기를 전자레인지로 B℃까지 데우려고 한다.
고기는 온도가 0℃보다 낮을 때 얼어 있고, 0℃보다 높을 때는 얼어 있지 않다.
온도가 정확히 0℃일 때 고기는 얼어 있을 수도, 얼어 있지 않을 수도 있다.
JOI 군은 가열할 때 고기가 아래의 규칙을 따라 데워진다고 가정하고,
고기를 데우는 데 걸리는 시간을 어림하기로 했다.
고기가 얼어 있고 온도가 0℃ 미만일 때 : 온도가 C초에 1℃씩 오른다.
고기가 얼어 있고 온도가 정확히 0℃일 때 : 얼어 있지 않은 상태로 만드는(해동하는) 데 D초가 걸린다.
고기가 얼어 있지 않을 때 : 온도가 E초에 1℃씩 오른다.
이 규칙을 토대로, 고기가 B℃까지 데워지는 데 몇 초가 걸리는지 구하라.
입력은 총 5줄로, 한 줄에 한 개씩의 정수가 주어진다.
첫 줄에는 원래의 고기의 온도 A가 주어진다. 단, A는 -100 이상 100 이하이며, 0이 아니다.
둘째 줄에는 목표 온도 B가 주어진다. 단, B는 1 이상 100 이하이며, A보다 크다.
셋째 줄에는 얼어 있는 고기를 1℃ 데우는 데 걸리는 시간 C가 주어진다.
넷째 줄에는 얼어 있는 고기를 해동하는 데 걸리는 시간 D가 주어진다.
다섯째 줄에는 얼어 있지 않은 고기를 1℃ 데우는 데 걸리는 시간 E가 주어진다.
C, D, E는 모두 1 이상 100 이하이다.
고기를 B℃로 데우는 데 걸리는 시간을 초 단위로 한 줄에 출력하라.
>>>코드
A = int(input())
B = int(input())
C = int(input())
D = int(input())
E = int(input())
if A<=0:
time = abs(A)*C + D + B*E
else:
time = (B-A)*E
print(time)
규칙만 제대로 이해하면 간단한 조건 계산 출력문
8. 백준 15439 베라의 패션
베라는 상의 N 벌과 하의 N 벌이 있다.
i 번째 상의와 i 번째 하의는 모두 색상 i를 가진다. N 개의 색상은 모두 서로 다르다.
상의와 하의가 서로 다른 색상인 조합은 총 몇 가지일까?
상의와 하의가 서로 다른 색상인 조합의 가짓수를 출력한다.
>>>코드
N =int(input())
print(N*(N-1))
확통을 안다면 굉장히 쉬운 문제
9. 백준 14489 치킨 두 마리(...)
슬프게도, 2017 선린 봄맞이 교내대회의 상품 비용은 욱제의 통장에서 충당된다.
욱제의 마음을 아는지 모르는지, 참가자들이 1등 상품으로 치킨을 무려 두 마리(...)나 달라고 조르고 있다.
욱제에게는 두 개의 통장이 있다.
두 통장의 잔고와 치킨 한 마리의 가격이 주어질 때, 욱제가 치킨 두 마리(...)를 살 수 있는지 알아보자.
첫째 줄에 두 통장의 잔고 A와 B가 주어진다. (0 ≤ A, B ≤ 1,000,000,000)
둘째 줄에 치킨 한 마리의 가격 C가 주어진다. (0 ≤ C ≤ 1,000,000,001)
욱제가 치킨 두 마리(...)를 살 수 있으면 치킨 두 마리(...)를 사고 남은 두 통장 잔고의 합을,
살 수 없으면 현재 두 통장의 잔고의 합을 출력한다.
>>>코드
A, B = map(int, input().split())
C = int(input())
if A+B >= C*2:
print(A+B-C*2)
else:
print(A+B)
간단한 조건 계산 출력문
10. 백준 14924 폰 노이만과 파리
역사상 최고의 천재중 하나인 폰 노이만에게는 다음과 같은 재밌는 일화가 있다.
그의 동료는 어느 날 폰 노이만의 천재성을 시험해보기 위해서 다음과 같은 질문을 던졌다.
“200마일 길이의 철로의 양쪽 끝에 서 있는 두 대의 기차가 시속 50마일의 속도로 서로를 향해 출발했습니다. 이때부터 두 기차가 서로 충돌할 때까지 파리가 시속 75마일의 속도로 두 기차사이를 왔다 갔다 했습니다. 파리가 이동한 거리는 모두 몇 마일일까요?”
폰 노이만은 문제를 듣고 1초의 지체도 없이 150마일이라고 답했다. 그의 동료는 크게 실망하며 말했다.
“역시 당신은 똑똑하군요. 보통 사람들은 이 문제를 무한급수를 이용해서 풀려고 하지만 그렇게 하면 매우 긴 시간이 걸리죠. 하지만 간단한 논리를 사용하면 순식간에 파리가 이동한 거리를 구할 수 있습니다. 당신도 그 논리를 이용한 것이죠?”
그러자 폰 노이만은 이렇게 답했다.
“아니요, 무한급수로 풀었는데요?”
이 문제를 무한급수를 통해 푸는 방법은 다음과 같다. 수직선 위에 기차 A, B가 있다고 하자. 파리와 같이 출발하는 기차를 A라 하고, 그 위치를 기준점으로 하면 기차 B는 기준점에서 200마일 만큼 떨어진 지점에 있다. 이때 시간 t에서 파리의 위치는 75t 이고 기차 B의 위치는 200 – 50t 이다. 이를 이용하면 파리와 기차 B가 처음 만나는 위치는 기준점에서 120마일 떨어진 지점임을 알 수 있다. 120마일은 파리의 첫 이동거리 이고 이를 a1이라고 하자. 한편 이때 기차 A는 80마일 떨어진 지점에 위치한다 (기차 A의 속도는 파리의 속도의 2/3 이므로). 그러므로 기차 A와 B의 사이가 40마일로 줄어들었고, 같은 식으로 파리의 두 번째 이동거리 a2는 (1/5)a1임을 알 수 있다. 이와 같이 생각하면, ai+1은 (1/5)ia1이고, 파리의 총 이동거리는 Σ(1/5)ia1 = 150 즉 150마일임을 알 수 있다.
이 문제를 푸는 “간단한 논리”는 다음과 같다. 두 기차는 200/(50*2) = 2 시간 후에 만난다. 파리는 2시간동안 시간당 75마일의 속도로 이동하므로 2*75 = 150 마일을 이동한다.
우리는 위에서 제시한 문제를 풀 수 있는 프로그램을 만들고 싶다. 하지만 우리의 컴퓨터는 안타깝게도 폰 노이만의 두뇌보다 성능이 좋지 못하기 때문에 무한급수를 이용하여 프로그램을 만들 수는 없다. 위에서 말한 “간단한 논리”를 이용하여 기차의 속도 S, 파리의 속도 T, 그리고 처음 두 기차 사이의 거리 D가 주어졌을 때 두 기차가 만날 때까지 파리의 이동거리 F를 계산하는 프로그램을 작성하라.
>>>코드
S, T, D = map(int, input().split())
F = (D//(S*2))*T
print(F)
1) 나누기
/: 실수형 나누기, 결과값이 실수형(float)으로 나온다
//: 정수형 나누기, 결과값이 정수형(int)으로 나온다 (즉, 몫)
%: 정수형 나머지
11. 백준 14935 FA
함수 F(x)는 입력으로 주어진 수 x의 첫 자리와 수 x의 자리수를 곱한 결과를 반환하는 함수이다.
예를 들어 x = 932 일때 F(x)는 9×3으로 27을 반환한다.
입력받은 x에 대해서 함수 F를 수행하고, 나온 결과값에 다시 함수 F를 수행하는 것을 반복한다.
계속 반복해서 수행했을 때 어느 시점에서부터 동일한 수가 나오는 경우, 입력 x를 FA수 라고 한다.
입력 x가 주어졌을때 이 수가 FA 수인지 출력하라.
정수 x 가 주어진다. (0 ≤ x ≤ 10**100)
정수 x가 FA수 라면 FA를 출력하고, 아니라면 NFA를 출력한다.
>>>코드
x = int(input())
print('FA')
놀랍게도 모든 정수는 결국 1의자리수 * 자기자신으로 마무리된다.
따라서 그냥 'FA'를 출력하면 된다
12. 백준 15963 CASIO
카시오 계산기는 만능 계산기이다.
시험을 한 번이라도 쳐본 일곽인이라면, 이 카시오의 소중함에 대해서 뼈저리게 느껴보았을 것이다.
하지만, 이런 카시오에도 함정이 있다. 바로, 카시오 계산기는 배터리를 통해 돌아간다는 것이다.
송찬이는 시험을 치다가 갑자기 계산기의 배터리가 나가버렸다. 그래서 선생님께 배터리를 달라고 요구했는데, 요구하고 보니 카시오 계산기의 배터리가 어떤 종류인지 말을 안 해버렸다!
과연 선생님은 송찬이가 필요한 배터리 종류를 들고 왔을까?
송찬이가 필요한 배터리 N과 선생님이 가져온 배터리 M이 입력된다.
N과 M은 둘다 최대 10자리 정수까지 들어올 수 있다.
송찬이가 원한 배터리면 1을, 그 외엔 0을 출력한다.
>>>코드
N, M = map(int, input().split())
if N==M:
print(1)
else:
print(0)
간단한 조건문
13. 백준 15726 이칙연산
다음과 같이 세 수가 연속해서 주어졌을 때 한 번의 곱셈 기호와 한 번의 나눗셈 기호를 이용하여 만든 식 중 가장 큰 값을 출력하는 프로그램을 작성하시오. (세 수의 순서는 변하지 않는다.)
첫째 줄에 세 개 정수 A, B, C(1 ≤ A, B, C ≤ 1,000,000)가 주어진다. 답은 int범위를 벗어나지 않는다.
나올 수 있는 가장 큰 값을 출력한다. 단, 소수점 아래는 버린다.
1e-9 이하의 오차로 인해 출력이 달라지는 입력은 주어지지 않는다.
>>>코드
A, B, C =map(int, input().split())
if B>=C:
print(A*B//C)
else:
print(A*C//B)
간단한 연산 문제이다. 더 큰 수를 곱하고 더 작은 수를 나눈다.
14. 백준 15700 타일채우기 4
N×M 크기의 벽에 2×1, 1×2 크기의 타일을 채우려고 한다. 겹치지 않게 놓는다면, 최대 몇 개를 채울 수 있을까?
첫째 줄에 N과 M이 주어진다. (1 ≤ N, M ≤ 1,000,000,000)
첫째 줄에 채울 수 있는 타일 개수의 최댓값을 출력한다.
>>>코드
n, m = map(int, input().split())
print(n*m//2)
어렵게 생각하지 말자. 그냥 가로 세로 2인 타일 무한개로 채우는 것이므로 그냥 2로 나누면 된다
14. 백준 16199 나이 계산하기
한국에서 나이는 총 3가지 종류가 있다.
만 나이: 국제적인 표준 방법이다. 한국에서도 법에서는 만 나이만을 사용한다.
세는 나이: 한국에서 보통 나이를 물어보면 세는 나이를 의미한다.
연 나이: 법률에서 일괄적으로 사람을 구분하기 위해서 사용하는 나이이다.
만 나이는 생일을 기준으로 계산한다. 어떤 사람이 태어났을 때, 그 사람의 나이는 0세이고, 생일이 지날 때마다 1세가 증가한다. 예를 들어, 생일이 2003년 3월 5일인 사람은 2004년 3월 4일까지 0세이고, 2004년 3월 5일부터 2005년 3월 4일까지 1세이다.
세는 나이는 생년을 기준으로 계산한다. 어떤 사람이 태어났을 때, 그 사람의 나이는 1세이고, 연도가 바뀔 때마다 1세가 증가한다. 예를 들어, 생일이 2003년 3월 5일인 사람은 2003년 12월 31일까지 1세이고, 2004년 1월 1일부터 2004년 12월 31일까지 2세이다.
연 나이는 생년을 기준으로 계산하고, 현재 연도에서 생년을 뺀 값이다. 예를 들어, 생일이 2003년 3월 5일인 사람은 2003년 12월 31일까지 0세이고, 2004년 1월 1일부터 2004년 12월 31일까지 1세이다.
어떤 사람의 생년월일과 기준 날짜가 주어졌을 때, 기준 날짜를 기준으로 그 사람의 만 나이, 세는 나이, 연 나이를 모두 구하는 프로그램을 작성하시오.
첫째 줄에 어떤 사람이 태어난 연도, 월, 일이 주어진다.
생년월일은 공백으로 구분되어져 있고, 항상 올바른 날짜만 주어진다.
둘째 줄에 기준 날짜가 주어진다. 기준 날짜도 공백으로 구분되어져 있으며, 올바른 날짜만 주어진다.
입력으로 주어지는 생년월일은 기준 날짜와 같거나 그 이전이다.
입력으로 주어지는 연도는 1900년보다 크거나 같고, 2100년보다 작거나 같다.
첫째 줄에 만 나이, 둘째 줄에 세는 나이, 셋째 줄에 연 나이를 출력한다.
>>>코드
y1, m1, d1 = map(int, input().split())
y2, m2, d2 = map(int, input().split())
if m2<m1:
print(y2-y1-1)
elif m2 == m1:
if d2<d1:
print(y2-y1-1)
else:
print(y2-y1)
else:
print(y2-y1)
print(y2-y1+1)
print(y2-y1)
조건을 잘 이해하면 가능
15. 백준 16486 운동장 한 바퀴
세연이네 학교 운동장은 아래와 같다.
<사이트에서 확인>
위의 그림에서 영역 A와 B는 반원이며, 영역 C는 직사각형이다.
영역 C의 가로의 길이를 d1, 영역 A의 반지름의 길이 d2의 값이 주어지면 운동장의 한 바퀴 둘레를 알아내는 프로그램을 작성하시오. (단, 이 문제에서는 π (원주율)의 값을 3.141592라고 한다.)
첫째 줄에 d1의 값이 주어진다. 둘째 줄에는 d2의 값이 주어진다. (d1, d2의 값은 100,000 이하의 양의 정수)
첫째 줄에 문제에서 요구하는 정답을 출력한다. 절대/상대 오차는 10**(-6) 까지 허용한다.
>>>코드
d1 = float(input())
d2 = float(input())
print(2*3.141592*d2+2*d1)
간단한 실수형 계산 입출력 문제