문제 출처 : https://www.acmicpc.net/problem/15650
🔥 작성 코드
N, M = map(int, input().split())
lst = [_ for _ in range(1, N+1)]
arr = []
for i in range(1<<len(lst)):
cnt = 0
result = []
for j in range(len(lst)):
if i != 0:
if i & (1<<j):
cnt += 1
result.append(lst[j])
if len(result) > M:
break
if len(result) == M:
arr.append(result)
arr.sort()
for i in range(len(arr)):
print(*arr[i])
⭕ 해설
- 비트연산자를 활용하여 풀었습니다.
- 처음에는 arr를 만들지 않고 result를 바로바로 출력했는데 틀렸습니다.
- 만약 4 2 가 들어왔다면 비트연산자로 len(result)가 2가 되는 값의 순서는 다음과 같습니다.
- 0011 => 1 2
- 0101 => 1 3
- 0110 => 2 3
- 1001 => 1 4
- 1010 => 2 4
- 1100 => 3 4
- 문제에서는 1 4 보다 2 3이 먼저 출력되면 안되므로 오답입니다.
- 그래서 result의 원소가 2개가 될 때마다 arr에 저장해두고 순서대로 정렬시킨 뒤 출력하였습니다.
비트연산자 관련 문제
2022.02.15 - [Algorithm/SWEA] - [SWEA 2817] 부분 수열의 합
N과 M(1)
2022.03.04 - [Algorithm/BAEKJOON] - [백준 BOJ] 15649 N과 M(1) (python)
'Algorithm > BAEKJOON' 카테고리의 다른 글
[백준 BOJ] 15652 N과 M(4) (python) (0) | 2022.03.04 |
---|---|
[백준 BOJ] 15651 N과 M(3) (python) (0) | 2022.03.04 |
[백준 BOJ] 15649 N과 M(1) (python) (0) | 2022.03.04 |
[백준 BOJ] 1063 킹 (python) (0) | 2022.02.24 |
[백준 BOJ] 1091 카드 섞기 (0) | 2022.02.24 |