N과M 4

[백준 알고리즘] 15663. N과 M (9)

🎈 숫자를 문자열로 바꾸지 않고 정렬해 오류가 떴다. 1, 2, 3, 4 정렬할 때는 문자나 숫자나 차이가 없지만, 100, 10, 110 같은 경우는 문자와 숫자의 정렬이 달라짐을 간과했었다. 주로 list를 사용해와서 이번에도 set을 사용할때 list로 넣어준다음 중복제거를 위해 set을 사용했는데, 'unhashable type' 이라는 에러가 발생했다. 찾아보니 list 말고 tuple에는 해시 값이 있어 tuple을 사용하니 잘 통과됐다. 정렬하고 -> 중복값제거하고 -> 다시 정렬하는게 비효율적이라고 느껴져 다른 풀이를 찾아봤었다. t라는 값을 두어 이전의 값을 저장한 뒤 새로운 조합을 만들때 값을 비교하는 풀이가 신박했다. from sys import stdin n, m = map(int,..

[백준 알고리즘] 15650. N과 M (2) - 조합

조합문제이다. 순열과 비슷하면서도 다른데, 순열은 1,2 2,1 둘다 되지만, 조합은 1,2 만가능하다. 2 다음에는 2보다 작은 값이 올 수 없도록 처리하면 조합이 된다. 그래서 for의 범위를 넘겨주어 이전의 값+1 부터 뽑도록 했다. N, M = map(int, input().split()) select = [0] * M def comb(idx, start): if idx == M: print(" ".join(map(str, select))) return for i in range(start, N): select[idx] = i+1 comb(idx+1, i+1) comb(0, 0) for문을 통해서 보면 이해하는 데 더 편하다. arr = [1, 2, 3, 4, 5] N = len(arr) for ..

[백준 알고리즘] 15649. N과 M (1) - 순열

간단한 순열을 푸는 문제다. 왠지 순열문제는 기분이 나쁘다... ㅋㅋㅋㅋㅋㅋㅋ 중복되지 않는 순열이기에 visited로 중복검사가 필요하다. 만약 중복 순열이라면 visited를 빼면 된다. N, M = map(int, input().split()) num = [] visited = [0 for _ in range(N)] def perm(idx): if idx == M: print(" ".join(map(str, num))) return for i in range(N): if visited[i] == 0: num.append(i+1) visited[i] = 1 perm(idx+1) num.pop() visited[i] = 0 perm(0) 이것보다 더 빠르고 간단하게 순열을 구하려면 itertools에서..