최대한 not in 안쓰고 해결하기

 

 

문제

https://www.acmicpc.net/problem/10552

 

나의 풀이

처음에는 set을 사용해서 좋아하는 채널에서 싫어하는 채널을 뺐을 때 남아있는 채널이 없으면 -1을 출력하도록 했습니다.
그러나 set의 차집합 연산량이 많아서 주어진 시간안에 해결되지 않았습니다.

그래서 visited를 사용, 이미 방문한 곳을 다시 한번 방문하면 싸이클을 돈다 판단하고 -1을 출력하도록 했습니다.
배열의 접근은 O(1)이므로 연산시간이 그렇게 크지 않습니다.

최대한 not in 방식을 사용하지 않게 하기 위해서 try except 문을 사용한 것이 특징입니다.

import sys

read = lambda: sys.stdin.readline().strip()


if __name__ == "__main__":
    n, m, p = map(int, read().split())
    ch_dict = {}
    visited = [0] * 100001
    for _ in range(n):
        pos, neg = map(int, read().split())
        try:
            ch_dict[neg]
        except:
            ch_dict[neg] = pos

    count = 0
    while True:
        if visited[p] == 1:
            print(-1)
            break
        try:
            visited[p] = 1
            p = ch_dict[p]
        except:
            print(count)
            break
        count += 1

 

다른 분의 풀이

사실 제 풀이는 dfs를 명시 안해줬을 뿐, 구조는 완전히 동일했습니다.
dfs를 명시하고 사용한 코드는 다음과 같습니다.

#dfs 함수
def dfs(start):
    cnt = 0
    visited =set()
    visited.add(start)
    stack = [start]
    while stack:
        v = stack.pop()
        for next_v in adj_graph[v]:
            #순회 하면 -1
            if next_v in visited:
                cnt = -1
                break
            else:
                stack.append(next_v)
                visited.add(next_v)
                cnt +=1
    return cnt 
            
if __name__ == "__main__":
    import sys
    input = sys.stdin.readline

	n, m, p = map(int,input().split())
    #채널 인접
    adj_graph ={i:[] for i in range(1,m+1)}
    for _ in range(n):
        fav, hated = map(int,input().split())
        #어린사람 우선순위 
        if adj_graph[hated]:
            continue
        adj_graph[hated].append(fav)
    print(dfs(p))

댓글남기기