일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘
- I/O장치
- 렌더링 파이프라인
- directx
- 백준
- 파일시스템 구현
- 컨디션 변수
- 프로그래머스
- OS
- 그리디알고리즘
- 병행성
- 운영체제
- 멀티쓰레드
- 그리디 알고리즘
- Direct12
- 타입 객체
- 병행성 관련 오류
- 스케줄링
- 영속성
- DirectX 12
- 다이나믹 프로그래밍
- 자료구조
- 디자인패턴
- 동적계획법
- 쓰레드
- codility
- DirectX12
- 멀티프로세서
- 다이나믹프로그래밍
- 락
Archives
- Today
- Total
기록공간
BinaryGap (Codility) 본문
반응형

문제
입력 된 숫자를 이진수로 변환시키고, 변환된 이진수중 1과 1 사이에 있는 0이 가장 많은 경우 0의 갯수를 출력하는 문제이다. (다만 1과 1사이에 있지 않은 0은 포함되지 않는다.)
예를들면, 1041 숫자는 이진수로 변환하면 10000010001이다. 1과 1 사이에 있는 0은 앞에 5개, 뒤에 3개가 있다. 그러므로 가장 많은 경우의 5개를 출력하면 된다.
해결 방법
우선 이진수로 변환하는 방법은 이전에 사용하였던 것이다.
비밀지도 (프로그래머스)
이진수로 변환하는 방법만 안다면 어렵지 않게 풀 수 있는 문제이다. 이진수 변환에는 쉬프트 연산을 사용하였다. 예를 들어 9를 이진수로 변환한다고 하자. 9의 이진수는 1001이다. (전체 이진수
lipcoder.tistory.com
코드는 다음과 같다.
#include <iostream>
#include <vector>
using namespace std;
string toBinary(int N)
{
string result = "";
// int 최대 범위의 이진수 갯수
int count = 32, tmp = 1;
// int 최대 범위부터 내려가며 최초로 1이 나오는 경우
// 이진수에서 가장 큰 자리수이다.
while (true)
{
if(count <= 0 || (N >> count) & 1) break;
--count;
}
// 가장 큰 자리수 부터
// 1, 0을 구분해 string을 더해나간다.
for (int i = count; i >= 0; --i)
((N >> i) & 1) ? (result += '1') : (result += '0');
return result;
}
int solution(int N)
{
string bin = toBinary(N);
int result = 0, tmp = 0;
for (const auto iter : bin)
{
// 1이 나온 경우 지금까지
// 나왔던 0의 갯수를 최대 개수와 비교하여
// 크다면 갱신한다.
if (iter == '1')
{
if (result < tmp) result = tmp;
tmp = 0;
} else
{
++tmp;
}
}
return result;
}

반응형
'Algorithm > 문제' 카테고리의 다른 글
PermCheck (Codility) (0) | 2020.07.17 |
---|---|
MissingInteger (Codility) (0) | 2020.07.13 |
폰켓몬 (프로그래머스) (0) | 2020.07.03 |
등굣길 (프로그래머스) (0) | 2020.07.01 |
타겟넘버 (프로그래머스) (0) | 2020.07.01 |