티스토리 뷰
문제
처음 풀이
pop()으로 풀었는데, 우선순위큐를 활용하는 방식이 더 일반적인 것 같다.
arr = [64]
x = int(input())
while sum(arr) != x:
if sum(arr) > x:
target = arr.pop()
arr.append(target//2)
arr.append(target//2)
if sum(arr[:len(arr)-1]) >= x:
arr.pop()
else:
pass
else:
result = 1
result = len(arr)
print(result)
그런데 이 문제는 비트마스킹 문제로 한 줄로 답이 나오는 문제였다.
비트마스크
비트마스크란 이진수를 사용하는 컴퓨터의 연산 방식으로, 정수의 이진수 표현을 자료 구조로 쓰는 기법이다.
구현 방법 중 하나인 "원소의 포함 여부 확인" 을 보자.
" A 집합에 특정 원소가 포함되어 있는지 확인하는 방법이다. k번째 원소가 포함되어 있는지 확인하고 싶다면, k번째 bit가 켜져 있는지만 확인하면 된다. "
즉 문제에서 막대기가 64고 구하고자 하는 길이가 Xcm 이다.
X 가 64 라면 비트로 0b1000000
X 가 32 라면 비트로 0b100000
X 가 23 이라면 비트로 0b10111
이다.
비트마스크 각 자리는 10진수로 64 32 16 8 4 2 1 에 해당한다.
즉 몇 개의 막대를 풀로 붙여 X 로 만들 수 있는가? = X를 이진수로 표현했을 때 1이 몇개인가?
이다.
해당 원소가 포함되어 있다면 1, 없다면 0이기 때문이다.
따라서 문제는 X를 이진수로 바꾸고, 1의 갯수를 구해주면 된다.
bin() 함수로 이진수로 바꿔주면 문자열(str) 자료형으로 출력되고, count 메서드로 문자열 1의 갯수를 세주면 된다!
# 비트마스크 방식
print(bin(int(input())).count('1'))
참고
'Algorithm' 카테고리의 다른 글
[프로그래머스] 2019 카카오 블라인드 #3 후보키 (0) | 2022.07.17 |
---|---|
[Baekjoon] 1966. 프린터 큐 (0) | 2021.12.11 |
[Baekjoon] 1012. 유기농 배추 (0) | 2021.12.09 |
DFS & BFS (0) | 2021.12.08 |
[프로그래머스][힙] 디스크 컨트롤러 (211114) (0) | 2021.11.14 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 개발자책추천
- 상업용무료폰트
- 개발언어순위
- 임대차3법
- SSAFY
- 디즈니얼굴
- 폰트추천
- 싸피6기
- 브왈라
- 싸피
- 폰트
- ssafy후기
- 한글무료폰트추천
- ssafy결과
- 클린코드
- intj여자
- 개발자로드맵
- ssafy6기
- 코딩도서
- 무료폰트추천
- 개발자도서추천
- ssafy합격후기
- 깃허브계정
- 깃허브계정2개
- 개발자커리
- 개발자
- 맥과윈도우로깃허브
- 개발도서추천
- 클린코더
- 개발언어추천
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함