문제설명
재용이는 최신 컴퓨터 10대를 가지고 있다. 어느 날 재용이는 많은 데이터를 처리해야 될 일이 생겨서 각 컴퓨터에 1번부터 10번까지의 번호를 부여하고, 10대의 컴퓨터가 다음과 같은 방법으로 데이터들을 처리하기로 하였다.
1번 데이터는 1번 컴퓨터, 2번 데이터는 2번 컴퓨터, 3번 데이터는 3번 컴퓨터, ... ,
10번 데이터는 10번 컴퓨터, 11번 데이터는 1번 컴퓨터, 12번 데이터는 2번 컴퓨터, ...
총 데이터의 개수는 항상 ab개의 형태로 주어진다. 재용이는 문득 마지막 데이터가 처리될 컴퓨터의 번호가 궁금해졌다. 이를 수행해주는 프로그램을 작성하라.
=> 즉 a**b를 10으로 나눈 나머지를 구하는 문제
입력
1. 테스트케이스의 개수 T
2. a,b
5
1 6
3 7
6 2
7 100
9 635
출력
데이터가 마지막으로 처리되는 컴퓨터의 번호
1
7
6
1
9
풀이
1차 시도
import sys
N = int(sys.stdin.readline().strip())
for _ in range(N) :
a,b = map(int,sys.stdin.readline().strip().split())
print(a**b%10)
- 너무 쉬운 문제인데? 역시 브론즈다~ 하고 신나게 썼지만
- 시간초과
- 정답률 낮은데에는 이유가 있었다...
2차 시도
import sys
N = int(sys.stdin.readline().strip())
def pow(a,b) :
if b <= 1 :
return a
n = pow(a,b//2)
# 짝수
if b % 2 == 0 :
return n * n
# 홀수
else :
return n*n*a
for _ in range(N) :
x,y = map(int,sys.stdin.readline().strip().split())
ans = pow(x,y)
print(ans%10)
- 재귀로 풀기!
- 오랜만이라 생각해내는데 한참 걸렸다
- 하지만 시간초과
???
3차 시도 : 정답
import sys
N = int(sys.stdin.readline().strip())
for _ in range(N) :
x,y = map(int,sys.stdin.readline().strip().split())
x = x%10
if x == 0 :
print(10)
continue
cycle = []
temp = x
while temp not in cycle :
cycle.append(temp)
temp = (temp * x) % 10
idx = (y-1) % len(cycle)
print(cycle[idx])
- 제곱 % 10의 규칙을 활용하여 푸는 문제
x = x%10
if x == 0 :
print(10)
continue
- 가지치기 : 나머지가 0이면 10번째니까 더 계산하지 않고 10을 출력해서 시간을 절약함
cycle = []
temp = x
while temp not in cycle :
cycle.append(temp)
temp = (temp * x) % 10
- cycle 에 나머지로 나오는 규칙적인 값을 저장함
- while문을 통해 사이클을 한 바퀴 돌림
- 이때 x(고정적인 값)가 아닌 temp(변하는 값)로 적어야 함!
idx = (y-1) % len(cycle)
print(cycle[idx])
- cycle에서 원하는 인덱스 찾기
- 인덱스는 0부터 시작하는데 지수는 1부터 시작하므로 y-1 해줌
- ` y%len(cycle) -1`을 하면 안되는 이유 :
- y%len(cycle)의 값이 0이 나왔을 때 음수 인덱스가 나와 오류가 생길 수 있음
- 파이썬은 -1을 하면 뒤에서 1번째를 가져오니까 괜찮긴하지만..! 다른 언어에서는 음수인덱스는 오류를 발생시킴
- ` y%len(cycle) -1`을 하면 안되는 이유 :
'개발새발문제' 카테고리의 다른 글
알고리즘 N-Queen(백준 9663번) 파이썬 (0) | 2025.02.27 |
---|---|
알고리즘 우선순위큐 - 최대 힙(백준 11279번) 파이썬 (0) | 2025.02.23 |
백준 1991 트리순회 실버1 (0) | 2025.02.05 |
백준 9251 LCS 골드5(DP) (0) | 2025.01.11 |
백준 1003 피보나치함수 실버3 (dp) (1) | 2025.01.03 |
댓글