- @참고: https://blog.naver.com/jihogrammer/222314445259
아래와 같은 형태로 입력되는 입력값을 빠르게 받기는 법
2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5
- 코드
private static int read() throws Exception {
int c, n = System.in.read() & 15;
while ((c = System.in.read()) > 32)
n = (n << 3) + (n << 1) + (c & 15);
if (c == 13) System.in.read();
return n;
}
[출처] [Java] System.in.read() - 3|작성자 jihogrammer
코드 주석
# n = System.in.read() & 15;
15 = 1111(2) 이고
n = System.in.read() 일 때, 한글자의 수를 읽으면 48 <= n <= 57
48 = 32 + 16 = 2^5 + 2^4 이므로 4, 5번째 자리를 제외한 하위비트만 읽어오면 48를 빼는것과 같아진다.
뺄셈을 연산하지 않고도 단순 비트 연산을 통해 읽을 수 있다.
Char ASCII Binary
'0' == 48 == 11_0000
'1' == 49 == 11_0001
'2' == 50 == 11_0010
...
'9' == 57 == 11_1001
n & 15 연산을 수행하여 뒤 4자리 비트만 읽을 수 있다.
# n = (n << 3) + (n << 1) + (c & 15);
위 식은에서 (c & 15) 앞쪽은 n = n * 8 + n * 2
= n * 10 이다.
왜 이렇게 표현했는가 하면,
* 연산은 생각보다 ALU에서 처리하는 양이 많다. (내부적으로 shift 연산과 add 연산을 반복적으로 수행하기 때문에)
최적화 되어있는 방식으로 표현하여 수행속도를 빨리하기 위함이다.
'Algorithm' 카테고리의 다른 글
알고리즘 코딩 테스트 붙는 법 (1) | 2024.01.26 |
---|---|
[자료구조] 레드-블랙 트리(red-black tree) (0) | 2023.01.06 |
[알고리즘] java 비트연산 (0) | 2022.11.20 |
[알고리즘] 정렬 알고리즘의 종류 (0) | 2022.01.21 |
[알고리즘] Comparable, Comparator와 정렬의 관계 (0) | 2022.01.21 |