시간이 정말 빠르다.
어느덧 3개월이 흘렀고, 이제 정글은 5주밖에 남지 않았다.
남은 기간을 어떻게 알차게 보낼 수 있을까 고민하던 찰나에, 지난 주 협력사 발표차 오신 네이버 리더님께서 블로그 및 깃허브 관리의 중요성을 언급해주셨다. 당장 취업만을 목적으로 혹은 남이 시켜서 남기는 기록이 아니라, 장기적인 관점에서 봤을 때 정말 좋은 조언이라고 생각해 행동으로 옮겨보고자 한다 :)
정글에서는 '나만의 무기' 프로젝트를 진행 중이다.
5주간 다른 4명의 팀원과 함께 프로젝트를 진행하는 것인데, 다행히도 정말 좋은 사람들만 만나서 나름 순조롭게 진행하고 있다. 가장 마음에 드는 것은 '지속가능성' 이라는 테마에 모두가 공감한다는 것인데, 덕분에 하루하루 완벽한 바이오 리듬을 유지하며 스스로 최고의 효율을 내고 있는 것 같다.
오늘은 지난 3일간 고민한 아이디어를 보다 구체화하고, 발표를 준비하는 시간을 가졌다. 본래 우리 조가 생각했던 아이디어를 2가지 준비해서 코치님을 뵈러 갔었는데, 한 아이디어는 무참히 깨지고 말았다(...) 당일 크래프톤 사옥이라는 한정된 공간에서, 한정된 시간 이내에 발표 및 시연을 해야한다는 조건을 충족하지 못했기 때문이다. 아이템 자체도 좋은 평가를 받진 못했는데, 해당 아이디어를 발제하고 열심히 준비한 팀원이 속상해했고 나 역시 그 아이디어가 괜찮았어서 속상했다.
하지만, 매도 먼저 맞는 것이 낫다고 하지 않는가? 빠르게 움직여 코치님께 주말이 되기 전에 미리 따끔한 피드백을 받았기에, 이후에 준비하면서 완성도가 더 높아진 것 같다.
발표를 리더인 gon님이 맡았기에, 나는 다른 팀원들과 함께 우리 팀장님이 발표를 좀 더 잘할 수 있도록 최대한 지원하며 하루를 보냈다. 발표 스크립트나 PPT를 다른 팀원들이 1차적으로 작성 및 구성해주면, 내가 그걸 수정 및 보완하는 형식으로 진행했다.
내가 이수한 3가지 전공 중에 2가지가 워낙 팀프로젝트와 발표가 많았어서, 옛 기억을 되살려 팀에 최대한 기여하며 하루를 보냈다. 보다 자세한 내용은, 아직까진 극비사항이므로 내일 오후에 있을 공개초안발표 후에 좀 더 자세히 적어보도록 하겠다.
오늘 알고리즘 스터디에서는, '가장 먼 노드' 라는 프로그래머스 문제를 풀었다.
내일 나만의 무기 프로젝트 초안발표가 있어서 그런지, 처음에 영 집중이 되지 않았다.
사실 그래프 문제를 막연히 어렵다고 느끼는지라, 문제를 보고 당황했다 😰
그래도, 우선 양방향 그래프에 대한 정보를 저장해야 하는건 확실해보였다.
def solution(n, edge):
answer = 0
# 그래프를 파악하기 --> connection
connection = defaultdict(list)
for u, v in edge:
connection[u].append(v)
connection[v].append(u)
이렇게 하면, 각 노드가 다른 어떤 노드와 연결되어 있는지에 대한 정보가 처리된다.
정보를 넣고나서 생각해보니, 문제 조건을 살펴보니 edge [1,2], [1,3], [2,3]이 존재할 때 1->2->3 과 1->3 을 둘 다 탐색할 필요는 없는 것 같았다. edge [1,3]이 존재하니까 3번 노드는 1번 노드로부터 거리 1만큼만 떨어져 있는 상태인데, '가장 먼 노드'를 찾으려는 상황에 굳이 1번 노드에서 2번 노드로 갔다가, 거기서 3번 노드로 갈 필요가 없는 것이다.
그래서 visited 리스트를 통해 방문 정보를 저장해야겠구나, 그리고 1번 노드로부터 순차적으로 방문하게 하면 되겠구나, 라는 결론을 내리고 BFS를 위한 초기설정을 해주었다.
# queue를 돌려서 BFS 해주기 위한 초기설정
q = deque([1])
visited = [True] * 2 + [False]*(n-1)
그 다음에는, 어떻게 하면 1번 노드로부터 가장 먼 노드를 찾을 수 있을까 고민해보았다.
위와 같은 그래프가 주어졌을 때, 다음과 같이 처리해주면 되지 않을까 싶었다.
STEP 1) 1번 노드와 직접적으로 연결된 노드, 즉 2번 노드와 3번 노드를 각각 방문처리하고, 큐에 넣는다.
STEP 2-1) 2번 노드와 연결된 노드 중, 아직 방문처리 되지 않은 노드, 즉 4번 노드와 5번 노드를 방문처리하고 큐에 넣는다.
STEP 2-2) 3번 노드와 연결된 노드 중, 아직 방문처리 되지 않은 노드, 즉 6번 노드를 방문처리하고 큐에 넣는다.
STEP 3-1) 4번 노드와 연결된 노드 중, 아직 방문처리 되지 않은 노드를 방문처리하고 큐에 넣는다. 여기선 조건을 충족하는 노드가 없기에, 큐에 아무것도 추가하지 않는다.
STEP 3-2) 5번 노드와 연결된 노드 중, 아직 방문처리 되지 않은 노드를 방문처리하고 큐에 넣는다. 여기선 조건을 충족하는 노드가 없기에, 큐에 아무것도 추가하지 않는다.
STEP 3-3) 6번 노드와 연결된 노드 중, 아직 방문처리 되지 않은 노드를 방문처리하고 큐에 넣는다. 여기선 조건을 충족하는 노드가 없기에, 큐에 아무것도 추가하지 않는다.
이런 식으로 흘러가게 하면 되지 않을까라는 생각과 함께, 코드를 구성했다.
# 거리(dist)별로 순차적으로 탐색할 수 있도록, BFS 구성
dist = 0
while True:
next_q = deque()
for now in q:
for candidate in connection[now]:
if visited[candidate]: continue
next_q.append(candidate)
visited[candidate] = True
if not next_q:
# next_q로 탐색할 다음 후보지가 없다?
# 현재 dist에서 q에 들어있던 것들이, 가장 멀리 떨어진 노드들임.
# 그 갯수를 세자!
answer = len(q)
break
q = next_q
dist += 1
이렇게 해서, 코드를 실행해봤더니 바로 테스트케이스가 통과한다.
느낌이 좋은걸....? 그 결과...
한번에 통과했다 ! ! !
최종 코드는 다음과 같다.
from collections import deque, defaultdict
def solution(n, edge):
answer = 0
# 그래프를 파악하기 (connection)
connection = defaultdict(list)
for u, v in edge:
connection[u].append(v)
connection[v].append(u)
# queue를 돌려서 BFS 해주기 위한 초기설정
q = deque([1])
visited = [True] * 2 + [False]*(n-1)
# 거리(dist)별로 순차적으로 탐색할 수 있도록, BFS 구성
dist = 0
while True:
next_q = deque()
for now in q:
for candidate in connection[now]:
if visited[candidate]: continue
next_q.append(candidate)
visited[candidate] = True
if not next_q:
# next_q로 탐색할 다음 후보지가 없다?
# 현재 dist에서 q에 들어있던 것들이, 가장 멀리 떨어진 노드임. 그 갯수를 세자
answer = len(q)
break
q = next_q
dist += 1
return answer
요즘 알고리즘 풀이에 자신감이 붙었는데, 백준에서 프로그래머스로 넘어와서 그런건가 싶기도 하다. 어쨌든 전반적인 실력이 상승한 것은 사실이니, 계속 꾸준히 하다보면 여기서도 더 좋아질 수 있을 것이라고 믿는다. 화이팅...!