SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
N의 범위가 너무 커서 어떻게 풀어야 하는 건지 감이 안왔다.
이 정도로 큰 수면 계산이 아니라 어떤 규칙을 찾는 것일 텐데 그 규칙을 찾을 수가 없어서 고민하다가 다른 사람의 풀이를 찾아보았음.
페르마의 소정리라는데... 지수가 소수가 아닌데 페르마의 소정리가 왜 적용되는지는 납득이 안갔다.
일단 규칙은 제공된 테스트케이스를 예시로 들면
1 ) 9진법 234를 8로 나누었을 때 나머지가 1 == 2 + 3 + 4를 8로 나누었을 때 나머지가 1
2 ) 5진법 123을 4로 나누었을 때 나머지가 2 == 1 + 2 + 3을 4로 나누었을 때 나머지가 2
3 ) 3진법 102를 2로 나누었을 때 나머지가 1 == 1 + 0 + 2를 2로 나누었을 때 나머지가 1
이렇게 볼 수 있다.
이 규칙을 뒷받침하는 개념이 페르마의 소정리라는데 납득이 안가서 다른 풀이로 풀어보겠다.
N진법으로 표현된 수를 (N - 1)로 나누면 각 자릿수마다 자릿수의 값만큼 나머지가 생긴다.
예를 들어 N 을 (N - 1)로 나누면 1이 남기 때문에 N^1000을 (N - 1)로 나눈 나머지도 1^1000 즉 1이고, 이렇게 아무리 지수가 커도 나머지는 1로 동일해서 자릿수의 값만큼이 나머지로 되기 때문임.
('/'가 아니라 '%'를 사용하는 것이기 때문에 가능)
9진법의 234은 2 * 9^2 + 3 * 9 + 4이고 이를 8로 나눈 나머지는 각 자릿수의 나머지 값들의 합 2 * 1 + 3 * 1 + 4를 8로 나눈 나머지의 값이 답이다.
내 코드
메모리 : 138244 KB
코드 : 503 ms
코드길이 : 775 B
[내 코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for(int t = 1; t <= T; t++) {
sb.append('#').append(t).append(' ');
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
String X = st.nextToken();
long number = 0;
for(int i = 0; i < X.length(); i++) {
number += (X.charAt(i) - '0');
}
sb.append(number % (N - 1)).append('\n');
}
System.out.print(sb);
}
}
'SSAFY > SWEA' 카테고리의 다른 글
[SWEA] 14178 : 1차원 정원 (0) | 2023.05.13 |
---|---|
[SWEA] 9280 : 진용이네 주차타워 (1) | 2023.05.13 |
[SWEA] 5431 : 민석이의 과제 체크하기 (0) | 2023.05.12 |
[SWEA] 11285 : 다트게임 (0) | 2023.05.12 |
[SWEA] 3131 : 100만 이하의 모든 소수 (0) | 2023.05.12 |