백준 파이썬 Today I Learn 2023.07.03
7/ 03 파이썬 공부
1. 백준 27245 Комната
Комната характеризуется тремя целыми числами: длиной, шириной и высотой, заданными в миллиметрах. Комната считается хорошей, если выполнены следующие условия: отношение меньшей из длины и ширины к высоте хотя бы 2, а также отношение большей из длины и ширины к меньшей не превосходит 2. По заданным размерам комнаты определите, является ли она хорошей.
На вход подаётся три целых числа: w, l и h --- длина, ширина и высота комнаты, каждое на отдельной строке (1000 <= w, l, h <= 10,000).
Если комната является хорошей, выведите <<good>>, иначе выведите <<bad>>.
>>>해석
방의 가로 길이, 세로 길이, 높이가 mm 단위로 주어질 때, 이 방이 좋은 방인지 판별해봅시다.
아래 조건을 모두 만족하는 방을 좋은 방이라고 합니다.
가로와 세로 중 더 짧은 쪽의 길이와 높이의 비는 2 이상이어야 합니다.
가로와 세로 중 더 긴 쪽의 길이와 짧은 쪽의 길이의 비는 2를 초과하면 안 됩니다.
방의 가로 길이, 세로 길이, 높이를 의미하는 3개의 정수 w, l, h가 한 줄에 하나씩 주어집니다.
좋은 방이라면 "good"을, 아니면 "bad"를 따옴표 없이 출력합니다.
>>>코드
w = float(input())
l = float(input())
h = float(input())
if min(w, l)/h >= 2 and max(w, l)/min(w, l) <= 2:
print('good')
else:
print('bad')
2. 백준 20867 Rulltrappa
Paulina Osqulda pluggar på KTH i Stockholm, och åker varje morgon till skolan via tunnelbanan. När hon kommer fram till sin tunnelbanestation måste hon åka upp längs en rulltrappa för att komma ut.
I rulltrappan bildas det ofta två olika köer. På den högra sidan av trappan ställer sig folk som vill stå still i rulltrappan, medan man ställer sig på den vänstra sidan om man föredrar att gå i rulltrappan (för att komma upp snabbare).
Paulina har märkt att det oftast bildas en jättelång kö till den vänstra sidan av rulltrappan, eftersom alla är så stressade till jobbet och vill kunna gå snabbt upp för rulltrappan. På sista tiden har hon funderat på om det kanske rentav skulle gå snabbare att istället välja den högra kön, eftersom kön där ofta är kortare.
Rulltrappan är totalt M trappsteg lång. Om man står i rulltrappan färdas man S trappsteg per sekund uppåt i rulltrappan. Om man istället går i rulltrappan färdas man G trappsteg per sekund uppåt.
Totalt kan A personer per sekund börja gå i rulltrappan ur den vänstra kön, medan B personer per sekund kan ställa sig på rulltrappan ur den högra kön. Detta betyder att i början av förloppet går en person på rulltrappan. Innan en ny person går på rulltrappan måste denna vänta 1/A (resp 1/B sekunder) för att kunna gå på rulltrappan.
Den vänstra kön är för närvarande L personer lång, och den högra är R personer lång.
Hjälp Paulina avgöra vilken kö hon ska ställa sig i, för att så snabbt som möjligt nå rulltrappans topp.
Den första raden i indatat består av heltalen M, S, G som är beskrivna i uppgiften. Det gäller att 30 <= M <= 200, 1 <= S <= G <= M.
Nästa rad innehåller decimaltalen A, B som är beskrivna i uppgiften. Det gäller att 0.1 <= A, B <= 1.
Den sista raden innehåller heltalen L, R som är beskrivna i uppgiften.
Det gäller att 0 <= L, R <= 100.
Skriv ut latmask om det snabbaste alternativet är att välja den högra kön och stå i rulltrappan, eller friskus om det snabbaste alternativet är att välja den vänstra kön och gå i rulltrappan.
Det är garanterat att tiden det tar för Paulina att åka upp för rulltrappan skiljer sig med minst 1 sekund mellan de två köerna, så du behöver aldrig bry dig om fallet när båda alternativen är lika snabba.
>>>해석
파울리나 오스쿨다는 스톡홀름 왕립 공과 대학교에 재학 중이며, 매일 아침 열차를 통해 학교에 갑니다.
기차역에 도착하면 그녀는 에스컬레이터를 통해 밖으로 나옵니다.
(오스쿨다는 스톡홀름 왕립 공과 대학교에서 공부하는 공학도를 통칭하는 표현입니다.
자세한 것은 (링크 생략)을 참고하세요.)
에스컬레이터에는 종종 두 개의 줄이 형성됩니다. 에스컬레이터 오른쪽에는 가만히 올라가고 싶은 사람이 서 있고, 왼쪽에는 (더 빨리 올라가기 위해) 걸어가는 사람이 있습니다.
파울리나는 많은 사람이 일로 인해 스트레스를 받아 에스컬레이터를 빨리 올라가고 싶어해 보통은 왼쪽 줄이 아주 길다는 사실을 발견했습니다. 최근 그녀는 종종 오른쪽 줄이 더 짧기 때문에 오른쪽 줄을 선택하는 게 더 빠르지 않을까 생각하곤 합니다.
에스컬레이터는 총 M개의 계단으로 이루어져 있습니다.
당신이 가만히 있다면, 에스컬레이터는 1초마다 S개의 계단만큼 올라갑니다.
만약 당신이 걸어 올라간다면, 당신은 1초마다 G개의 계단만큼 올라갑니다.
왼쪽 줄에서는 총 A명이 1초마다 에스컬레이터를 걸어 올라가는 것을 시작할 수 있고, 오른쪽 줄에서는 1초마다 총 B명이 에스컬레이터에 설 수 있습니다. 이는 곧 새로운 사람이 에스컬레이터를 탈 때마다, 줄에 따라 1 / A (혹은 1 / B) 초를 기다려야 한다는 뜻입니다.
현재 왼쪽 줄에는 L명이 있고, 오른쪽 줄에는 R명이 있습니다.
파울리나가 에스컬레이터 끝까지 빠르게 올라가려면 어느 줄을 골라야 하는지 도와줍시다.
입력의 첫 줄에 문제에서 설명한 정수 M, S, G가 주어집니다. 30 <= M <= 200, 1 <= S <= G <= M임은 보장됩니다.
둘째 줄에는 문제에서 설명한 소수 A, B가 주어집니다. 0.1 <= A, B <= 1임은 보장됩니다.
마지막 줄에는 문제에서 설명한 정수 L, R이 주어집니다. 0 <= L, R <= 100임은 보장됩니다.
오른쪽 줄을 골라 에스컬레이터에 가만히 서서 가는 게 더 빠른 경우 latmask를 출력하고, 왼쪽 줄을 골라 에스컬레이터를 걸어 올라가는 게 더 빠를 경우 friskus를 출력합니다.
두 줄을 각각 선택했을 때 에스컬레이터 끝까지 도착하는 시간이 최소 1초 이상 차이가 남은 보장되므로, 두 줄이 똑같은 시간이 걸릴 경우는 고려하지 않아도 됩니다.
>>>코드
m, s, g = map(float, input().split())
a, b = map(float, input().split())
l, r = map(float, input().split())
left = 1/a * l + m/g
right = 1/b * r + m/s
if left<right:
print('friskus')
else:
print('latmask')
3. 백준 21591 Laptop Sticker
Your school has provided you with a laptop computer! However, they insist on putting a laptop sticker with their logo on your new computer. That sticker might be very large, and it can’t be rotated! Will it fit, with one centimeter to spare on all sides?
The single line of input contains four integers w_c, h_c, w_s and h_s (1 <= w_c, h_c, w_s, h_s <= 1,000), where w_c is the width of your new laptop computer, h_c is the height of your new laptop computer, w_s is the width of the laptop sticker, and h_s is the height of the laptop sticker. All measurements are in centimeters.
Output a single integer, which is 1 if the laptop sticker will fit on your new laptop computer, without rotating, but with one centimeter space on all sides, and 0 if the laptop sticker won’t fit.
>>>해석
학교가 당신에게 노트북을 제공했습니다! 하지만 그 조건으로 새 컴퓨터에 그들의 로고가 그려진 스티커를 붙일 것을 주장합니다. 스티커는 굉장히 크고 회전할 수도 없습니다! 각 변에 1cm 공간을 남기려 할 때, 스티커가 사이즈에 맞을까요?
한 줄 입력에 wc, hc, ws, hs (1 <= wc, hc, ws, hs <= 1000)이 주어집니다.
wc는 새 노트북의 너비, hc는 새 노트북의 높이, ws는 노트북 스티커의 너비, hs는 노트북 스티커의 높이입니다. 모든 단위는 cm입니다.
스티커가 회전하지 않고도 새 노트북에 1cm 간격을 남기고 맞는다면 정수 1을, 맞지 않는다면 정수 0을 출력합니다.
>>>코드
wc, hc, ws, hs = map(int, input().split())
if wc >= ws + 2 and hc >= hs + 2:
print(1)
else:
print(0)
4. 백준 27262 Лифт
Миша живет на n-м этаже. Когда Миша заходит в подъезд, он смотрит, на каком этаже в этот момент находится лифт и решает, вызвать лифт или пойти по лестнице.
Сегодня лифт находится на k-м этаже. Миша заходит в подъезд на 1 этаже. Он поднимается на один этаж за a секунд. Лифт перемещается на один этаж за b секунд. Временем входа в лифт и выхода из лифта, а также перемещения к лестнице и обратно можно пренебречь.
Помогите Мише принять решение, выведите, за какое время он попадет на свой этаж на лифте и по лестнице, соответственно.
На ввод подаются целые числа: n, k, a и b.
2 <= n <= 100, 1 <= k <= 100, 1 <= a, b <= 1000.
Выведите два целых числа: время, за которое Миша поднимется на свой этаж на лифте, и время, за которое Миша поднимется на свой этаж по лестнице.
>>>해석
미샤는 n층에 삽니다. 입구에 서면, 미샤는 엘리베이터가 몇 층에 있는지 보고 엘리베이터를 부를지 계단으로 걸어 올라갈지 결정합니다.
오늘 엘리베이터는 k층에 있습니다. 미샤가 서 있는 입구는 1층입니다.
한 층을 계단으로 걸어 올라가는 데 걸리는 시간은 a초입니다. 엘리베이터는 한 층 당 b초의 속도로 움직입니다. 엘리베이터에 들어가는 시간과 엘리베이터를 나가는 시간, 계단으로 갔다가 계단에서 오는 시간은 무시합니다.
계단을 활용할 때와 엘리베이터를 사용할 때 미샤가 자기가 사는 층까지 가는 데 걸리는 시간을 각각 출력해 미샤의 결정을 도와줍시다.
정수가 입력으로 주어집니다: n, k, a, b. (2 <= n <= 100, 1 <= k <= 100, 1 <= a, b <= 1000)
두 정수를 출력합니다: 미샤가 층까지 엘리베이터로 갈 때 걸리는 시간과 계단을 사용할 때 걸리는 시간입니다.
>>>코드
n, k, a, b = map(int, input().split())
print((n+k-2)*b, (n-1)*a)
5. 백준 27541 末尾の文字 (Last Letter)
JOI 高校の生徒である葵は,文字列 JOIG が,文字列 JOI の末尾に文字 G を付け加えてできることに気が付いた.
そこから葵は,様々な文字列について,末尾に文字 G を付け加えたり,末尾の文字 G を取り除いて遊ぶようになった.
具体的には,葵は文字列を見ると次のように遊ぶ.
見た文字列の末尾の文字が G のとき,末尾の文字 G を取り除いた文字列を思い浮かべる.
取り除く文字は末尾の 1 文字のみである.
見た文字列の末尾の文字が G でないとき,文字列の末尾に文字 G を付け加えた文字列を思い浮かべる.
長さ N の文字列 S が与えられる.葵が文字列 S を見たとき思い浮かべる文字列を求めるプログラムを作成せよ.
入力は以下の形式で与えられる.
N
S
葵が文字列 S を見たとき思い浮かべる文字列を出力せよ.
>>>해석
JOI고등학교 학생인 아오이는 문자열 JOIG가, 문자열 JOI의 끝에 문자 G를 더해 완성된다는 걸 알게 되었다.
그래서 아오이는 다양한 문자열의 끝에 G를 붙이거나 문자열 끝의 G를 빼면서 놀게 되었다.
구체적으로는 아오이는 문자열을 볼 때 다음과 같이 놀았다.
본 문자열의 끝의 문자가 G이면 그 문자 G를 뺀 문자열을 떠올린다. 뺄 때는 맨 뒤의 한글자만 뺀다.
본 문자열의 끝이 G가 아니면, 문자열 끝에 G를 붙인 문자열을 떠올린다.
길이 N의 문자열 S가 주어진다. 아오이가 문자열 S를 볼 때 떠올리는 문자열을 구하는 프로그램을 작성하시오.
입력은 다음과 같이 주어진다.
N
S
아오이가 문자열 S를 볼 때 떠올리는 문자열을 출력하시오.
>>>코드
n = int(input())
s = input()
if s[-1] == 'G':
print(s[:-1])
else:
print(s + 'G')
6. 백준 22015 金平糖 (Konpeito)
JOI 高校の生徒である葵と凛は,教師の理恵先生と一緒に 3 人で金平糖を同じ数だけ食べることにした.
いま,葵は A 粒,凛は B 粒,理恵先生は C 粒の金平糖を食べた.
3 人が食べた金平糖の個数を等しくするには,最小で合計いくつの金平糖を追加で食べる必要があるだろうか.
3 人が食べた金平糖の個数 A, B, C が与えられたとき,追加で食べる金平糖の個数の最小値を求めるプログラムを作成せよ.
入力は以下の形式で標準入力から与えられる.
A B C
標準出力に,追加で食べる金平糖の個数の最小値を 1 行で出力せよ.
>>>해석
JOI 고등학교의 학생인 아오이와 린은 교사인 리에 선생님과 함께 세 명이 같은 수의 별사탕을 먹기로 했습니다. 지금 아오이는 A개, 린은 B개, 리에 선생님은 C개의 별사탕을 먹었습니다.
세 명이 먹은 별사탕의 개수를 똑같이 하기 위해 최소 몇 개의 별사탕을 추가로 먹어야 할까요.
세 명이 먹은 별사탕의 개수 A, B, C가 주어질 때, 추가로 먹어야 하는 별사탕의 개수의 최솟값을 구하는 프로그램을 작성합시다.
아래의 형식으로 표준 입력이 주어집니다.
A B C
추가로 먹어야 하는 별사탕 개수의 최솟값을 한 줄에 출력합니다.
>>>코드
a, b, c = map(int, input().split())
print(max(a,b,c)*3 - (a+b+c))
7. 백준 20976 2 番目に大きい整数 (The Second Largest Integer)
3 つの整数 A, B, C が与えられる.これらのうち 2 番目に大きい数を出力せよ.
入力は以下の形式で標準入力から与えられる.
A B C
A, B, C のうち,2 番目に大きい数を出力せよ.
>>>해석
세 정수 A, B, C가 주어집니다. 이중 두 번째로 큰 수를 출력합시다.
아래의 형식으로 표준 입력이 주어집니다.
A B C
A, B, C 중 두 번째로 큰 수를 출력합니다.
>>>코드
l = list(map(int, input().split()))
l.sort()
print(l[1])
8. 백준 20673 Covid-19
The ministry of health in Neverland has recently published a colorcoded chart to help people better understand the level of Covid-19 risk in different cities, and take appropriate actions and precautions based on the risk level.
In this chart, each city is colored either red, yellow, or white, based on some indicators showing the coronavirus risk level at that city. After exploring several models, the ministry has reached the following criteria for classifying the cities. For a given city, if the average number of new cases per day over the past two weeks is at most 50 per one million population, and the average number of new hospitalizations per day over the past two weeks is at most 10 in every one million population, then the city is marked as white, meaning that the city is in a low-risk zone. On the other hand, if the average number of new hospitalizations per day in a city over the past two weeks is more than 30 per one million population, then the city is categorized as high-risk and is color-coded red. All other cities are colored yellow.
While the data for new cases and hospitalizations are publicly available, the ministry does not update its colorcoded chart very frequently. Hana, a curious student, likes to know the risk level of her city at any point of time, before the ministry publishes its updated chart. She can obtain the average number of new cases and new hospitalizations from the Internet, but she needs your help to convert this data to a color code that better demonstrates the risk level at her city.
The input consists of two lines. The first line contains an integer p (0 ⩽ p ⩽ 1000), showing the average number of new cases per day in every one million population in Hana’s city over the past two weeks. The second line contains an integer q (0 ⩽ q ⩽ 500), showing the average number of new hospitalizations per day in every one million population over the past two weeks in that city. Note that q ⩽ p.
In the output, print the color-code of Hana’s city. It must be either White, Yellow, or Red.
>>>해석
네버랜드의 보건부는 최근 사람들이 각 도시의 코로나19 위험 수준을 보다 잘 이해해 적절한 예방 및 조치를 취할 수 있도록 색상 그래프를 만들어 발표했습니다.
이 그래프에서 각 도시는 그 도시의 코로나 바이러스 위험 수준을 나타내는 여러 지표를 기반으로 빨강, 노랑, 또는 하양으로 표시됩니다. 여러 모델을 시도해본 후, 보건부는 도시를 다음과 같은 기준으로 구분하기로 했습니다. 특정 도시에 대하여, 지난 2주 동안 하루 신규 확진 수의 평균이 최대 100만 명 당 50명이고 또 지난 2주 동안 하루 신규 입원 수의 평균이 최대 100만 명 당 10명이라면 그 도시는 하양으로 표시되어 저위험군임을 나타냅니다. 반면 지난 2주 동안 하루 신규 입원 수의 평균이 100만 명 당 30명보다 많다면, 그 도시는 고위험군으로 분류되어 빨강으로 표시됩니다. 나머지 도시는 모두 노랑으로 표시됩니다.
신규 확진과 입원에 관한 데이터는 누구나 접근 가능하지만, 보건부는 색상 그래프를 그렇게 자주 업데이트하지는 않습니다. 호기심이 많은 학생인 한나는 보건부가 그래프를 업데이트하기 전에 어느 시간이건 그녀가 사는 도시의 위험 수준을 알고 싶습니다. 그녀는 인터넷에서 평균 신규 확진 수와 입원 수를 구할 수 있지만, 그녀의 도시의 위험 수준을 보다 잘 표현하기 위해서는 이 데이터를 색상 그래프로 변환하는 당신의 도움이 필요합니다.
입력은 두 줄입니다. 첫 줄에는 지난 2주 동안 100만 명이 사는 한나의 도시에서 나온 하루 신규 확진 수의 평균인 p (0 <= p <= 1000)가 주어집니다. 둘째 줄에는 지난 2주 동안 한나의 도시에서 100만 명 당 하루 신규 입원 수의 평균인 q (0 <= q <= 500)가 주어집니다. q <= p임을 명심합시다.
색상 그래프에서 한나가 사는 도시의 색상을 출력합니다. 출력은 White, Yellow, 또는 Red 중 하나입니다.
>>>코드
p = int(input())
q = int(input())
if p <= 50 and q <= 10:
print('White')
elif q > 30:
print('Red')
else:
print('Yellow')
9. 백준 24196 Gömda ord
Anna skickar hemliga krypterade meddelanden till Bert.
För att kunna läsa meddelandena måste Bert dekryptera dem med följande algoritm:
- Första bokstaven i indata-strängen tas med i utdata-strängen.
- Varje bokstav som man tar med beskriver var i indatasträngen nästa bokstav finns som ska tas med. Ett 'A' betyder att nästa bokstav finns 1 position fram, ett 'B' innebär 2 positioner fram osv.
- När man kommit till den sista bokstaven i indatat så tar man med den bokstaven och är klar. Indatan är sådan att man alltid kommer till den sista bokstaven.
Hjälp Bert genom att skriva ett program som avkrypterar Annas meddelanden.
Den första och enda raden i indatat innehåller den krypterade strängen (högst 50 tecken). Strängen kommer kunna avkrypteras med ovan beskrivna algoritm utan att man trillar över sista bokstaven. Skriv ut den avkrypterade strängen.
>>>해석
안나가 암호화된 메시지를 버트에게 보냈다.
메시지를 읽기 위해, 버트는 다음 알고리즘을 사용하여 메시지를 복호화해야 한다.
- 입력 문자열의 첫 번째 문자는 출력 문자열에 포함된다.
- 출력 문자열에 포함된 각 문자는 입력 문자열에서 다음에 포함될 문자의 위치를 나타낸다.
'A'는 다음 문자가 한 위치 뒤에 있음을 의미하고 'B'는 두 위치 뒤에 있음을 의미한다.
- 입력의 마지막 문자에 도달하면, 해당 문자를 출력 문자열에 포함한 뒤 작업을 완료한다.
입력은 항상 마지막 문자에 도달한다.
버트를 도와 안나의 메시지를 해독하는 프로그램을 작성하자.
첫째 줄에 대문자로 이루어진 암호화된 문자열(최대 50자)이 주어진다.
문자열은 위에서 설명한 알고리즘을 사용했을 때 항상 마지막 문자를 포함한다.
복호화한 문자열을 출력한다.
>>>코드
n = input()
i = 0
while i < len(n):
print(n[i], end = '')
i = i + ((ord(n[i])-64))
10. 백준 28295 체육은 코딩과목 입니다
UCPC 초등학교의 체육대회 날이 다가오고 있다. UCPC 초등학교 1학년 1반의 학생들은 담임 선생님 종서의 지시에 맞춰 특정한 방향을 바라보는 연습을 하고 있다.
학생들은 초기에 북쪽을 바라보고 있으며, 종서는 다음과 같은 형태의 지시를 총 열 번 내린다:
- 우향우: 각 학생은 현재 상태에서 오른쪽으로 90도 돈다.
- 뒤로 돌아: 각 학생은 현재 상태에서 오른쪽으로 180도 돈다.
- 좌향좌: 각 학생은 현재 상태에서 왼쪽으로 90도 돈다.
종서는 초등학생들이 지시를 정확하게 이행하는 것이 어렵다는 것을 인지하고, 학생들이 자신의 지시를 성공적으로 따른다면 사탕을 나누어 주기로 했다. 학생들을 도와 담임 선생님 종서의 지시대로 바라보는 방향을 바꾸었을 때, 최종적으로 바라보는 방향을 구해보자.
10개의 줄에 걸쳐 종서가 내린 각 지시에 대한 정보를 나타내는 정수 t_i(1 <= i <= 10)가 한 줄에 하나씩 주어진다. t_i의 값은 1, 2, 3 중 하나로,
- t_i=1이라면 i 번째 명령이 우향우임을,
- t_i=2라면 i 번째 명령이 뒤로 돌아임을,
- t_i=3이라면 i 번째 명령이 좌향좌임을 나타낸다.
10개의 지시를 모두 이행한 후 학생들이 바라보는 방향을 나타내는 문자를 출력한다.
학생들이 바라보는 방향이 북쪽이라면 N, 동쪽이라면 E, 서쪽이라면 W, 남쪽이라면 S를 출력한다.
>>>코드
r = 0
for i in range(10):
n = int(input())
r += n*90
if r%360 == 0:
print('N')
elif r%360 == 90:
print('E')
elif r%360 == 180:
print('S')
else:
print('W')
11. 백준 28281 선물
N일 뒤는 동원이의 생일이다. 축하해 주자!
준원이는 동원이에게 생일 선물로 양말을 2X개 선물하려 한다. 양말은 시장에서 살 것이다.
연속한 이틀에 걸쳐서, 준원이는 매일 시장에서 양말을 X개씩 사서 트럭에 담아올 것이다.
시장에서 양말의 가격은 날마다 다를 수 있다. 오늘부터 i번째 날에, 양말은 하나에 A_i원이다.
동원이의 생일까지 N일 남았다! 남은 N일 가운데 연속한 이틀에 걸쳐 양말 2X개를 사는 데 드는 최소 비용은?
첫째 줄에 N과 X가 공백을 사이에 두고 주어진다.
둘째 줄에 N일간 양말의 가격 A_1, A_2, ..., A_N이 공백을 사이에 두고 주어진다.
연속한 이틀에 걸쳐 하루에 양말을 X개씩 구매하는 방법으로, 양말 2X개를 사는 데 드는 최소 비용을 출력한다.
>>>코드
n, x = map(int, input().split())
a = list(map(int, input().split()))
l = []
for i in range(n-1):
l.append(a[i]+a[i+1])
print(min(l) * x)