[프로그래머스] PCCP 충돌위험 찾기 (Python setdefault)
k
2025.07.25
·
3 min read
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/340211
💻 코드
def solution(points, routes):
# n개의 포인트 서로 다른 번호,
# 운송경로 m개
# 로봇 x대, 0초 동시 출발
# 최단경로로 이동하는데 여러가지면 r좌표가 변하는 이동을 c좌표보다 먼저 함
# 같은 좌표에 로봇 2대이상이면 충돌 - 위험한 상황이 총 몇번 일어나는지
# 이 문제의 핵심 아이디어 - 로봇이 각 초마다 어디에 있는가?
dic = {}
for route in routes:
time = 0
cx,cy = points[route[0]-1]
dic.setdefault((cx,cy), []).append(time)
for i in range(1,len(route)):
# route가 2개 이상 갈 수도 있으니 for문 사용
ex,ey = points[route[i]-1]
step = 1 if cx < ex else -1
while cx != ex:
cx += step
time += 1
dic.setdefault((cx,cy), []).append(time)
step = 1 if cy < ey else -1
while cy != ey:
cy += step
time += 1
dic.setdefault((cx,cy), []).append(time)
answer = 0
for times in dic.values():
freq = dict()
for t in times:
freq[t] = freq.get(t,0)+1
for cnt in freq.values():
if cnt > 1:
answer += 1
return answer🧩 풀이
파이썬 setdefault()를 언제 쓸까?
dictionary에서 새로운 key를 만들 때는 초기화줘야하는게 귀찮음
key가 딕셔너리에 있다면, 그것의 value를 돌려줌
그렇지 않으면, default를 값으로 갖는 key를 삽입하고 default를 return
default를 새로 설정하지 않으면 None
setdefault 함수는 초기에 설정한 데이터 사입을 새로 바꾸지 않음
Graph = {}
Graph.setdefault("1")
print(Graph)
>> {'1': None}
G = {}
G.setdefault("A", [])
G.setdefault("A", set())
print(G)
>> {'A': []}
G = {}
G.setdefault("1", set())
G.setdefault("1", [])
print(G)
>> {'1': set()}
G = {}
for _ in range(3):
G.setdefault(1, []).append(2)
G.setdefault(2, []).append(1)
print(G)
>> {1: [2, 2, 2], 2: [1, 1, 1]}문제 풀이
처음에는 BFS로 접근했는데, 코드가 너무 더러워져서 포기하고 풀이 참고
defaultdict()을 사용하지 않고 풀어야하니 setdefault로 진행
각 로봇의 routes를 순회하며
현재 time = 0으로 초기화, 출발점도 충돌 체크 대상이므로 바로 기록
route[0]에서 시작해서 t=0부터 기록하며 이동할때마다 time += 1
row먼저 이동하고 col 다음 이동
각 좌표에는 여러 time들이 기록됨
t가 몇 번 등록했는지 빈도표 freq 구축
cnt > 1인 경우에만 위험상황 1로 세어서 answer += 1