소스 코드
def bfs(number):
# 루트도 트리의 크기에 포함되기 때문에 1로 시작
cnt = 1
# 저장 공간
temp = []
for r in range(1,3):
if storage[number][r] != 0:
temp.append(storage[number][r])
cnt += 1
# bfs 돌면서 트리의 크기 확인
while len(temp) != 0:
item = temp.pop(0)
for r in range(1, 3):
if storage[item][r] != 0:
temp.append(storage[item][r])
cnt += 1
return cnt
T = int(input())
for tc in range(1,1+T):
# 정점의 수 v, 간선의 수 e, 공통조상 a,b
v,e,a,b = map(int,input().split())
# e개의 간선
lst = list(map(int,input().split()))
# 정점 간의 관계를 확인하기 위한 list
# [부모의 값, 1번 자식, 2번 자식]
storage = [[0,0,0] for _ in range(v+1)]
for q in range(e):
# 1번 자식이 없는 경우
if storage[lst[q*2]][1] == 0:
storage[lst[q * 2]][1] = lst[q*2+1]
else:
storage[lst[q * 2]][2] = lst[q*2+1]
# 부모의 값 입력
storage[lst[q*2+1]][0] = lst[q*2]
# 부모 추적을 위한 빈 리스트
a_lst = []
b_lst = []
# a,b 값이 모두 0에 도달할 때까지 반복해서 부모의 값을 추적
while True:
if a != 0:
a = storage[a][0]
a_lst.append(a)
if b != 0:
b = storage[b][0]
b_lst.append(b)
if a == 0 and b == 0:
break
# 공통조상 중 가장 가까운 것의 번호
res_num = 0
# 공통 조상을 찾는 절차
for w in a_lst:
if res_num != 0:
break
for e in b_lst:
if w == e:
res_num = w
break
# 그것을 루트로 하는 서브 트리의 크기
res_cnt = bfs(res_num)
print('#{} {} {}'.format(tc,res_num,res_cnt))
해결 방법
1. 정점간의 관계를 미리 저장(storage)
2. 공통조상을 찾기를 원하는 두 정점(a,b)의 부모의 값을 추적 & 가장 가까운 조상 값(res_num)을 찾음
3. res_num을 루트로하는 트리의 크기를 계산(bfs 사용)
느낀 점
ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.SWEA' 카테고리의 다른 글
[SWEA 코딩] [SW 모의역량 테스트] 특이한 자석 - PYTHON #4013 (0) | 2021.06.08 |
---|---|
[SWEA 코딩] S/W 문제해결 응용 달란트2 - PYTHON #1265 (0) | 2021.06.07 |
[SWEA 코딩] S/W 문제해결 응용 금속막대 - PYTHON #1259 (0) | 2021.06.05 |
[SWEA 코딩] S/W 문제해결 응용 K번째 접미어 - PYTHON #1256 (0) | 2021.06.05 |
[SWEA 코딩] Base64 Decoder - PYTHON #1928 (0) | 2021.06.03 |