백준/백준 파이썬

백준 파이썬 Today I Learn 2023.05.17

군청레프 2023. 5. 18. 14:58
728x90

5/ 17 파이썬 공부
1. 백준 4619 루트
양의 정수 B와 N이 주어졌을 때, B에 가장 가까운 A**N의 정수 A를 찾는 프로그램을 작성하시오. 
A**N은 B보다 작거나, 크거나, 같다.
입력은 여러 테스트 케이스로 이루어져 있다. 
각 테스트 케이스는 한 줄로 이루어져 있고, B와 N이 주어진다. (1 ≤ B ≤ 1,000,000, 1 ≤ N ≤ 9) 
입력의 마지막 줄에는 0이 2개 주어진다.
각 테스트 케이스에 해당하는 A를 출력한다.

>>>코드
import math
while True:
    B, N = map(float, input().split())
    if B == N == 0:
        break
    A = B**(1/N)
    if abs(math.floor(A)**N - B) > abs((math.floor(A)+1)**N-B):
        print(math.floor(A)+1)
    else:
        print(math.floor(A))

반복해서 하나씩 비교하는 방법도 있지만 귀찮다. 길고
그래서 import math의 버림 함수를 이용했다

1) 반올림, 올림, 버림, 소수점 아래 숫자 버림
-반올림
round(A, 반올림할 위치)
- 올림
import math
math.ceil(A)
-내림
import math
math.floor(A)
-소수점 아래 숫자 버림
import math
math.trunc(A)

2. 백준 3460 이진수
양의 정수 n이 주어졌을 때, 이를 이진수로 나타냈을 때 1의 위치를 모두 찾는 프로그램을 작성하시오. 
최하위 비트(least significant bit, lsb)의 위치는 0이다.
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 
각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다. (1 ≤ T ≤ 10, 1 ≤ n ≤ 10**6)
각 테스트 케이스에 대해서, 1의 위치를 공백으로 구분해서 줄 하나에 출력한다. 위치가 낮은 것부터 출력한다.

>>>코드
T = int(input())
for i in range(T):
    n = bin(int(input()))[2::]
    N = []
    for j in range(len(n)):
        if n[len(n)-j-1] == '1':
            N.append(j)
    print(*N)

이진수의 최하위 비트는 마지막 수다. 즉 거꾸로 읽어들여야 한다는 것.(이걸 몰라서 엄청 헤메었다.)

1) 2진수, 8진수, 16진수 변환
- 2진수
bin(10진수 숫자)
>>>0b+2진수 숫자
- 8진수
oct(10진수 숫자)
>>>0o+8진수 숫자
- 16진수
hex(10진수 숫자)
>>>0x+16진수 숫자

3. 백준 2997 네번째 수
상근이는 등차수열을 이루는 정수 4개를 골랐다. 
이것은 상근이가 고른 수 4개를 정렬했을 때, 인접한 쌍의 차이가 일정하다는 것을 의미한다. 
그 다음 이렇게 고른 수 4개를 노래로 만들어서 외우고 다닌다.
어느 날, 상근이는 자신이 고른 4개 수 중 1개를 까먹었다. 
상근이가 기억하고 있는 수 세 개가 주어졌을 때, 까먹은 수를 구하는 프로그램을 작성하시오.
첫째 줄에 상근이가 고른 4개의 수 중 3개가 주어진다. 
이 수는 크기 순이 아닐 수도 있고, -100보다 크거나 같고, 100보다 작거나 같은 정수이다.
첫째 줄에 까먹은 수를 출력한다. 정답이 여러 개일 경우에는 아무거나 출력하면 된다. 
또한 정답이 존재하지 않는 경우는 입력으로 주어지지 않는다.

>>>코드
N = list(map(int, input().split()))
N.sort()
d1, d2 = N[1]-N[0], N[2]-N[1]
if d1 == d2:
    print(N[2]+d1)
elif d2>d1:
    print(N[1]+d1)
else:
    print(N[0]+d2)

4. 백준 3004 체스판 조각
상근이는 3003번에서 동혁이가 발견한 체스판을 톱으로 자르려고 한다.
상근이는 체스판을 최대 N번 자를 수 있으며, 변에 평행하게만 자를 수 있다. 
또, 자를 때는 체스판의 그 변의 한쪽 끝에서 다른쪽 끝까지 잘라야 한다. 자른 후에는 조각을 이동할 수 없다.
이때, 최대 몇 조각을 낼 수 있는지 구하는 프로그램을 작성하시오.
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)
첫째 줄에 상근이가 얻을 수 있는 조각의 최댓값을 출력한다.

>>>코드
N = int(input())
r, n = 2, 2
for i in range(N-1):
    r += n
    if (i+1)%2 == 0:
        n += 1
print(r)

1  2  3  4  5  6
2  4  6  9  12  16

2번마다 1씩 더해진 공차를 더해준다 (+2 +2 +3 +3 +4 +4)

5. 백준 4493 가위 바위 보?
가위 바위 보는 두 명이서 하는 게임이다. 
보통 미리 정해놓은 수 만큼 게임을 하고, 많은 게임을 이긴 사람이 최종 승자가 된다.
가위 바위 보를 한 횟수와 매번 두 명이 무엇을 냈는지가 주어졌을 때, 
최종 승자를 출력하는 프로그램을 작성하시오.

바위는 가위를 이긴다.
가위는 보를 이긴다.
보는 바위를 이긴다.

첫째 줄에는 테스트 케이스의 개수 t(0 < t < 1000)가 주어진다. 
각 테스트 케이스의 첫째 줄에는 가위 바위 보를 한 횟수 n(0 < n < 100)이 주어진다. 
다음 n개의 줄에는 R, P, S가 공백으로 구분되어 주어진다. 
R, P, S는 순서대로 바위, 보, 가위이고 첫 번째 문자는 Player 1의 선택, 두 번째 문자는 Player 2의 선택이다.
각 테스트 케이스에 대해서 승자를 출력한다. (Player 1 또는 Player 2) 
만약, 비겼을 경우에는 TIE를 출력한다.

>>>코드
T = int(input())
for i in range(T):
    N = int(input())
    p1 = p2 = 0
    for j in range(N):
        a, b = input().split()
        if a == b:
            continue
        elif (a == 'R' and b == 'S') or (a == 'P' and b == 'R') or (a == 'S' and b == 'P'):
            p1 += 1
        else:
            p2 += 1
    if p1>p2:
        print('Player 1')
    elif p1<p2:
        print('Player 2')
    else:
        print('TIE')

조금 길어서 귀찮을 수 있다

6. 백준 4504 배수 찾기
정수 n(0 < n < 1000)과 수의 목록이 주어졌을 때, 
목록에 들어있는 수가 n의 배수인지 아닌지를 구하는 프로그램을 작성하시오.
첫째 줄에 n이 주어진다. 다음 줄부터 한 줄에 한 개씩 목록에 들어있는 수가 주어진다. 
이 수는 0보다 크고, 10,000보다 작다. 목록은 0으로 끝난다.
목록에 있는 수가 n의 배수인지 아닌지를 구한 뒤 예제 출력처럼 출력한다.

>>>코드
n = int(input())
while True:
    N = int(input())
    if N == 0:
        break
    if N%n == 0:
        print('%d is a multiple of %d.' %(N, n))
    else:
        print('%d is NOT a multiple of %d.' %(N, n))

7. 백준 5361 전투 드로이드 가격
상근이는 망가진 전투 드로이드를 고치려고 하고 있다. 전투 드로이드의 각 부품의 가격은 다음과 같다.

블래스터 라이플 $350.34
시각 센서       $230.90
청각 센서       $190.55
팔             $125.30
다리             $180.90

첫째 줄에 테스트 케이스의 개수가 주어진다. 
각 테스트 케이스는 음이 아닌 정수 다섯 개(A B C D E)로 이루어져 있다.

A: 필요한 블래스터 라이플의 개수
B: 필요한 시각 센서의 개수
C: 필요한 청각 센서의 개수
D: 필요한 팔의 수
E: 필요한 다리의 수

각 테스트 케이스 마다, 입력으로 주어진 부품을 모두 구매하는데 필요한 비용을 소수점 둘째 자리까지 출력한다. 
달러 표시도 출력해야 한다. 정답은 1억보다 작거나 같다.

>>>코드
T = int(input())
for i in range(T):
    A, B, C, D, E = map(float, input().split())
    price = A*350.34 + B*230.90 + C*190.55 + D*125.30 + E*180.90
    print('$%.2f' %(price))

계산 문제

8. 백준 5523 경기 결과
A와 B가 게임을 한다. 게임은 N번의 라운드로 이루어져 있다. 
각 라운드에서는, 더 많은 점수를 얻은 사람이 그 라운드의 승자가 된다. 
즉, A의 점수가 B의 점수보다 크면 i번째 라운드는 A의 승리이며, B의 점수가 A의 점수보다 크면 i번째 라운드는 B의 승리이다. 무승부인 경우에는 아무도 승리하지 않는다. N번의 라운드에서의 A와 B의 점수가 주어졌을 때, A가 이긴 횟수와, B가 이긴 횟수를 출력하는 프로그램을 만들어라.
첫째 줄에는 정수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄부터는 정수 Ai, Bi (0 ≤ Ai, Bi ≤ 100)가 공백을 사이에 두고 차례대로 주어진다.
첫째 줄에 A가 이긴 횟수와 B가 이긴 횟수를 차례대로 출력하라.

>>>코드
import sys
N = int(input())
A = B = 0
for i in range(N):
    a, b = map(int, sys.stdin.readline().split())
    if a>b:
        A += 1
    elif a<b:
        B += 1
print('%d %d' %(A, B))

input() 사용하면 시간초과 걸릴 수 있기에 import sys \n sys.stdin.readline()을 사용해야한다

9. 백준 5612 터널의 입구와 출구
상근이는 남산1호터널의 입구와 출구에서 1분에 통과하는 차량의 수를 조사했다. 
이때, 터널에 차량이 가장 많이 있었을 때, 몇 대 있었는지 구하는 프로그램을 작성하시오.
첫째 줄에 조사한 시간 n이 주어진다. 
둘째 줄에는 조사를 시작할 때, 터널 안에 들어있는 차량의 수 m이 주어진다. 
다음 n개 줄의 i번째 줄(i = 1 ~ n)의 정보는 조사를 시작한지 (i-1)분이 경과한 시점부터 i분 경과할 때 까지 1분에 입구를 통과한 차의 수와 출구를 통과한 차의 수이다. n은 10000보다 작거나 같고, 1분에 통과하는 차량의 수는 100이하이다.
조사 시작하고 j분이 지난 시점 (j = 0~n)에서 터널 안에 있는 차량의 수를 Sj라고 하자. 
이때, Sj의 최댓값을 출력한다. 
만약, 터널 안에 있는 차량의 수가 0보다 작은 경우가 한 번 이라도 발생한다면 0을 출력한다.

>>>코드
상근이는 남산1호터널의 입구와 출구에서 1분에 통과하는 차량의 수를 조사했다. 
이때, 터널에 차량이 가장 많이 있었을 때, 몇 대 있었는지 구하는 프로그램을 작성하시오.
첫째 줄에 조사한 시간 n이 주어진다. 둘째 줄에는 조사를 시작할 때, 터널 안에 들어있는 차량의 수 m이 주어진다. 
다음 n개 줄의 i번째 줄(i = 1 ~ n)의 정보는 조사를 시작한지 (i-1)분이 경과한 시점부터 i분 경과할 때 까지 1분에 입구를 통과한 차의 수와 출구를 통과한 차의 수이다. n은 10000보다 작거나 같고, 1분에 통과하는 차량의 수는 100이하이다.
조사 시작하고 j분이 지난 시점 (j = 0~n)에서 터널 안에 있는 차량의 수를 Sj라고 하자. 이때, Sj의 최댓값을 출력한다. 
만약, 터널 안에 있는 차량의 수가 0보다 작은 경우가 한 번 이라도 발생한다면 0을 출력한다.

>>>코드
n = int(input())
m = int(input())
N = [m]
for i in range(n):
    a, b = map(int, input().split())
    m = m+a-b
    N.append(m)
if min(N)<0:
    print(0)
else:
    print(max(N))

10. 백준 5613 계산기 프로그램
덧셈, 뺄셈, 곱셈, 나눗셈을 할 수 있는 계산기 프로그램을 만드시오.
입력의 각 줄에는 숫자와 +, -, *, /, =중 하나가 교대로 주어진다. 첫 번째 줄은 수이다. 
연산자의 우선 순위는 생각하지 않으며, 입력 순서대로 계산을 하고, =가 주어지면, 그때까지의 결과를 출력한다. 
주어지는 수는 108 이하의 양의 정수이다. 
계산 중 결과는 0 또는 음수가 될 수 있지만, -108 ~ 108 범위를 넘지는 않는다. 
또, 나눗셈에서 소수점은 버린다. 따라서, 100/3*3 = 99이다.
피제수가 음수일 때 나눗셈을 하는 경우는 입력으로 주어지지 않는다.
첫째 줄에 계산 결과를 출력한다.

>>>코드
N = int(input())
while True: 
    m = input()
    if m == '=':
        break
    n = int(input())  
    if m == '+':
        N += n
    elif m == '-':
        N -= n
    elif m == '*':
        N = N*n
    elif m == '/':
        N = N//n
print(N)

연산자와 다음 연산할 수를 한세트로 묶어 반복하면 된다

11. 백준 5691 평균 중앙값 문제
세 정수 A, B, C의 평균은 (A+B+C)/3이다. 
세 정수의 중앙값은 수의 크기가 증가하는 순서로 정렬했을 때, 가운데 있는 값이다.
두 정수 A와 B가 주어진다. 
이때, A, B, C의 평균과 중앙값을 같게 만드는 가장 작은 정수 C를 찾는 프로그램을 작성하시오.
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, A와 B가 주어진다. (1 ≤ A ≤ B ≤ 109) 입력의 마지막 줄에는 0이 두 개 주어진다. 
각 테스트 케이스에 대한 정답을 한 줄에 하나씩 출력한다.

>>>코드
while True:
    A, B = map(int, input().split())
    if A == B == 0:
        break
    print(2*A-B)

간단한 방정식이다.
(A+B+C)/3 = (C+B)/2
C = 2*A-B

12. 백준 5724 파인만
리처드 필립스 파인만은 노벨 물리학상을 수상한 미국의 물리학자이다. 
그는 이론물리학을 연구했고, 양자 컴퓨팅 분야를 개척했다. "Surely You’re Joking, Mr. Feynman!", "What Do You Care What Other People Think?"와 같은 그의 책은 많은 사람들의 사랑을 받았고, 한국에도 번역되어 출판되어져 있다. 그는 오랜 기간동안 퍼즐, 자물쇠, 암호를 만들고 푸는 일에 중독되어 있었다. 
어느 날, 남아메리카의 한 농장에서 파인먼의 것으로 추정되는 한 메모가 발견되었다. 퍼즐은 이 메모에는 중간자와 전자기에 대한 내용이 적혀있었고, 가장 마지막 줄에는 다음과 같은 퀴즈가 적혀져 있었다. "N × N 정사각형으로 이루어진 그리드에는 서로 다른 정사각형이 몇 개나 있을까요?" 이 퀴즈의 정답을 구하는 프로그램을 작성하시오.
N = 2인 경우에 정답은 5이다.
입력은 여러 개의 테스트 케이스로 이루어져 있다. 
각 테스트 케이스는 한 줄로 이루어져 있고, 그리드 한 변에 있는 정사각형의 개수 N이 주어진다. (1 ≤ N ≤ 100)
입력의 마지막 줄에는 0이 하나 주어진다.
각 테스트 케이스에 대해서, 한 줄에 하나씩 서로 다른 정사각형의 개수를 출력한다.

>>>코드
while True:
    n = int(input())
    r = 0
    if n == 0:
        break
    for i in range(n):
        r += (n-i)**2
    print(r)

13. 백준 5789 한다 안한다
옛날에는 결정하기 어려운 일이 있을 때는 꽃을 이용해서 결정을 내렸다. 꽃을 하나 떼서 잎을 하나씩 떼면서, 한다와 안한다를 번갈아 가면서 말하다가 마지막 잎을 뗄 때 말한 말로 결정을 했다.
상근이는 이 방법을 응용해서 결정하기 어려운 일을 하나 결정하려고 한다.
먼저, 0과 1로 이루어진 문자열을 랜덤으로 하나 만든다. 그 다음 문자열의 양 끝에서 수를 하나씩 고르고, 두 수를 비교한다. 수가 같으면 "한다"이고, 다르면 "안한다"이다. 그 다음에는 고른 수를 버리고, 모든 수를 고를 때까지 이 작업을 반복한다. 따라서, 마지막으로 고르는 두 숫자로 결정을 내리는 것이다.
0과 1로 이루어진 문자열이 주어졌을 때, 상근이가 내리는 결정을 구하는 프로그램을 작성하시오.
첫째 줄에는 테스트 케이스의 개수 N이 주어진다. (1 ≤ N ≤ 1000) 
각 테스트 케이스는 한 줄로 이루어져 있으며, 0과 1로 이루어진 문자열이 주어진다. 
문자열의 길이는 항상 짝수이고, 1000보다 작다.
각 테스트 케이스에 대해서 상근이가 내린 결정이 한다이면 Do-it을, 안한다이면 Do-it-Not을 출력한다. 

>>>코드
n = int(input())
for i in range(n):
    k = input()
    l = len(k)//2
    if k[l] == k[l-1]:
        print('Do-it')
    else:
        print('Do-it-Not')

가장 중앙의 두수만 비교하면 된다

14. 백준 5893 17배
상근이는 이진수 곱셈에 어려움을 겪는 여자친구를 위한 프로그램을 만들려고 한다.
상근이의 여자친구는 항상 이진수에 17을 곱한다. 
즉, 이진수 N이 입력으로 들어오면 17을 곱한 다음 이진수로 출력하는 프로그램을 작성하시오.
첫째 줄에 이진수 N이 주어진다. N은 최대 1000자리인 이진수이며, 0이 들어오는 경우는 없다.
입력으로 주어진 N을 17배한 다음, 이진수로 출력한다.

>>>코드
N = int(input(), 2)
N = N*17
print(bin(N)[2::])

1) n진수 -> 10진수 변환
int(n진수 숫자, n)

15. 백준 5988 홀수일까 짝수일까
짝이 없는 경재는 매일 홀로 있다보니 홀수를 판별할 수 있는 능력이 생겼다. 
창식이는 경재의 말이 사실인지 그 능력을 시험해보려 한다. 
창식이의 의심이 끝이 없을 것 같아 N개만 확인하기로 정했다.
N개의 정수가 주어지면 홀수인지 짝수인지를 출력하는 프로그램을 만들어 경재의 능력을 검증할 수 있게 도와주자.
첫 번째 줄에 숫자의 개수 N(1 <= N <= 100)이 주어진다.
두 번째 줄부터 N+1번째 줄에 걸쳐 홀수인지 짝수인지 확인할 정수 K (1 <= K <= 10^60)가 주어진다.
N개의 줄에 걸쳐 한 줄씩 정수 K가 홀수라면 'odd'를, 짝수라면 'even'을 출력한다.

>>>코드
n = int(input())
for i in range(n):
    N = int(input())
    if N%2 == 0:
        print('even')
    else:
        print('odd')

16. 백준 6321 IBM 빼기 1
'2001: 스페이스 오디세이'는 아서 C. 클라크의 소설이자 스탠리 큐브릭 감독의 영화이다.
이 작품에서 우주선은 토성으로 가고 있다. 
긴 여행동안 선원들은 모두 정체 상태에 빠져있고, 두 선원은 깨어나 있다. 
우주선은 인공지능 컴퓨터 HAL이 조정하고 있다. HAL은 점점 이상하게 행동하더니 선원들을 죽이기 시작했다. 
자세한 이야기는 소설을 읽거나 영화를 보면 알 수 있다.
영화가 유명해지고 난 이후에 사람들은 '2001: 스페이스 오디세이'에 나오는 인공지능 컴퓨터인 HAL의 뜻에 관심을 가졌다. HAL은 휴리스틱 알고리즘 (Heuristic ALgorithm)의 약자이다. 하지만, HAL의 각 글자를 알파벳 다음 순서로 쓰면 IBM이 되기 때문에, IBM과 연관이 있다고 믿는 사람이 매우 많다.
컴퓨터의 이름이 주어졌을 때, 각 글자를 알파벳 다음 순서로 써서 출력하는 프로그램을 작성하시오.
첫째 줄에 컴퓨터의 개수 n이 주어진다. 다음 줄부터 n개의 줄에는 컴퓨터의 이름이 주어진다. 
컴퓨터의 이름은 최대 50글자이며, 알파벳 대문자로만 이루어져 있다.
입력으로 주어진 컴퓨터 이름에 대해서, 한 줄에 하나씩 각 글자를 알파벳 다음 순서로 써서 출력한다. 
각각의 컴퓨터 이름 사이에는 빈 줄을 하나씩 출력한다.
알파벳 Z의 다음 순서는 A이다.

>>>코드
N = int(input())
s = []
A = {'A':66, 'B':67, 'C':68, 'D':69, 'E':70, 'F':71, 'G':72, 'H':73, 'I':74, 'J':75, 'K':76, 'L':77, 'M':78, 'N':79, 'O':80, 'P':81, 'Q':82, 'R':83, 'S':84, 'T':85, 'U':86, 'V':87, 'W':88, 'X':89, 'Y':90, 'Z':65}
for i in range(N):
    s.append(input())
for i in range(N):
    print('String #%d' %(i+1))
    for j in range(len(s[i])):
        print(chr(A[s[i][j]]), end = '')
    print('\n')

딕셔너리에 저장하고 불러오기, 길다

728x90