백준/백준 파이썬

백준 파이썬 Today I Learn 2023.05.24

군청레프 2023. 5. 25. 23:58
728x90

5/ 24 파이썬 공부
1. 백준 5063 TGN
상근이는 TGN사의 사장이다. 
TGN은 Teenager Game Network의 약자 같지만, 사실 Temporary Group Name의 약자이다.
이 회사는 청소년을 위한 앱을 만드는 회사이다. 
일년에 걸친 개발기간 끝에 드디어 앱을 완성했고, 이제 팔기만 하면 된다.
상근이는 데이트를 인간의 두뇌로 이해할 수 없을 정도로 많이 한다. 따라서 엄청난 데이트 비용이 필요하다. 
상근이는 광고를 적절히 해서 수익을 최대한 올리려고 한다.
어느 날 하늘을 바라보던 상근이는 시리우스의 기운을 받게 되었고, 광고 효과를 예측하는 능력을 갖게 되었다.
광고 효과가 주어졌을 때, 광고를 해야할지 말아야할지 결정하는 프로그램을 작성하시오.
첫째 줄에 테스트 케이스의 개수 N이 주어진다. 다음 N개의 줄에는 3개의 정수 r, e, c가 주어진다. r은 광고를 하지 않았을 때 수익, e는 광고를 했을 때의 수익, c는 광고 비용이다. (-10**6 ≤ r,e ≤ 10**6, 0 ≤ c ≤ 10**6)
각 테스트 케이스에 대해서, 광고를 해야 하면 "advertise", 하지 않아야 하면 "do not advertise", 광고를 해도 수익이 차이가 없다면 "does not matter"를 출력한다.

>>>코드

N = int(input())
for i in range(N):
    r, e, c = map(int, input().split())
    if r> e-c:
        print('do not advertise')
    elif r< e-c:
        print('advertise')
    else:
        print('does not matter')



2. 백준 5217 쌍의 합
1보다 크거나 같고 12보다 작거나 같은 자연수 n이 주어졌을 때, 
합이 n이 되는 두 자연수의 쌍을 찾는 프로그램을 작성하시오.
예를 들어, 5가 주어진 경우 가능한 쌍은 1,4와 2,3이 있다. 두 수는 항상 달라야 한다. 
즉, 3,3은 올바른 쌍이 아니다. 또, 첫 번째 수가 두 번째 수보다 작아야 한다.
출력하는 쌍은 항상 사전순으로 출력해야 한다. 즉, 각 쌍의 작은 수로 비교를 해야 한다. 
예를 들어 1,5는 2,4보다 사전순으로 앞선다.
첫째 줄에 테스트 케이스의 수 (< 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다.
각 테스트 케이스마다 n을 만드는 쌍을 사전순으로 출력한다. 
n을 만드는 쌍이 없는 경우에는 아무것도 출력하지 않는다.
예제 출력 형식을 참고해 출력한다.

>>>예제
입력
4
2
3
4
5

출력
Pairs for 2:
Pairs for 3: 1 2
Pairs for 4: 1 3
Pairs for 5: 1 4, 2 3

>>>코드

for i in range(int(input())):
    n = int(input())
    print('Pairs for %d: ' %(n), end = '')
    for j in range(1, n//2 + 1):
        if j != n-j:
            print('%d %d' %(j, n-j), end = '')
        if j != n//2 and j+1 != n-j-1:
            print(', ', end = '')    
    print()


3. 백준 28061 레몬 따기
성우는 숲에서 레몬을 따와야 한다. 숲은 하나의 수직선으로 표현할 수 있고, 여기에는 레몬 나무 N그루가 x=1부터 x=N까지 일정한 간격으로 자라 있다. 성우는 현재 x=0에 있으며, 집은 x=N+1에 있다. x=i에 위치한 나무에는 a_i개의 레몬이 자라 있다. 성우는 집에 돌아갈 때까지 매번 다음 중 하나를 선택하여 행동한다.

(1) 채집: 나무에 자라있는 레몬을 모두 딴다. 이 행동은 최대 한 번 할 수 있다.
(2) 이동: 현재 위치가 x=i라면, x=i+1로 이동한다.
하지만 레몬을 담을 보따리에는 구멍이 뚫려 있었다. 
성우가 이동(행동 2)할 때마다, 보따리에 레몬이 담겨 있다면 보따리에 담긴 레몬이 1개 빠져나오고, 이는 다시 주울 수 없다. 성우가 집에 들고 갈 수 있는 레몬의 최대 개수를 구해주자!

첫째 줄에 나무의 수 N이 주어진다. (1 <= N <= 2 * 10^5)

둘째 줄에는 x=i에 위치한 나무에 자라 있는 레몬의 개수 a_i가 차례대로 주어진다. 
(1 <= a_i <= 10^9)

>>>코드

n = int(input())
lemon = list(map(int, input().split()))
for i in range(n):
    lemon[i] = lemon[i] - (n-i)
print(max(lemon))



4. 백준 28014 첨탑 밀어서 부수기
자랑스러운 부산대학교의 새내기인 산지니는 일직선상의 등굣길을 가로막고 있는 정체불명의 첨탑들을 밀어 넘어뜨려서 부수기로 하였다.
첨탑은 일렬로 줄지어 서 있으며 산지니가 첨탑을 앞에서 밀면 뒤로 밀려 넘어진다.
밀려 넘어지는 첨탑의 높이가 바로 그다음 첨탑의 높이보다 클 때만 그다음 첨탑도 밀려 넘어진다.
산지니가 모든 첨탑을 밀어 넘어뜨리기 위해서 몇 번을 밀어야 하는지 구하여라. 
산지니는 반드시 앞으로만 이동하며 길을 우회하지 않는다.
첫째 줄에 첨탑의 개수 N이 주어진다. (1 <= N <= 5,000,000)
둘째 줄에는 앞에서부터 차례대로 첨탑의 높이 H_1, H_2, ..., H_n (1 <= H_i <= 1,000,000) 이 주어진다.
입력으로 주어지는 모든 수는 정수이다.
첫째 줄에 첨탑을 밀어야 하는 횟수를 출력하라.

>>>코드

n = int(input())
height = list(map(int, input().split()))
r = n
for i in range(n-1):
    if height[i] > height[i+1]:
        r -= 1
print(r)



5. 백준 25965 미션 도네이션
리그오브전설 스트리머 순범이는 트위치 플랫폼으로 시청자를 끌어모으고 있다. 
순범이는 '트윕' 음성 도네이션을 통해 시청자들과 소통하고는 한다. 
순범이는 트윕에 '미션' 기능이 있다는 것을 알고, 자신의 리그오브 전설 실력을 활용해 매 게임마다 미션 기능으로 돈을 끌어모으려고 한다. 미션 기능을 이용하는 시청자가 너무 많을 때도 있어서 순범이는 게임이 끝난 후 자신이 미션으로 받을 수 있는 총 도네이션 금액이 얼마인지를 구하는 계산 프로그램을 작성하고자 한다. 각 게임들은 여러 개의 미션으로 이루어져 있으며, 각 미션들은 킬당 K원 추가, 데스당 D원 차감, 어시스트당 A원 추가의 형식으로 주어진다. 만약 어떤 미션의 계산 금액이 0보다 작은 경우에는 총 금액에 이를 합산하지 않는다. 각 게임을 새로 시작할 때에는 도네이션 금액은 0부터 시작한다. 순범이가 각 게임을 마칠 때마다 받게 되는 총 도네이션 금액을 구해보자.
첫 줄에 총 게임의 수 N이 주어진다. (1 <= N <= 50)
각 게임마다 첫 줄에 총 미션의 수 M이 주어지며, M개의 줄에 거쳐 각 미션의 내용이 주어진다. (1 <= M <= 100)
각 미션들은 킬당 추가해야 하는 금액 K, 데스당 차감해야 하는 금액 D, 어시스트당 추가해야 하는 금액 A가 공백으로 구분되어 주어진다. (1,000 <= K, D, A <= 5 * 10^7)
각 게임당 마지막 줄에 게임이 종료된 후 순범이의 킬 k, 데스 d, 어시스트 a가 공백으로 구분해 주어진다. 
(0 <= k,d,a <= 50)
각 게임마다 순범이가 받는 총 도네이션 금액을 순서대로 한 줄씩 출력한다.

>>>코드

T = int(input())
for i in range(T):
    n = int(input())
    k, d, a, donation = [], [], [], []
    for j in range(n):
        kk, dd, aa = map(int, input().split())
        k.append(kk)
        d.append(dd)
        a.append(aa)
    K, D, A = map(int, input().split())
    for j in range(n):
        don = K * k[j] + A * a[j] - D * d[j]
        if don<0:
            don = 0
        donation.append(don)
    print(sum(donation))



6. 백준 27736 찬반투표
중앙대학교에서 재학생을 대상으로 하는 어떤 찬반투표가 치러졌다. 
모든 재학생은 각자 찬성이나 반대, 혹은 기권 중 하나로 투표에 응답하였다.
해당 투표에서 찬성이 반대보다 많으면 투표가 통과된다. 
반대가 찬성보다 많거나, 반대와 찬성의 수가 동일하다면 투표는 통과되지 않는다. 
단, 기권한 사람이 재학생의 절반 이상이라면 찬성과 반대의 수와 관계없이 항상 투표는 무효 처리된다.
재학생들의 투표 내역을 입력받아 찬반투표의 결과를 출력하는 프로그램을 구현하시오.
첫 번째 줄에 중앙대학교 재학생의 수 N이 주어진다.
두 번째 줄에 N개의 투표 내역이 공백으로 구분되어 주어진다. 각각 찬성은 1, 반대는 -1, 기권은 0으로 주어진다.
투표가 통과되었으면 APPROVED, 통과되지 않았으면 REJECTED, 무효 처리되었으면 INVALID를 출력한다.

>>>코드

n = float(input())
vote = list(map(int, input().split()))
if vote.count(0) >= n/2:
    print('INVALID')
else:
    if sum(vote)>0:
        print('APPROVED')
    else:
        print('REJECTED')


7. 백준 27465 소수가 아닌 수
이 대회의 운영진 중 한 명인 KSA 학생은 17시와 19시를 구별할 수 없다. 
이는 당연하게도 17과 19가 모두 소수이기 때문일 것이다. 시간을 제대로 구별해서 KSA의 명예를 지키기 위해 정수 N을 입력받아서 소수가 아닌 N 이상의 정수를 아무거나 구해주자.
첫 번째 줄에 정수 N이 주어진다.
문제의 정답을 출력한다. 정답은 10^9 이하여야 한다.
정답이 여러 개 존재한다면 아무거나 출력해도 상관없다.

-제한
 1 <= N <= 10^9

>>>코드

N = int(input())
print(10**9)


문제에 속지말자. 괜히 곱하거나 구해서 새로운 수 만들지 말고, 수의 범위 중에 가장 큰 소수가 아닌 수.
즉 10**9를 출력하면 된다.

8. 백준 26645 성장의 비약 선택권
지훈이가 즐겨 하는 게임인 ‘메이플스토리’에는 레벨과 경험치가 존재한다. 
메이플스토리에서 캐릭터의 레벨을 올리기 위해서는 많은 몬스터를 사냥하여 경험치를 얻어야 하지만, 다행히도 레벨업의 난이도를 낮추기 위해 다량의 경험치를 얻을 수 있는 아이템 ‘성장의 비약’이 존재한다.
이벤트로 가끔 얻을 수 있는 ‘성장의 비약 선택권’을 사용하면 위 사진처럼 네 가지의 성장의 비약 중 한 가지를 선택하여 적힌 개수만큼 얻을 수 있다. 캐릭터의 현재 레벨을 포함하는 구간의 성장의 비약을 사용하면 캐릭터의 레벨이 정확히 1만큼 오른다. 태풍 성장의 비약은 200 ~ 239레벨의 캐릭터를 정확히 1레벨 올려준다. 모든 성장의 비약은 한번에 한 개씩 사용할 수 있고, 캐릭터의 현재 레벨을 포함하지 않는 구간의 성장의 비약은 사용하지 못한다.
지훈이가 성장의 비약을 사용할 캐릭터의 현재 레벨이 주어졌을 때, 어떤 성장의 비약을 선택해야 가장 높은 레벨에 도달할 수 있는지 알려주자!
만약 가장 높은 레벨에 도달할 수 있는 성장의 비약의 종류가 둘 이상이라면, 사진상 더 아래에 있는 성장의 비약을 선택한다.
첫 번째 줄에 지훈이가 성장의 비약을 사용할 캐릭터의 현재 레벨을 나타내는 정수 N이 주어진다. 
(200 <= N <= 239)
지훈이가 선택해야 할 성장의 비약이 '성장의 비약 (200 ~ 209)'이라면 1, '성장의 비약 (200 ~ 219)'이라면 2, '성장의 비약 (200 ~ 229)'이라면 3, '태풍 성장의 비약'이라면 4를 출력한다. 

+a) 비약 개수
성장의 비약(200 ~ 209): 8개
성정의 비약(200 ~ 219): 4개
성장의 비약(200 ~ 229): 2개
태풍 성장의 비약: 1개

>>>코드

n = int(input())
if n<206:
    print(1)
elif n<218:
    print(2)
elif n<229:
    print(3)
else:
    print(4)



조건들만 잘 이해하자

9. 백준 26594 ZOAC 5
2022년 12월, 다섯 번째로 개최된 ZOAC의 오프닝을 맡은 성우는 누구보다 화려하게 ZOAC를 알리려 한다.
매번 새로운 방식으로 문자열을 보여주던 성우는 이번 대회에서는 평범하게 앞 글자부터 하나씩 보여주기로 했다. 성우는 문자를 입력하기 위해 키보드로 손을 뻗은 순간, 실수로 마시던 소주를 키보드에 쏟아버리고 말았다... 알코올에 취한 키보드는 어떤 자판을 한 번만 눌러도 N번 누른 것처럼 인식을 하게 되어버렸다!
소중한 키보드를 고치기 위해 고장 접수를 하는 성우는 N을 정확하게 알아야 한다. 
눈물이 앞을 가려 모니터를 제대로 볼 수 없는 성우를 위해 대신 N을 구해주도록 하자!
첫째 줄에 성우가 고장 난 키보드로 입력한 문자열이 주어진다.
문자열의 길이는 1,000,000보다 크지 않고, 빈 문자열은 주어지지 않는다.
성우는 알파벳 대문자만 입력하고, 어떤 알파벳도 두 번 이상 입력하지 않는다.
성우는 독수리 타법이므로 한 번에 하나의 자판만 누를 수 있다.
첫째 줄에 N을 출력한다.

>>>코드

zoac = input()
print(zoac.count(zoac[0]))



10. 백준 26264 빅데이터? 정보보호!
서울사이버대학교 빅데이터·정보보호학과는 빅데이터에 관심이 있는 학생들과 정보보호에 관심이 있는 학생들이 골고루 섞여 있는 학과이다.
빅데이터·정보보호학과에서 수업을 하던 노교수는 학생들이 빅데이터와 정보보호 중 어느 분야에 더 관심이 많은지 궁금해졌다. 그래서 학생들을 만날 때마다 항상 이를 물어보고 답을 bigdata 혹은 security로 구분하여 메모장에 적어두었는데, 실수로 띄어쓰기와 개행이 전혀 없는 상태로 기록해두었다.
이대로는 학생들이 빅데이터와 정보보호 중 어느 분야에 더 관심이 많은지를 알아낼 수 없기 때문에, 당신에게 분석을 의뢰했다. 물어본 학생의 수와 답이 주어질 때, 결과를 출력하자.
첫 번째 줄에 물어본 학생의 수 N이 주어진다. (1 <= N <= 100,000)
두 번째 줄에 메모장에 적힌 답들이 한 줄의 문자열로 주어진다. 문자열은 bigdata 또는 security로만 구성되어 있으며, 띄어쓰기 등의 다른 문자가 포함되어 있지 않다.
첫 번째 줄에 정보보호 분야보다 빅데이터 분야에 관심이 있는 학생이 더 많으면 "bigdata?"를, 빅데이터 분야보다 정보보호 분야에 관심이 있는 학생이 더 많으면 "security!"를, 같으면 "bigdata? security!"를 따옴표 없이 출력한다.

>>>코드

n = int(input())
bs = input()
if bs.count('bigdata') > bs.count('security'):
    print('bigdata?')
elif bs.count('bigdata') < bs.count('security'):
    print('security!')
else:
    print('bigdata? security!')



그냥 단순한 문자열에서도 count 함수를 사용하는 것이 가능하다.

11. 백준 25904 안녕 클레오파트라 세상에서 제일가는 포테이토칩
"안녕 클레오파트라 세상에서 제일가는 포테이토칩"은 이전 사람보다 높은 목소리로 🎵 안녕 클레오파트라 세상에서 제일가는 포테이토칩🎵 을 외치는 게임이다. 
1번부터 N번까지의 사람이 원형으로 앉아서 순서대로 게임을 진행한다. 
게임을 시작하면 먼저 1번이 높이 X의 목소리로 구호를 외친다. 
다음 번호의 사람은 이전 번호의 사람이 냈던 목소리의 높이보다 1이 더 높은 목소리로 외친다. 
즉, 1번이 X, 2번이 X+1, ‎..., N번이 X+N-1 높이의 목소리로 "안녕 클레오파트라 세상에서 제일가는 포테이토칩"을 외친다. N번이 성공하면 1바퀴가 돌았으므로 다시 N번의 다음 번호인 1번으로 차례가 돌아오게 된다.
자기 차례에 내는 목소리의 높이가 자신이 낼 수 있는 목소리의 상한선보다 클 경우 게임에서 지고 벌칙으로 술을 마신다. 각 사람마다 낼 수 있는 목소리의 높이의 상한선이 주어질 때, 처음으로 술을 마시는 사람을 구하여라.
첫 번째 줄에 게임에 참여하는 사람 수 N, 1번이 처음으로 낼 목소리의 높이인 정수 X가 공백으로 구분되어 주어진다. (3 <= N <= 100; 1 <= X <= 100)
두 번째 줄에 N개의 정수 T_1, ..., T_N가 공백으로 구분되어 주어진다. 
T_i는 i번이 낼 수 있는 목소리 높이의 상한선이다. (1 <= T_{i} <= 200) 
처음으로 술을 마시는 사람의 번호를 출력한다.

>>>코드

N, X = map(int, input().split())
voice = list(map(int, input().split()))
i = -1
while True:
    i += 1
    if i == N:
        i = 0
    if voice[i]<X:
        print(i+1)
        break
    X += 1



차근차근하면 가능하다. 짧게 하는건 다른 영역이지만...

728x90