일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- generateChangeLog
- streamlit
- java
- 백준3078
- 백준20126
- LangChain
- 백준 타일코드
- 백준13417
- 백준
- 외판원순회
- liquibse
- 두 스티커
- Frog River One
- 백준1461
- 백준3078 풀이
- export changeLog
- 백준 시간초과
- ChatOpenAI
- 백준1802
- 두 개의 배열
- streaming chat
- 백준16937
- 백준2098
- 백준 도서관
- 백준11332
- 백준1720
- 백준17124
- 교수님의 기말고사풀이
- BaseCallbackHandler
- Codility
- Today
- Total
tempcru 삽질기록
Codility - Binary Gap 풀이 (java8) 본문
Codility - Binary Gap 풀이
문제
1) Integer N이 입력된다.
2) 입력받은 Integer 를 binary representation 으로 표현했을때 (529 => 1000010001 )
3) '1' 과 '1' 사이에 있는 '0' 의 최대 길이를 구하라
4) '10000' 의 경우 length는 0 이다 (반드시 '1' 과 '1' 사이의 Gap 만 유효하다)
주의점
1) Input 값의 범위는 1~ 21억 정도의 값이 입력된다.
-> 0인 경우는 없다고 치면 되겠다
-> Integer 범위의 최대크기의 양수가 입력되는 구나
-> 음수는 입력되지 않는다.
2) '1' 과 '1' 사이의 '0' 길이 재기
-> 임의 N을 32bit 로 표현하면 00000000000001000000010000000000 이런식이다.
-> 좌우 양끝 '0'은 의미없는 숫자이므로 계산에서 예외해야한다
풀이
1) binary representation 하는 방법
-> toBinaryString 같은 util을 사용해서 char 배열로 바꾼다
다르게 해보려고한다
이유는 char 배열로 바꾸면 16 bit *31 만큼의 공간을 써야하기 때문이다
그리고 util 내부에서 더 다양한 연산을 할 것이기에 속도측면에서도 불리할 것이다.
-> 0011 & 0001 = 0001
0010 & 0001 = 0000 이기 때문에
-> if((i & N) == i) 이 True 이면 해당 자리수는 1이다.
-> 0001 이라고 하는 비교인자는 0001 << 1 하게되면 0010 이된다.
(문제풀때는 반대로했음 1000에서 내려가는 형태로)
따라서 for문돌면서 >> 해주면 모든 bit를 자리수를 옮겨가며 확인가능하다.
2) '0' 길이 재기
-> 10000 의 gap 은 0이다
오른쪽부터 '0', '1' 체크를 할 경우 10000 의 0의 갯수가 4개가 된다.
왼쪽부터 '0', '1' 체크 하고 결과 반영은 '1'을 만났을때 처리한다.
코드
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
public int solution(int N) {
int result = 0;
int checker = 1<<30; // 01000000000000000000000000000000
int count = 0;
while(checker > N) { // N에 근접할때까지 shift
checker = checker >> 1;
}
for(int i = checker; i > 0; i=i>>1){
if((i & N) == i){ // 1이면
if(result < count){
result = count; // 값반영
}
count = 0; //초기화
} else { // 0 이다
count++; // 카운팅 늘리기
}
}
return result;
}
}
'Coding Test > Codility' 카테고리의 다른 글
[Codility] Lesson 4 - Frog River One 풀이 (java) (0) | 2022.01.06 |
---|---|
Codility - Cyclic Rotation 풀이 (java8) (0) | 2022.01.05 |
Codility - Odd Occurrences In Array 풀이 (Java8) (0) | 2022.01.05 |
Codility - Frog Jmp 풀이 (java) (0) | 2022.01.05 |
Codility - Perm Missing Elem 풀이 (java) (0) | 2022.01.05 |