본문 바로가기
알고리즘 문제/Programmerse

[programmers][월간 코드 챌린지 시즌1] 이진 변환 반복하기

by 햄과함께 2020. 11. 7.
320x100

문제 : programmers.co.kr/learn/courses/30/lessons/70129


s에는 '1'이 최소 하나 포함되어 있다고 하는데 그럼 s가 "0"이 될 가능성이 없다는 뜻이다. 이진법으로 변환하면 나올 수 있는 한자리를 가진 문자열은 "0", "1"인데 "0"은 나올 수 없다고 제한사항에 있기 때문에 s 길이가 1인 경우 문자열은 반드시 "1"이 된다.

따라서 반복문 종료조건을 s 길이가 1보다 큰 경우로 잡았다. => 해당 반복문 반복횟수를 cnt라 한다.

 

s 문자열을 탐색하면서 '0'의 개수를 센다. 이를 0의 총 개수를 저장하는 변수(let, zeroCnt) 1에 더해서 갱신해준다.

x의 모든 0을 제거한 뒤 x의 길이를 c 라고 한다면 결국, x(= 문자열 s)의 총 길이에서 0 개수를 뺀 만큼이 c라는 소리가 된다.

c를 이진법으로 바꾼다. 이진법으로 바꾸는 방법은 c가 0이 될때까지 2의 나머지를 배열에 차례대로 저장하고 c는 /2로 갱신한다. c가 0이되서 반복문이 끝났을 때 저장한 배열을 reverse하면 2진법이된다.

하지만 이 문제에서는 이진법이 된 정확한 수가 궁금한게 아니고 결국 2진법으로 변환된 문자열의 0, 1의 개수만을 궁금해한다. 따라서 굳이 reverse를 해서 계산할 필요는 없다.

 

모든 반복문이 끝났을 때 { cnt, zeroCnt } 가 정답이 된다.


소스코드 : github.com/fpdjsns/Algorithm/blob/master/programmers/%EC%9B%94%EA%B0%84%20%EC%BD%94%EB%93%9C%20%EC%B1%8C%EB%A6%B0%EC%A7%80%20%EC%8B%9C%EC%A6%8C1/%EC%9D%B4%EC%A7%84%20%EB%B3%80%ED%99%98%20%EB%B0%98%EB%B3%B5%ED%95%98%EA%B8%B0.cpp

320x100

댓글