[Python] 모든 순열 - 순열

Saemi Min·2023년 1월 28일
0

BaekJoon

목록 보기
2/30
post-thumbnail


해당 문제 링크

풀이

from itertools import permutations

a=int(input())
arr=[]
for s in range(1, a+1):
    arr.append(s)

for i in permutations(arr):
    print(*i)

Git - 코드

해석

처음 문제를 풀면서 난관에 봉착했다..
처음 썼던 코드는 아래와 같다.

<잘못된 코드>
from itertools import permutations

a=int(input())
arr=[]
for i in range(a):
    arr.append(i+1)

res=[]
l=list(permutations(arr, a))
for n in l:
    for m in n:
        res.append(m)

b=int(len(res)/a) 
count=0
i=0
while(count!=b):
    print(res[i], res[i+1], res[i+2])
    i+=a
    count+=1

하지만 이 코드는 입력을 3으로 할 때만 나온다는 것이다... 왜냐하면 print(res[i], res[i+1], res[i+2])로 아예 지정을 했기 때문.. 사실 코드를 작성하면서 정답에 점점 멀어져가고 있단 것은 알았지만 그래도 혹시 모르니 계속 해봐서 나온 결과 코드이다.
그리해서 다른 사람의 풀이를 참고하여 코드를 작성해보았다.

from itertools import permutations

a=int(input())
for i in permutations([s for s in range(1, a+1)]):
    print(*i)

참고 코드 출처

이 코드를 보고 이렇게 단순할 수 있구나를 느꼈고, 새로운 for문 형식을 배울 수 있었다.
기본적인 for문으로 직접 수정하여 고쳐본다면

from itertools import permutations

a=int(input())
arr=[]
for s in range(1, a+1):
    arr.append(s)

for i in permutations(arr):
    print(*i)

으로 바뀐다. 위의 참고한 코드와 같은 코드와 같은 방식으로 돌아간다. 코드 형식만 다를 뿐.

또 한가지 배운 점은 튜플의 값을 을 사용하여 바로 출력된다는 것이다.
C언어나 C++에서는
를 포인터라는 개념으로 사용하여 배웠는데 파이썬은 다른 쓰임으로 쓰여진다는 것을 알았다.

파이썬 asterisk(*) 사용 용도
이 코드에서 쓰인 용도는 Unpacking이다.
for-loop를 이용하여 list나 tuple을 순회하며 출력할 때 사용한다.
그래서

이와 같이 튜플 안의 값들이 출력된다.

그리하여 아래와 같은 코드로 문제를 해결했다.

또한, 순열 라이브러리를 사용하여 문제를 해결하는 방법 이외의 백트래킹으로 해결도 가능한 문제였다. 이후에 백트래킹에 대해서도 Data Structure & Algorithm 시리즈에서 자세히 다뤄보고, 이 문제를 어떻게 푸는지까지 다룰 예정이다.

profile
I believe in myself.

0개의 댓글