링크 : https://school.programmers.co.kr/learn/courses/30/lessons/92343
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2022 KAKAO 블라인드 채용 코딩테스트의 기출 문제이다.
나도 당시에 테스트에 응시하며 이 문제를 접하였는데 다른 문제를 푸느라 풀 생각조차 하지 못했고 이제야 다시 풀어보게 되었다.
이번 네이버 코딩 테스트에서 크게 당한 후로 이런 것처럼 내가 지나쳐버린 문제들을 풀어봐야겠다는 생각이 들었다. 엄두도 내지 못했던 문제들을 해결하며 이후에 응시하게 될 코딩테스트에서도 자신감있게 겁먹지 않고 풀어나갈 수 있을 것 같다.
코드
from collections import defaultdict
def solution(info, edges):
answer = 0
childs = defaultdict(list)
for a,b in edges:
childs[a].append(b)
# 양의 수, 늑대의 수, 위치
def DFS(s,w,l,stack,visit):
nonlocal answer
answer = max(answer,s)
for c in stack:
if visit & (1 << c):
continue
if info[c] == 0:
DFS(s+1,w,c,stack+childs[c],visit | (1 << c))
elif s > w+1:
DFS(s,w+1,c,stack+childs[c],visit | (1 << c))
DFS(1,0,0,childs[0],1)
return answer
풀이
문제를 접하고 카카오라는 중압감과 너무 겁먹은 나머지 엄청 어려운 방식으로 해결하려 시도했다.
위상정렬 + DP + BFS 이 세 가지 알고리즘을 합쳐서 해결하려 했다. 위상정렬을 통해 단말노드부터 탐색하는 방향을 만들어 내고 DP를 통해서 각 노드마다 도달할 때 몇 마리의 양을 얻을 수 있는지, 몇 마리의 늑대가 따라오는지를 저장하고 BFS로 루트노드부터 탐색하며 그리디하게 해결해보려고 했다.
하지만 이 세가지 알고리즘을 합쳐서 해결하기에 너무 벅찼고 예외상황이 너무 많을 것 같아서 이 방법은 아니라고 생각이 들었다.
그래서 다른 방향으로 틀어보자고 생각했다.
info의 크기가 17까지밖에 올라가지 않아서 DFS 완전탐색으로도 충분할 것 같았다.
루트노드부터 시작해서 현재 위치에서 갈 수 있는 노드는 내가 방문한 노드들의 자식 노드들이다. 이 개념 하나로 언제 어디서 방향을 틀어도 상관없이 모든 노드를 탐색할 수 있었다. 또한 DFS이지만 모든 깊이까지 내려가지 않고 내가 방문할 수 있는 노드들만 탐색하며 정답을 갱신해나가서 시간복잡도 또한 별로 높지 않았다.
방문처리는 비트마스킹을 사용해주었다. 요즘 시간복잡도를 줄이는 방향으로 코드들을 작성해나가다 보니 비트마스킹을 사용하는 것에 익숙해지고 있고 실제로 많은 효과를 보고 있다.
'알고리즘 > PROGRAMMERS (Python)' 카테고리의 다른 글
[ 프로그래머스 / LV2 / 파이썬 Python ] 방금그곡 (0) | 2023.04.21 |
---|---|
[ 프로그래머스 / LV2 / 파이썬 Python ] 이모티콘 할인행사 (0) | 2023.04.20 |
[ 프로그래머스 / LV2 / 파이썬 Python ] 요격 시스템 (0) | 2023.04.16 |
[ 프로그래머스 / LV3 / 파이썬 Python ] 미로 탈출 명령어 (0) | 2023.04.16 |
[ 프로그래머스 / LV3 / 파이썬 Python ] 순위 (0) | 2023.04.14 |