
https://www.acmicpc.net/problem/14928
14928번: 큰 수 (BIG)
첫째 줄에 제연이가 가장 좋아하는 수 N이 주어진다. (N ≤ 101,000,000)
www.acmicpc.net
초심부터 시작해보는 알고리즘 공부..!
브론즈 4-5정도는 기초적인 문제가 많아서, 굳이 블로그에 풀이는 안쓸것 같고, 풀다가 '어?' 이랬던 부분을 다시 언급해보고자 한다.
import java.io.*;
public class BJ14928 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//StringTokenizer st = new StringTokenizer(br.readLine());
//시간초과가 나온 코드
/*BigInteger N = new BigInteger(st.nextToken());
BigInteger M = new BigInteger("20000303");
System.out.println(N.remainder(M));*/
//나머지 연산 방법
String N = br.readLine();
long remain = 0;
for(int i =0; i < N.length(); i++){
remain = (remain * 10 + (N.charAt(i) - '0')) % 20000303;
}
bw.write(remain + "\n");
bw.flush();
br.close();
bw.close();
}
}
해당 코드 처음에 입출력으로 잘 풀었는데, 결과값이 계속 시간초과가 나와서 오답처리가 되었다.
으응..? 뭐지 뭐지 하다가 나머지 연산 방법이라는것을 알게됨.
remain 부분에서 10을 곱하는게 처음에 이해되지 않았는데, 저 10의 용도는 자리수를 올려주는것으로 확인되었다.
Java에서 charAt(int i) - '0'에 대해 조금더 살펴보았는데, 앞서 말한것처럼 charAt는 자바의 문자열을 index 값을 통해 읽는 방법이다. 예를들어
String str = "로춘남입니다"; 라고 되어 있으면
str.charAt(0); //로
str.charAt(1); //춘
str.charAt(2); //남
이런식으로 되는 것. 그렇다면 이것을 숫자로 한 번 가져와 본다면?
String str = "12345";
str.charAt(0);은 1이 출력된다. 여기서의 1은 문자로서의 1. 여기서 문자 1을 숫자로 1로 바꾸고싶다면?
이 문자 1은 chat형이기 때문에 int형으로 변환을 해주면 아스키코드값으로 변환이 된다.
그렇기때문에 str.charAt(0); '1'의 값을 int형으로 변환시키면 아스키코드값인 49가 나오게 되는것이다.
하지만 우리가 구하고싶은값은 1. 49가 1이 되기 위해선 -48을 해줘야한다.
그래서 우리가 해주는것이 바로 -'0' . 왜냐하면 '0'의 아스키코드값이 바로 48이기때문이다.
즉,
숫자1 → 49
숫자2 → 50
숫자3 → 51
'0'인 48을 빼주게 되면
각각 1, 2, 3이 되는 것이다!!
우오옹!!!
'Algorithm' 카테고리의 다른 글
[Java] 백준 5575번 타임 카드 (0) | 2021.12.23 |
---|---|
[Java] 백준 5543번 상근날드 (0) | 2021.12.23 |
[Java] 백준 2420번 (0) | 2021.11.04 |
[Java] 백준 1712번 손익분기점 (0) | 2021.11.03 |
[Java] 백준 1297번 TV 크기 (0) | 2021.11.03 |