백준 파이썬 Today I Learn 2023.03.15
3/15 파이썬 공부
1. 백준 10818 최소, 최대값 출력
n = int(input())
a = list(map(int, input().split(" ",n-1)))
print(min(a), max(a))
1) min, max 함수
min(자료형): 자료형(list, tuple, 문자열) 중에 가장 작은 인자 반환
min(자료형1, 자료형2, ...): 여러 자료형 중 전체 자료형의 값이 가장 작은 자료형 반환
max(자료형): 자료형(list, tuple, 문자열) 중에 가장 큰 인자 반환
max(자료형1, 자료형2, ...): 여러 자료형 중 전체 자료형의 값이 가장 큰 자료형 반환
2. 백준 2562 최대값과 위치 출력
a = []
for i in range(9):
k = int(input())
a.append(k)
j = max(a)
print(j)
print(a.index(j)+1)
1) max(리스트) 이용
2) append() 이용
a_list.append(b): a_list에 b라는 수를 마지막 인수로 추가
3)index() 이용
a_list.index(b): a_list에서 b라는 인수의 위치 반환
3. 1009 분산처리
시도 1.
t = int(input())
for i in range (t):
a,b = map(int, input().split())
c = (a**b)%10
if c == 0:
print(10)
else:
print(c)
==> 결과: 시간 초과
1) a**b : a를 b번 거듭제곱
2) 시간 초과의 원인
- 연산이 불필요하게 많다. ⬅ 알고리즘, 동적 계획법
- 입출력시 걸리는 시간. (input()보다는 readline()이 더 빠르다.)
- Python에서 x in [1, 2, 3]과 같이, list에서 사용하는 in 연산의 시간 복잡도는 O(N)1 입니다.
백준site 📌각 주요 함수들의 시간 복잡도
- 비트 연산자는 연산 속도를 향상시킬 수 있다.
- 강제 캐스팅은 너무 많으면 성능을 떨어뜨린다.
시도2.
import sys
t = int(sys.stdin.readline())
for i in range (t):
a,b = map(int, sys.stdin.readline().split())
c = (a**b)%10
if c == 0:
print(10)
else:
print(c)
==> 결과: 시간 초과
1) import sys
a = sys.stdin.readline() 사용
a = input()함수를 대체하여 시간 단축 가능
시도3.
import sys
t = int(sys.stdin.readline())
for i in range (t):
a,b = map(int, sys.stdin.readline().split())
a = a%10
if a == 0:
print(10)
elif a == 1 or a == 5 or a == 6:
print(a)
elif a == 4 or a == 9:
b= b%2
if b == 1:
print(a)
else:
print((a*a)%10)
else:
b = b%4
if b == 0:
print((a**4)%10)
else:
print((a**b)%10)
1) 승수 계산
코드가 길다고 시간이 오래걸리는 것이 아니다.
0의 거듭제곱의 일의 자릿수: 0
1의 거듭제곱의 일의 자릿수: 1
2의 거듭제곱의 일의 자릿수: 2, 4, 8, 6 반복
3의 거듭제곱의 일의 자릿수: 3, 9, 7, 1 반복
4의 거듭제곱의 일의 자릿수: 4, 6 반복
5의 거듭제곱의 일의 자릿수: 5
6의 거듭제곱의 일의 자릿수: 6
7의 거듭제곱의 일의 자릿수: 7, 9, 3, 1 반복
8의 거듭제곱의 일의 자릿수: 8, 4, 2, 6 반복
9의 거듭제곱의 일의 자릿수: 9, 1 반복
=> 케이스 분리
0 : 10번
1,5,6: 입력수 그대로
4,6: 2개마다 반복
2,3,7,8: 4개마다 반복
중요!!: 정해진 수를 0번 거듭제곱하면 반복되는 수가 아닌 무조건 1이 나오므로 따로 처리해야된다.