728x90

프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 내용, 조건, 예시는 프로그래머스 사이트 참조
2진수의 1의 개수가 동일한 큰 수를 찾아야 합니다.
(※ 가독성을 위해 2진수 0b는 생략)
1의 수가 바뀌지 않고 다음 큰 숫자를 구하는 방법은 아래와 같다.
- 1(01) + 1(01) = 2(10)
1(01) 위치에 1(01)을 더하면 1의 숫자 개수도 같고 다음 큰 수의 만족을 하는 2(10)의 값을 구할 수 있습니다.
ex) 9(1001)은 1번째 자리에서 일치
- 9(1001) + 1(01) = 10(1010)
ex) (10010)은 2번째 자리에서 일치
- 12(10010) + 2(010) = 14(10100)
1(01)로 시작하는 위치를 찾아서 1(01)을 더한다는 개념으로 출발해보자
알고리즘
1) (현재값 & 01) == 01과 일치하는가?
1-1)일치한다면 현재값 + 01을 해준 후 2)수행
1-2)일치하지 않는다면 왼쪽으로 한칸 shift (현재값 >> 1) 후 1) 반복
1-2-1) 현재값 & 1 == 1이라면 oneCount++해줌 (oneCount는 재배치에 사용)
2) 왼쪽 shift 한만큼 오른쪽으로 shift 수행 후 oneCount만큼 일의 자리부터 1을 채움
ex) 46(101110) 다음 큰 수는?
- 왼쪽 shift 3번 후 01과 일치하기 때문에 (현재값 + 01) = 101 + 01 = 110
- shift과정에서 1의 값은 2개 존재(110 → oneCount : 2)
- 오른쪽으로 3번 shift, oneCount는 2이므로 011의 값으로 shift되면 완료
1100 → 11001 → 110011
46(101110) 다음 큰 수는 51(110011)이 됩니다.
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 32 | #include <string> #include <vector> using namespace std; int solution(int n) { int index = 0; int oneCount = 0; while(n != 0) { if((n & 0b11) == 0b01) { n = n + 0b01; break; } if((n & 1) == 1) { oneCount++; } n = n >> 1; index++; } while(index > 0) { n = n << 1; if(index == oneCount) { n = n + 0b1; oneCount--; } index--; } return n; } | cs |
↓↓↓↓↓↓ 유익했다면 하트 뿅 ♥ ↓↓↓↓↓↓
728x90
반응형
'프로그래밍 > 프로그래머스' 카테고리의 다른 글
| Lv2_[전화번호 목록, C++] 풀이 및 알고리즘 정리 - 프로그래머스 (0) | 2023.05.28 |
|---|---|
| Lv2_[[1차] 캐시, C++] 풀이 및 알고리즘 정리 - 프로그래머스 (0) | 2023.05.23 |
| Lv2_[올바른 괄호, C++] 풀이 및 알고리즘 정리 - 프로그래머스 (0) | 2023.03.29 |
| Lv2_[가장 큰 정사각형 찾기, C++] 풀이 및 알고리즘 정리 - 프로그래머스 (0) | 2023.03.27 |
| Lv2_[124 나라의 숫자, C++] 풀이 및 알고리즘 정리 - 프로그래머스 (0) | 2023.03.23 |
댓글