문제
풀이
필요역량
- 레벨 3
- Brute force, permutation
- 정렬하고 간격으로 어떻게 풀어보려다 결국 테스트케이스에 실패, 다른 코드를 참고했다.
- weak 배열 크기도 작고, dist 배열 크기도 작기 때문에 완전탐색으로 문제를 풀 수 있다 (=쉽게 푼다고 머리만 쓰고 틀리지 마라)
파이썬 순열 : from itertools import permutations
- 파이썬 순열 라이브러리 몰라서 새로 짜서 썼다. (= 어리석음)
- 배워가야할 부분은 1. 완전탐색이 가능하면 단순하게 완전탐색으로 일단 풀자. 2. 원형으로 주어진 자료를 선형으로 풀자.
- 코드 풀이는 아래 주석으로 달아놓았다.
코드
from itertools import permutations
def solution(n, weak, dist):
# L = 취약 지점 개수
L = len(weak)
cand = []
# 원형을 선형으로 변경, 예시 1번의 경우 [1, 5, 6, 10, 13, 17, 18, 22]
# 출발지점이 1인경우 13까지, 6인 경우 18까지 도달해야함
weak_point = weak + [w+n for w in weak]
# 출발지점을 다르게 해서 모든 케이스를 시도해본다.
for i, start in enumerate(weak):
# 출발지점마다 가능한 dist의 모든 경우를 체크한다.
for friends in permutations(dist):
count = 1
position = start
for friend in friends:
# 시작지점에서 dist 원소의 값을 더해준다.
position += friend
# weak_point[i+L-1]은 도달해야할 목표치 원소. 포지션이 모자르면 친구를 더씀
if position < weak_point[i+L-1]:
count += 1
# 포지션이 취약지점에 도달하지 못하면 다음 시작지점은 도달하지 못한 취약지점으로 한다.
for p in weak_point[i+1:i+L] :
if p > position :
position = p
break
# 목표 취약지점에 도달하면 친구를 그만 쓰고 count를 후보(cand)리스에서 더해주고 반복문을 빠져나온다.
else:
cand.append(count)
break
if not cand :
return -1
return min(cand)
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 징검다리 건너기- 파이썬, O(n), 모노톤큐 (0) | 2021.03.31 |
---|---|
[프로그래머스]월간 코드 챌린지 시즌1- 풍선 터트리기, 파이썬 (0) | 2021.03.29 |
[프로그래머스] 그리디 - 단속카메라, 파이썬 (0) | 2021.03.15 |
[프로그래머스] N으로 표현, 파이썬 (0) | 2021.03.12 |
[프로그래머스] 해시 - 베스트앨범, 파이썬 (0) | 2021.03.12 |