백준 파이썬 Today I Learn 2023.05.18
5/ 18 파이썬 공부
1. 백준 6322 직각 삼각형의 두 변
컴퓨터를 이용하면 수학 계산이 조금 쉬워진다. 다음과 같은 예를 살펴보자.
세 변의 길이가 a, b, c(c는 빗변)이면서 a**2+b**2=c**2를 만족하는 삼각형을 직각삼각형이라고 한다.
이 공식은 피타고라스의 법칙이라고 한다.
직각 삼각형의 두 변의 길이가 주어졌을 때, 한 변의 길이를 구하는 프로그램을 작성하시오.
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있고, 직각 삼각형의 세 변의 길이 a, b, c가 주어진다.
a, b, c중 하나는 -1이며, -1은 알 수 없는 변의 길이이다. 다른 두 수는 10,000보다 작거나 같은 자연수이다.
입력의 마지막 줄에는 0이 세 개 주어진다.
각 테스트 케이스에 대해서, 입력으로 주어진 길이로 직각 삼각형을 만들 수 있다면, "s = l"을 출력한다.
s는 길이가 주어지지 않은 변의 이름이고, l은 길이이다. l은 소수점 셋째 자리까지 출력한다.
삼각형을 만들 수 없는 경우에는 "Impossible."을 출력한다.
>>>코드
import sys
A, B, C = [], [], []
while True:
a, b, c = map(float, sys.stdin.readline().split())
if a == b == c == 0:
break
A.append(a)
B.append(b)
C.append(c)
for i in range(len(A)):
print('Triangle #%d' %(i+1))
if C[i] == -1:
C[i] = (A[i]**2 + B[i]**2) ** 0.5
print('c = %.3f\n' %(C[i]))
elif C[i]**2 < A[i]**2 + B[i]**2:
print('Impossible.\n')
elif A[i] == -1:
A[i] = (C[i]**2 - B[i]**2) ** 0.5
print('a = %.3f\n' %(A[i]))
elif B[i] == -1:
B[i] = (C[i]**2 - A[i]**2) ** 0.5
print('b = %.3f\n' %(B[i]))
삼각형이 성립되지 않는 경우를 잘 생각해보자
일단 c는 a,b에 어떠한 수가 오든지 상관없이 삼각형이 성립된다
그러나 a,b는 계산했을때 a+b가 c보다 작거나 같으면 삼각형이 성립되지 않는다.
이를 변형하면 c의 제곱보다 a 또는 b의 제곱 +1이 작으면 나머지 한 변이 성립되지 않는다는 것
근데 이미 나머지 한변을 -1로 입력 받아 놓았네..? 돌아가거나 계산할 필요가 없어졌다
2. 백준 6378 디지털 루트
양의 정수 N의 디지털 루트를 구하려면 N을 이루고 있는 모든 자리수를 더해야 한다.
이때, 더한 값이 한 자리 숫자라면, 그 수가 N의 디지털 루트가 된다.
두 자리 이상 숫자인 경우에는 다시 그 수를 이루고 있는 모든 자리수를 더해야 하며,
한 자리 숫자가 될 때 까지 반복한다.
24의 디지털 루트를 구해보자. 2+4=6이다. 6은 한 자리 숫자이기 때문에, 24의 디지털 루트는 6이 된다.
39의 경우에는 3+9=12이기 때문에, 한 번 더 더해야 한다. 따라서, 1+2=3이 디지털 루트가 된다.
양의 정수 N이 주어졌을 때, 그 수의 디지털 루트를 구하는 프로그램을 작성하시오.
한 줄에 하나씩 양의 정수가 주어진다. 입력의 마지막 줄은 0으로 나타낸다. 수는 최대 1000자리이다.
입력으로 주어진 양의 정수의 디지털 루트를 한 줄에 하나씩 주어진 순서대로 출력한다.
>>>코드
while True:
N = input()
if N == '0':
break
while len(N) != 1:
n = 0
for i in range(len(N)):
n += int(N[i])
N = str(n)
print(int(N))
3. 백준 7510 고급 수학
준규는 집을 짓고 있다. 준규는 모든 벽 모양을 직각 삼각형으로 만들려고 한다.
적절히 나무를 잘라 삼각형을 만들었지만, 준규는 각도를 측정할 수 있는 도구를 가지고 있지 않다.
어쩔 수 없이 줄자를 이용해 삼각형 세 변의 길이를 측정한 다음, 직각 삼각형인지 아닌지를 알아보려고 한다.
삼각형 세 변의 길이가 주어졌을 때, 직각 삼각형인지 아닌지를 구하는 프로그램을 작성하시오.
입력의 첫째 줄에는 테스트 케이스의 개수 n이 주어진다.
각 테스트 케이스는 세 정수 1 ≤ a, b, c ≤ 40000 으로 이루어져 있다.
세 정수는 삼각형 각 변의 길이를 나타낸다.
각 테스트 케이스마다 "Scenario #i:"를 출력한다. i는 테스트 케이스 번호이며, 1부터 시작한다.
그 다음 줄에는 입력으로 주어진 삼각형이 직각 삼각형인 경우에는 "yes", 아닌 경우에는 "no"를 출력한다.
각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.
>>>코드
n = int(input())
for i in range(n):
edge = list(map(int, input().split()))
edge.sort()
print('Scenario #%d:' %(i+1))
if edge[0]**2 + edge[1]**2 == edge[2]**2:
print('yes\n')
else:
print('no\n')
4. 백준 8932 7종 경기
민혁이는 한국에서 열리는 7종 경기 대회에 참가한다.
7종 경기는 육상의 필드 경기와 트랙 경기 7 종목으로 이루어져 있다.
(100미터 허들, 높이뛰기, 포환던지기, 200미터 달리기, 멀리뛰기, 창던지기, 800미터 달리기)
민혁이의 각 종목의 기록이 주어졌을 때, 기록을 점수로 환산해서 총점을 구하는 프로그램을 작성하시오.
7종 경기의 총점은 각 종목의 점수의 합이다. 각 종목의 점수는 다음과 같은 식을 이용해서 구할 수 있다.
트랙 경기: Score= A * (B-P)^{C}
필드 경기: Score= A * (P-B)^{C}
A, B, C는 아래 표에 적혀져 있는 상수이다. P는 선수의 성적으로 단위는 아래에 나와있다.
모든 종목의 점수는 정수이다.
종목 A B C P 종류
100미터 허들 9.23076 26.7 1.835 sec 트랙
높이뛰기 1.84523 75 1.348 cm 필드
포환던지기 56.0211 1.5 1.05 m 필드
200미터 달리기 4.99087 42.5 1.81 sec 트랙
멀리뛰기 0.188807 210 1.41 cm 필드
창던지기 15.9803 3.8 1.04 m 필드
800미터 달리기 0.11193 254 1.88 sec 트랙
모든 필드 경기는 B ≤ P, 트랙 경기는 P ≤ B를 만족한다.
첫째 줄에 테스트 케이스의 개수 T가 주어진다. (1 ≤ T ≤ 1000)
각 테스트 케이스는 일곱 개의 정수로 이루어져 있다. 이 정수는 민혁이의 종목별 기록이다.
순서는 100미터 허들, 높이뛰기, 포환던지기, 200미터 달리기, 멀리뛰기, 창던지기, 800미터 달리기이다.
각 테스트 케이스에 대해서, 민혁이의 총점을 출력한다.
>>>코드
def track(A, B, C, P):
Score= A*(B-P)**C
return int(Score)
def field(A, B, C, P):
Score= A*(P-B)**C
return int(Score)
n = int(input())
for i in range(n):
a, b, c, d, e, f, g = map(float, input().split())
score = track(9.23076, 26.7, 1.835, a) + field(1.84523, 75, 1.348, b) + \
field(56.0211, 1.5, 1.05, c) + track(4.99087, 42.5, 1.81, d) + \
field(0.188807, 210, 1.41, e) + field(15.9803, 3.8, 1.04, f) + \
track(0.11193, 254, 1.88, g)
print(score)
처음에는 하나씩 다 입력하려 했으나
뭔가 이상하다는걸 느낌
함수를 연습하는 문제였다.
1) 함수 지정
def 함수이름(변수):
r = 함수 내용
return (반환할 함수값(r))
5. 백준 9063 대지
임씨는 1950 년 한국전쟁으로 많은 손해를 본 사람들 중 하나다. 전쟁 통에 손해보지 않은 사람이 어디 있을까 만은 그는 6.25 가 일어나기 전만 해도 충청도 지방에 넓은 대지를 소유한 큰 부자였다. 전쟁이 나자 임씨는 땅문서와 값 나가는 것들만 챙겨서 일본으로 피난을 가지만 피난 중에 그만 땅문서를 잃어버리고 만다. 전쟁이 끝난 후에 임씨의 땅은 이미 다른 사람들의 논밭이 되어 있었고, 임씨는 땅을 되찾으려 했지만 문서가 없으니 생떼 쓰는 것과 다를 바 없었다. 이러다가 임씨는 길바닥에 나앉게 생겼다.
이때, 임씨에게 좋은 생각이 떠올랐으니 바로 자신이 습관처럼 땅 깊숙이 뭔가 표식을 해놓았던 사실이다. 임씨는 한적할 때마다 자신의 논밭을 거닐다가 땅속 깊은 곳에 자신의 이름이 씌어진 옥구슬을 묻어놓았던 것이다. 즉, 어떤 지점에서 그의 이름이 적힌 옥구슬이 나온다면 그 지점은 예전에 임씨의 땅이었다는 것을 증명하는 것이다.
임씨는 즉시 민사소송을 통해 자신의 땅을 찾고자 했고 논리적인 근거를 들어 옥구슬이 나오는 지점이 원래 자신의 땅의 한 지점이었다는 것을 주장하여 결국 담당판사를 설득하는 데에 성공하였다. 담당판사는 다음과 같은 판결을 내렸다. “ 6.25 이전의 개인소유 대지들은 99%가 남북, 동서 방향으로 평행한 직사각형 모양이었으므로, 임씨의 이름이 새겨진 옥구슬이 나오는 모든 지점을 포함하는 가장 작은 남북, 동서 방향으로 평행한 변을 갖는 직사각형의 대지를 임씨의 소유로 인정한다.” 임씨는 많은 손해를 보는 셈이지만 더 이상을 요구할 만한 근거가 없었기 때문에 이 판결을 따르기로 했다.
임씨의 이름이 새겨진 옥구슬의 위치 N 개가 주어질 때에, 임씨에게 돌아갈 대지의 넓이를 계산하는 프로그램을 작성하시오. 단, 옥구슬의 위치는 2 차원 정수 좌표로 주어지고 옥구슬은 같은 위치에 여러 개가 발견될 수도 있으며, x 축의 양의방향을 동쪽, y 축의 양의방향을 북쪽이라고 가정한다.
첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다.
첫째 줄에 N 개의 점을 둘러싸는 최소 크기의 직사각형의 넓이를 출력하시오.
>>>코드
n = int(input())
X, Y = [], []
for i in range(n):
x, y = map(int, input().split())
X.append(x)
Y.append(y)
print((max(X)-min(X))*(max(Y)-min(Y)))
6. 백준 9085 더하기
10보다 작거나 같은 자연수 N개를 주면 합을 구하는 프로그램을 작성하시오.
입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다.
각 테스트 케이스는 첫 줄에 자연수의 개수 N(1 ≤ N ≤ 100)이 주어지고, 그 다음 줄에는 N개의 자연수가 주어진다.
각각의 자연수 사이에는 하나씩의 공백이 있다.
각 테스트 케이스에 대해서 주어진 자연수의 합을 한 줄에 하나씩 출력한다.
>>>코드
n = int(input())
for i in range(n):
m = int(input())
M = list(map(int, input().split()))
print(sum(M))
7. 백준 9094 수학적 호기심
두 정수 n과 m이 주어졌을 때, 0 < a < b < n인 정수 쌍 (a, b) 중에서
(a**2+b**2+m)/(ab)가 정수인 쌍의 개수를 구하는 프로그램을 작성하시오.
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, n과 m이 주어진다.
두 수는 0보다 크고, 100보다 작거나 같다.
각 테스트 케이스마다 문제의 조건을 만족하는 (a, b)쌍의 개수를 출력한다.
>>> 코드
import sys
N = int(input())
for i in range(N):
n, m = map(int, sys.stdin.readline().split())
r = 0
for j in range(n-1):
for k in range(j+1, n-1):
if ((j+1)**2 + (k+1)**2 + m)%((j+1) * (k+1)) ==0:
r += 1
print(r)
input()을 쓰면 시간 초과 나오므로 주의하자
7. 백준 9295 주사위
오늘은 갑자기 주사위를 던지고 싶다.
그런데 코딩도 하고 싶다.
그럼 같이할까?
첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 주사위를 두 번 던져 나온 두 수를 입력한다.
각 테스트 케이스마다 "Case x: "를 출력한 다음, 주사위를 두 번 던져 나온 두 수의 합을 출력한다.
테스트 케이스 번호(x)는 1부터 시작한다.
>>>코드
n = int(input())
for i in range(n):
a, b = map(int, input().split())
print('Case %d: %d' %(i+1, a+b))
8. 백준 9325 얼마?
해빈이는 학교를 다니면서 틈틈히 번 돈으로 자동차를 사려고 한다. 자동차에 여러 가지 옵션을 포함시킬 수 있는데 해빈이는 덧셈과 곱셈을 하지 못하기 때문에 친구 태완이에게 도움을 청했다. 하지만 태완이도 덧셈과 곱셈을 못한다. 불쌍한 이 두 친구를 위해 모든 옵션이 주어진 자동차를 구매하는데 필요한 액수를 계산해 주자.
첫째 줄에 테스트 케이스의 개수가 주어진다.
각 테스트 케이스의 첫 줄엔 자동차의 가격 s가 주어진다. (1 ≤ s ≤ 100 000)
둘째 줄엔 해빈이가 구매하려고 하는 서로 다른 옵션의 개수 n이 주어진다. (0 ≤ n ≤ 1 000)
뒤이어 n개의 줄이 입력으로 들어온다.
각 줄은 q 와 p로 이루어져 있는데 q는 해빈이가 사려고 하는 특정 옵션의 개수이고 p는 해당 옵션의 가격이다.
(1 ≤ q ≤ 100, 1 ≤ p ≤ 10 000)
각 테스트 케이스 마다, 해빈이가 최종적으로 구매하려는 자동차의 가격을 한줄씩 출력한다.
>>>코드
N = int(input())
for i in range(N):
s = int(input())
n = int(input())
for j in range(n):
q, p = map(int, input().split())
s += (q*p)
print(s)
9. 백준 9366 삼각형 분류
꿍은 오늘 학교에서 삼각형에 대해 배웠다. 삼각형은 변의 길이에 따라 다음과 같이 분류될 수 있다.
- 정삼각형(equilateral triangle)은 모든 변의 길이가 같다. 각 역시 60도로 모두 같다.
- 이등변삼각형(isosceles triangle)은 두 개의 변의 길이가 같다. 각 역시 두 개의 각의 크기가 같다.
- 부등변삼각형(scalene triangle)은 모든 변의 길이가 같지 않다. 각 역시 모두 다르다. 몇몇 부등변삼각형의 경우 직각삼각형이다.
수학선생님이 삼각형의 세 변의 길이를 가지고 삼각형을 분류하라는 숙제를 내줬는데 꿍은 정말 놀고싶다. 꿍이 놀수있도록 여러분이 도와주어라.
입력의 첫 줄에는 테스트케이스의 개수 T(1 <= T <= 100)가 주어진다.
다음 T줄에는 각 줄에 삼각형의 세 변을 나타내는 3개의 정수 A,B,C(1 <= A,B,C <= 1,000,000)가 주어진다.
각 테스트 케이스에 대해 삼각형이 “equilateral”, “isosceles”, “scalene” 타입 중 어느 타입에 속하는지 출력한다. 만약 주어진 세 변의 길이로 삼각형이 만들어지지 않을경우, “invalid!”를 출력한다.
>>>코드
n = int(input())
for i in range(n):
edge = list(map(int, input().split()))
if sum(edge)-2*max(edge)<= 0:
print('Case #%d: invalid!' %(i+1))
elif edge[0] == edge[1] == edge[2] :
print('Case #%d: equilateral' %(i+1))
elif edge[0] == edge[1] or edge[1] == edge[2] or edge[2] == edge[0]:
print('Case #%d: isosceles' %(i+1))
else:
print('Case #%d: scalene' %(i+1))
10. 백준 9469 폰 노이만
250마일 길이의 철로 양 끝에 두 기차 A와 B가 있다. A는 시속 10마일, B는 시속 15마일로 서로를 향해 출발했다. 두 기차의 출발과 동시에 기차 A 앞에 붙어있던 파리 한 마리가 기차가 충돌할 때 까지 시속 20마일로 두 기차를 사이를 왔다갔다 한다. 이때, 파리가 이동한 거리는 몇 마일일까?
폰 노이만은 문제를 듣자마자 머리속으로 무한 급수를 이용해 계산한 다음 1초도 지나지 않은 시간에 200 마일이라고 대답했다.
철로의 길이 D, 두 기차 A, B의 속도와 파리의 속도 F가 주어졌을 때, 위 문제의 답을 구하는 프로그램을 작성하시오.
첫째 줄에 테스트 케이스의 개수 P (1 ≤ P ≤ 1000)가 주어진다.
각 테스트 케이스는 다섯 숫자 N, D, A, B, F이루어져 있다. N은 테스트 케이스의 번호이고, D는 철로의 길이 (10 ≤ D ≤ 1000), A와 B는 두 기차의 속도 (1 ≤ A, B ≤ 40), F는 파리의 속도 (A ≤ B < F ≤ 50)이다. D, A, B, F는 실수이다. 실수는 최대 소수점 둘째자리까지 주어진다.
각 테스트 케이스마다 테스트 케이스 번호를 출력하고, 두 기차가 충돌할 때까지 파리가 움직인 거리를 출력한다. 절대 오차는 10**(-2)까지 허용한다.
>>>코드
N = int(input())
for i in range(N):
n, d, a, b, f = map(float, input().split())
r = f*d/(a+b)
print('%.0f %f' %(n, r))
11. 백준 9501 꿍의 우주여행
꿍은 우주여행을 하고 싶어져서 우주여행을 계획하기 시작했다. 몇 가지를 고려해본 결과 우주여행에는 우주선의 연료와 목적지까지의 도착시간이 가장 큰 영향을 미치는것으로 파악됐다. 꿍은 엄청난 부자여서 우주선이 여러대가 있는데 각각의 우주선마다 최고속도와 연료소비율이 조금씩 다르다. 연료 소비율은 단위시간당 소비하는 연료의 양이다.
모든 우주선이 최고속도에 즉시 도달한다고 할 때 꿍이 가고싶어하는 곳까지 여행할 수 있는 우주선은 총 몇대인지 여러분이 대신 구해줘라.
입력은 테스트케이스의 개수 T (1 ≤ T ≤ 50)로 시작한다.
각 테스트케이스는 공백으로 구분되는, 우주선의 개수 N (1 ≤ N ≤ 100)과 목적지 까지의 거리 D (1 ≤ D ≤ 106), 두 개의 정수로 시작한다. 다음 N줄에는 각각 공백으로 구분되는, 우주선의 최고속도 vi (1 ≤ vi ≤ 1000)와 우주선의 연료양 fi (1 ≤ fi ≤ 1000)와 우주선의 연료소비율 ci (1 ≤ ci ≤ 1000), 세개의 정수가 주어진다.
각 테스트케이스에 대해 목적지까지 갈 수 있는 우주선의 개수를 구하여라.
이때, 정수의 나눗셈에 조심하라!
>>>코드
T = int(input())
for i in range(T):
n, d = map(float, input().split())
r = 0
for j in range(int(n)):
v, f, c = map(float, input().split())
if v*(f/c) >= d:
r += 1
print(r)