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