인프런 커뮤니티 질문&답변

김민수님의 프로필 이미지
김민수

작성한 질문수

파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)

1. 최대점수 구하기(DFS)

이 코드 어느 부분에서 틀렸을까요??

작성

·

402

0

# 레벨, 일하는중(남은시간) def dfs(level, working_time): global max_value working_time -= 1 if level >= n: # 날짜가 지났는데 아직도 일을 하는경우 if working_time >= 1: return tmp = 0 for i in range(n): if checked[i] == 1: tmp += li_input[i][1] if tmp > max_value: max_value = tmp else: # 남은 일이 없어야 일 진행가능 if working_time < 1: # 일해야 되는 시간 만큼을 인자로 넘김 working_time = li_input[level][0] checked[level] = 1 dfs(level + 1, working_time) checked[level] = 0 dfs(level + 1, working_time) n = int(input()) li_input = [] for i in range(n): li_input.append(tuple(map(int, input().split()))) checked = [0] * (n) max_value = 0 dfs(0,0) print(max_value) 문제에 적혀있는 예제 빼고 다 틀리네요.'휴가(삼성 SW역량평가 기출문제 : DFS활용)' 해당 문제 풀었습니다.다른 답으로 쉽게 풀수 있긴한데 해당 코드가 왜 틀리게 나오는지는 모르겠네요.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
김민수님, 제공해 주신 파이썬 코드를 살펴보았습니다. 코드를 보면 재귀 함수 dfs를 사용하여 문제를 해결하려는 시도를 하셨네요. 여기서 몇 가지 체크 포인트를 확인하실 필요가 있습니다.

  1. working_time의 감소 시점: dfs 함수 호출 시 맨 처음에 working_time을 감소시키고 있지만, 이렇게 되면 함수가 호출될 때마다 시간이 감소하여 재귀의 레벨과 관계없이 작동하게 됩니다. 작업 시간이 실제로 경과한 후에 감소하는 것이 맞는지 확인해야 합니다.

  2. 작업 시작 조건: 만약 working_time이 0 미만이 될 경우에만 새 작업을 시작하도록 조건을 설정해야 합니다. 그렇지 않으면 아직 진행 중인 작업이 있는 경우에도 새 작업을 시작하게 되어 올바르지 않은 처리가 될 수 있습니다.

  3. 중복 작업 체크: 현재 코드에서는 checked 배열을 사용하여 어떤 일을 했는지 체크하고 있습니다. 하지만, checked[level] = 1로 설정한 후에 작업을 취소하지 않는 경우(working_time이 0 이상일 때)에도 checked[level] = 0으로 설정하고 있습니다. 이 부분 역시 조건에 따라 올바르게 처리되어야 합니다.

  4. 종료 조건: 종료 조건에서 working_time이 1 이상인 경우에만 반환하고 있지만, 이는 잘못된 테스트 케이스를 걸러내기에 충분하지 않습니다. 만약 마지막 날에 정확히 작업이 끝나는 경우에도 제외되므로, working_time이 0일 때에도 정상적으로 계산해야 할 수 있습니다.

제공해주신 정보로는 정확한 오류의 원인을 알기 어렵습니다만, 위의 체크리스트를 바탕으로 코드를 다시 검토해보시길 권장합니다. 문제의 정확한 조건이나 추가적인 정보가 더 있으면 더 정확한 진단이 가능할 것입니다.

참고로, 문제를 해결하는 데 있어서 여러 접근 방식과 다른 사람들의 코드를 참조하는 것은 매우 좋은 학습 방법입니다. 인프런의 ‘휴가’ 문제와 유사한 코드 예시나 풀이를 찾아보는 것도 추천 드립니다.

김민수님의 프로필 이미지
김민수

작성한 질문수

질문하기