티스토리 뷰

반응형

문제: programmers.co.kr/learn/courses/30/lessons/1835

 

코딩테스트 연습 - 단체사진 찍기

단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두

programmers.co.kr

필자는 해당 문제를 c++로 풀어 통과했지만 파이썬으로 변환하여 코드를 소개하겠습니다.

 

 
import itertools
n=2
data= ["M~C<2", "C~M>1"]    
mem = ['A','C','F','J','M','N','R','T']
pairs = list(map(list,itertools.permutations(mem,8)))
count=0
for pair in pairs: ## 한 개의 조합에 대하여 기준을 평가 하는 경우가 더 빠르다.  조합->기준
    for check in data:
        first,second,case,num=check[0],check[2],check[3],int(check[4])
        n1=pair.index(first)
        n2=pair.index(second)
        if case=='=':
            if int(abs(n1-n2))-1!=num:
                count+=1
                break
            elif int(abs(n1-n2))-1>=num:
                count+=1
                break
            elif int(abs(n1-n2))-1<=num:
                count+=1
                break
print(len(pairs)-count)

이 문제에서 핵심 내장 함수는 itertools 안에 있는 permutations(순열) 이다. 

itertools에 대한 메소드들을 알아두면 요긴하게 잘 쓸 수 있으므로 알아두는 것을 추천한다.

c++로서는 next_permutation 이 있다.( #include<algorithm>) 

해당 메소드를 쓰면 리스트 안에 있는 원소를 기준으로 순열을 만들어낸다.

그런 다음에 data안에 있는 기준에 적합성 유무를 판단하고 부적절하다면 갯수를 센다.

마지막에 len(pairs)-count를 하면 된다.

 

itertools 관련 정보: docs.python.org/ko/3/library/itertools.html

 

itertools — 효율적인 루핑을 위한 이터레이터를 만드는 함수 — Python 3.9.1 문서

 

docs.python.org

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함