문제 설명
고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다.
고속도로를 이동하는 차량의 경로 routes가 매개변수로 주어질 때, 모든 차량이 한 번은 단속용 카메라를 만나도록 하려면 최소 몇 대의 카메라를 설치해야 하는지를 return 하도록 solution 함수를 완성하세요.
제한사항
- 차량의 대수는 1대 이상 10,000대 이하입니다.
- routes에는 차량의 이동 경로가 포함되어 있으며 routes[i][0]에는 i번째 차량이 고속도로에 진입한 지점, routes[i][1]에는 i번째 차량이 고속도로에서 나간 지점이 적혀 있습니다.
- 차량의 진입/진출 지점에 카메라가 설치되어 있어도 카메라를 만난것으로 간주합니다.
- 차량의 진입 지점, 진출 지점은 -30,000 이상 30,000 이하입니다.
입출력 예
routes | return |
[[-20,-15], [-14,-5], [-18,-13], [-5,-3]] | 2 |
입출력 예 설명
-5 지점에 카메라를 설치하면 두 번째, 네 번째 차량이 카메라를 만납니다.
-15 지점에 카메라를 설치하면 첫 번째, 세 번째 차량이 카메라를 만납니다.
💕 나의 풀이
def solution(routes):
answer=0
pos=-30001
routes.sort(key=lambda x : x[1])
while routes :
i, o=routes.pop(0) # 진입, 진출
if pos < i :
pos=o
answer += 1
return answer
진출 지점이 작은 순서대로 정렬한다.
현재 카메라가 설치된 pos보다 진입 지점이 더 크면 새로운 진출 지점 o에 카메라를 설치
🎀 다른사람 풀이
# 출처 : https://wwlee94.github.io/category/algorithm/greedy/speed-enforcement-camera/
def solution(routes):
answer=0
# 진출을 기준으로 오름차순
routes.sort(key=lambda x: x[1])
camera=-30001
for route in routes :
if camera < route[0] :
answer+=1
camera=route[1]
return answer
카메라 설치 위치가 차 진입 지점 route[0]보다 작으면 answer을 1 늘린다. 현재 지점에 카메라 설치해야함.
camera를 진출 지점 route[1]로 갱신하고 반복문을 계속 진행한다.
# 출처 : https://velog.io/@tjdud0123/%EB%8B%A8%EC%86%8D-%EC%B9%B4%EB%A9%94%EB%9D%BC
def solution(routes):
ENTER, EXIT, N=0, 1, len(routes)
routes=sorted(routes, key=lambda x:x[1])
check=[False]*N
camera, count=-30000, 0
for i in range(N) :
if check[i] :
continue
count+=1 # 카메라 설치
camera=routes[i][EXIT] # 진출지점
for i in range(i, N) : # 다른 차 검사
if routes[i][ENTER] <= camera and camera <= routes[i][EXIT]:
check[i]=True
return count
routes를 진출지점을 기준으로 오름차순 정렬
차를 검사했는지 확인하기 위해 check 리스트를 만든다.
진입 지점이 camera보다 같거나 작고, 진출 지점이 camera보다 크거나 같으면 check에 True를 넣는다.
# 출처 : https://velog.io/@coding_egg/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8B%A8%EC%86%8D%EC%B9%B4%EB%A9%94%EB%9D%BC-python-%ED%8C%8C%EC%9D%B4%EC%8D%AC
from sys import maxsize
def solution(routes):
routes.sort(key=lambda x:(x[0], x[1]))
m=-maxsize
M=maxsize
cnt=0
for s, e in routes : # 진입, 진출
if M < s :
cnt+=1
m=s
M=e
else:
if m < s :
m=s
if M > e :
M=e
cnt+=1
return cnt
💁♀️ 출처 : 프로그래머스
반응형
'coding test' 카테고리의 다른 글
[파이썬] 정수 삼각형 (0) | 2021.04.06 |
---|---|
[파이썬] 섬 연결하기 (0) | 2021.04.06 |
[파이썬] 자물쇠와 열쇠 (0) | 2021.04.02 |
[파이썬, Java] 추석 트래픽 (0) | 2021.04.01 |
[파이썬, Java] 단어 변환 (0) | 2021.03.26 |