알고리즘/프로그래머스
2017 카카오코드 본선 단체사진 찍기
글을 쓰는 개발자
2021. 2. 5. 20:56
반응형
문제: 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
반응형