문제
재용이는 최신 컴퓨터 10대를 가지고 있다. 어느 날 재용이는 많은 데이터를 처리해야 될 일이 생겨서 각 컴퓨터에 1번부터 10번까지의 번호를 부여하고, 10대의 컴퓨터가 다음과 같은 방법으로 데이터들을 처리하기로 하였다.
1번 데이터는 1번 컴퓨터, 2번 데이터는 2번 컴퓨터, 3번 데이터는 3번 컴퓨터, ... ,
10번 데이터는 10번 컴퓨터, 11번 데이터는 1번 컴퓨터, 12번 데이터는 2번 컴퓨터, ...
총 데이터의 개수는 항상 a^b개의 형태로 주어진다. 재용이는 문득 마지막 데이터가 처리될 컴퓨터의 번호가 궁금해졌다. 이를 수행해주는 프로그램을 작성하라.
학습
처음에 문제를 우습게 보고 이런식으로 라이브러리를 이용하여 코드를 작성하면 해결할 수 있을것이라 생각했다. 그러나 7,100 9,635 는 꽤 큰 숫자였고 어김없이 OverflowError math range error 에러가 발생했다.
다시 머리를 굴리기 시작했다.
이 사진을 보고 각각 케이스를 나누어 다시 코딩해보았다. 나는 반복되는 수의 개수를 기준으로 잡고 156/2378/49/10 로 나누었다.
import math
num=int(input())
for i in range(num):
a,b=map(int,input().split())
if a==1 or a==5 or a==6:
print(a)
elif a==2 or a==3 or a==7 or a==8:
print((a**(b%4))%10)
elif a==4 or a==9:
print((a**(b%2))%10)
else:
print('10')
음.. 브론즈 3 문제인데.. 꽤나 자존심이 상했다. 분명 예시를 넣어봤을 땐 틀린 부분이 없다고 생각했는데 반례가 뭐지? 싶어 커뮤니티에 질문들들을 살펴보았다. 결론은 내가 문제에서 조건을 놓친 거였다. a가 최대 10까지만 입력가능한 줄 알았는데 100보다 작은수가 입력가능하다고 적혀있었다. 내 코드에서는 10까지만 다루었으니 틀렸습니다 가 나오는게 당연하다.
피드백을 반영하여 다시 코드를 수정해보았다. 다음과 같다.
num=int(input())
for i in range(num):
a,b=map(int,input().split())
a=a%10
if a==1 or a==5 or a==6:
print(a)
elif a==2 or a==3 or a==7 or a==8:
print((a**(b%4))%10)
elif a==4 or a==9:
print((a**(b%2))%10)
else:
print('10')
여전히 틀렸다고 나와 커뮤니티에 반례를 부탁드렸더니 2 4 라는 답이 달렸다.
나머지 %4와 %2 를 구하는 과정에서 4와 2가 포함된 값은 0으로 처리되어 실제 답은 6임에도 불구하고 1이 출력되는 것이었다. 따라서 다시 수정하였고 그 코드는 다음과 같다.
코드
num=int(input())
for i in range(num):
a,b=map(int,input().split())
a=a%10
if a==1 or a==5 or a==6:
print(a)
elif a==2 or a==3 or a==7 or a==8:
if b%4==0:
print(a**4%10)
else:
print((a**(b%4))%10)
elif a==4 or a==9:
if b%2==0:
print(a**2%10)
else:
print((a**(b%2))%10)
else:
print('10')
https://www.acmicpc.net/problem/1009
'프로그래밍 > python' 카테고리의 다른 글
[python] 백준 10953 A+B-6 (0) | 2022.01.12 |
---|---|
[python] 백준 5543 상근날드 (0) | 2022.01.12 |
[python] 백준 15552 빠른 A+B sys.stdin.readline() (0) | 2021.12.26 |
[python] 백준 1330 두 수 비교하기 (0) | 2021.12.26 |
[python] 백준 2941 크로아티아 알파벳 (0) | 2021.12.26 |