백준/백준 파이썬

백준 파이썬 Today I Learn 2023.03.15

군청레프 2023. 3. 21. 13:17
728x90

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이 나오므로 따로 처리해야된다.

728x90