Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- group by
- 자바스크립트
- C언어
- programmers
- 소프티어
- 동적계획법
- Lv. 1
- Python
- SQL 고득점 KIT
- Lv. 0
- 깊이 우선 탐색
- 오블완
- softeer
- 너비 우선 탐색
- bfs
- LEVEL 2
- SQL
- DP
- dfs
- select
- 티스토리챌린지
- join
- Lv. 2
- Lv. 3
- 파이썬
- 프로그래머스
- Dynamic Programming
- level 3
- Java
- javascript
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 2] 2개 이하로 다른 비트 {언어 : Python} 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/77885
정답 코드
def solution(numbers):
answer = []
for num in numbers:
if num % 2:
newNum = ["0"] + list(bin(num)[2:])
lenN = len(newNum)
zeroIdx = 0
# 가장 가까이 있는 0을 1로 바꾸고
# 다시 바꾼 지점부터 가장 가까운 1을 0으로 바꿈
for i in range(lenN-1, -1, -1):
if newNum[i] == "0":
newNum[i] = "1"
zeroIdx = i
break
for j in range(zeroIdx+1, lenN):
if newNum[j] == "1":
newNum[j] = "0"
break
answer.append(int("".join(newNum), 2))
else:
answer.append(num+1)
return answer
풀이 방법
- 2의 배수인 경우 오른쪽 맨 끝 비트가 0이므로 1로만 바꿔줘도 현재 수보다 크지만 가장 작은 수가 된다.
- 하지만 홀수인 경우 오른쪽 맨 끝 부터 0을 찾아본다.
- 0을 찾으면 1로 바꾸고
- 바꾼 지점에서 다시 오른쪽으로 이동하면서 1을 찾고 0으로 바꾼다.
- 현재 만든 값을 int(숫자, n진수)를 사용해서 10진수로 만든다.
- answer에 넣는다.
느낀점
- xor과 shift에 대해서 공부하면 좋을 것 같다.
'알고리즘' 카테고리의 다른 글
프로그래머스 [Lv. 2] 메뉴 리뉴얼 {언어 : Python} [코드 리펙토링] (0) | 2024.05.03 |
---|---|
프로그래머스 [Lv. 2] 괄호 회전하기 {언어 : JavaScript} (0) | 2024.05.03 |
프로그래머스 [Lv. 2] 할인 행사 {언어 : Python} (0) | 2024.04.29 |
프로그래머스 [Lv. 2] n^2 배열 자르기 {언어 : JavaScript} (0) | 2024.04.28 |
프로그래머스 [Lv. 2] 주차 요금 계산 {언어 : Python} (0) | 2024.04.27 |