소스 코드
def bfs(i,j): while len(temp) != 0: ni,nj = temp.pop(0) for qq in range(1,n+1): if board[ni][qq] == 1: board[ni][qq] = 0 board[qq][ni] = 0 visited[qq] = 1 visited[ni] = 1 temp.append([ni,qq]) if board[nj][qq] == 1: board[nj][qq] = 0 board[qq][nj] = 0 visited[qq] = 1 visited[nj] = 1 temp.append([nj,qq]) return # tc 개수 T = int(input()) for tc in range(1,1+T): # 주민 수, 관계 수 n,m = map(int,input().split()) # 관계 items = [list(map(int,input().split())) for _ in range(m)] # 관계들 저장해서 for문 돌지 않기 위함 board = [[0]*(n+1) for _ in range(n+1)] # 관계가 나오지 않은 곳을 찾기 위해 visited = [1]+[0]*n # 무리의 수 cnt = 0 # 관계가 확인된 곳 저장 for q in items: board[q[0]][q[1]] = 1 board[q[1]][q[0]] = 1 for w in items: # 관계가 확인된 곳이면 if board[w[0]][w[1]] == 1: # 무리의 수 + 1 및 board 초기화, visited 변경 cnt += 1 temp = [[w[0],w[1]]] board[w[0]][w[1]] = 0 board[w[1]][w[0]] = 0 visited[w[0]] = 1 visited[w[1]] = 1 bfs(w[0],w[1]) # 무리의 숫자 + 관계가 나오지 않은 곳들의 수(사람 하나가 하나의 무리) res = cnt + visited.count(0) print('#{} {}'.format(tc,res))
해결 방법
1. 관계가 나오지 않은 사람들도 존재할 수 있음을 명심해야 한다
ex) 4 1
1 4가 input으로 주어졌을 때, 무리의 수는 [1,4] , [2], [3] 3이다.
2. 이를 따로 확인하기 위해 visited를 추가해서 문제 해결
느낀 점
함정을 조심하자!
ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
광고
광고
'코딩 문제해결 > 문제 풀이.SWEA' 카테고리의 다른 글
[SWEA 코딩] 재관이의 대량 할인 - PYTHON #4050 (0) | 2021.03.16 |
---|---|
[SWEA 코딩] 가능한 시험 점수 - PYTHON #3752 (0) | 2021.03.16 |
[SWEA 코딩] 몬스터 사냥 - PYTHON #11387 (0) | 2021.03.14 |
[SWEA 코딩] 틱택톰 - PYTHON #11545 (0) | 2021.03.13 |
[SWEA 코딩] 가장 빠른 문자열 타이핑 - PYTHON #3143 (0) | 2021.03.11 |