처음엔 약간의 편법으로 접근하려 했다.
[1, 1, 0], [1, 1, 0], [0, 0, 1]
이렇게 자신의 인덱스 넘버는 무조건 1이고,
그 외에 1이 있다면 연결되어있다는 뜻이니,
이중 포문으로 탐색하면서,
자신 외에 1의 인덱스 넘버를 저장하고,
set으로 중복제거 후 갯수를 세는 방식으로 해봤다.
즉 DFS, BFS도 안쓰고 그냥 편법을 쓴것이다.
def solution(n, computers):
alist = []
for idx, val in enumerate(computers):
for idxx, vall in enumerate(val):
if idxx != idx and vall == 1:
alist.append(idx)
alist = set(alist)
return n-len(alist)+1
이렇게 실행하니, 기본제공 2개의 테스트케이스는 통과하나,
통과를 위한 13개의 테스트케이스 중 4, 5, 7번이 에러가 났다.
아무리 본 코드를 봤을때
발전 가능성이 없을 것 같아서 정공법으로 DFS를 꺼내들었다.
시간복잡도가 굉장하나... (2중 while문 + "n not in visited"도 visited 배열의 크기만큼 탐색하니... 어휴)
통과는 할 수 있었다.
def solution(n, computers):
stack = [0]
visited = []
toVisit = [i for i in range(n)]
print(toVisit)
answer = 0
while toVisit:
while stack:
n = stack.pop()
if n not in visited:
visited.append(n)
tlist = [i for i,
val in enumerate(computers[n])
if val==1 and i not in visited]
stack = stack+tlist
answer += 1
toVisit = list(set(toVisit)-set(visited))
if toVisit:
stack = [toVisit[0]]
return answer
다시한번 본질적으로 DFS를 공부할 수 있었고,
[i for i, val in ... ] 과 같이 파이썬 특유의 코드 모양도 여러번 활용해볼 수 있어서
꽤나 보람찼다.
이번 공부를 통해 얻은 결론을 다시 한번 정리했다.
gogoonbuntu.tistory.com/23?category=893844
반응형
'개발 > Python & Flask' 카테고리의 다른 글
Python Flask CSV 파일 다루기! 초간단 3줄 예시 (0) | 2020.11.10 |
---|---|
Python Sched 라이브러리 (몇초마다 반복실행) (0) | 2020.11.10 |
Flask 선행 라이브러리, Python Flask 오프라인 세팅 (0) | 2020.11.10 |
[Python] 단어변환 문제풀이(완전탐색) (0) | 2020.08.12 |
[python] 코딩테스트 연습풀이 "완주하지 못한 선수" (0) | 2020.07.30 |