• Feed
  • Explore
  • Ranking
/
/
    🧩알고리즘

    [프로그래머스] PCCP 충돌위험 찾기 (Python setdefault)

    k
    kawaihachiwarae
    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







    - 컬렉션 아티클