기록공간

BinaryGap (Codility) 본문

Algorithm/문제

BinaryGap (Codility)

입코딩 2020. 7. 13. 23:16
반응형

 

문제

입력 된 숫자를 이진수로 변환시키고, 변환된 이진수중 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
Comments