작성
·
15
0
2022 KAKAO TECH INTERNSHIP 문제 중 코딩테스트 공부 문제에서 실패하는 경우가 있어서 왜 그런지 질문드리려고 합니다. 예시풀이 중 dp풀이랑 비슷하게 풀었는데 다른 점은 저는 dp[alg][cop]을 해당 alg, cop에 도달하기 위해 필요한 최소 비용으로 정의하고 마지막에 최대 alg~+30, co~ +30 중 최소값을 리턴하도록 정의했습니다. 이렇게 하니까 정확성은 다 통과하는데 효율성에서 실패하는 경우가 생기던데 왜그럴까요?
def solution(alp, cop, problems):
answer = 0
problems += [[0,0,1,0,1], [0,0,0,1,1]]
dp = [[1000] * 181 for _ in range(181)]
dp[alp][cop] = 0
goal = [alp,cop]
for alp_req, cop_req, alp_rwd, cop_rwd, cost in problems:
goal[0] = max(goal[0], alp_req)
goal[1] = max(goal[1], cop_req)
for i in range(alp, 181):
for j in range(cop, 181):
for alp_req, cop_req, alp_rwd, cop_rwd, cost in problems:
if i >= alp_req + alp_rwd and j >= cop_req + cop_rwd:
dp[i][j] = min(dp[i][j], dp[i-alp_rwd][j-cop_rwd] + cost)
answer = 1000
for row in dp[goal[0]:]:
answer = min(answer, min(row[goal[1]:]))
return answer
답변 1
0
그동안 생각을 좀 해봤는데 반례를 찾은 것 같습니다. [0,0,30,2,1] 처럼 cost에 비해 cop이나 alg를 과도하게 많이 주면 제 테이블 안에는 답이 없네요. 혹시 이러한 반례는 문제를 많이 풀다보면 잘 찾게 되나요..? 제 풀이가 보통 일반적인 사례에는 잘 되는데 특수한 케이스에서 실패하는 경우가 많네요 ㅠㅠ
안녕하세요, purplejay님!
해당 풀이가 틀린 이유를 찾으셨다니 다행입니다!
문제를 풀 때 일반적인 사례에서는 통과를 하는데 특수한 사례에 대해 고려하지 못해 어려움을 겪는 것 같아, 이에 대해 답변을 드리겠습니다.
먼저, 그러한 풀이(일반적인 사례에 대해 잘 되지만 특수한 사례에 대해 안 되는 풀이)를 짤 수 있다는 것도 되게 잘 하고 있다고 말해드리고 싶습니다. 왜냐하면, 풀이의 아이디어는 올바르게 접근한 것이기 때문이죠.
[오류 없는 코드를 짜는 방법]
문제를 풀다 보면, 정답 로직과 같게 구현했는데 틀리는 경우를 많이 접할 수 있습니다. 그리고, 그러한 경험은 자연스러운 현상입니다.
실제로, 백준에서 잘하는 유저들의 정답률을 봐도 50% 이하인 사람이 존재하는 것처럼 처음 제출한 풀이가 바로 정답인 경우는 그리 많지 않습니다.
그렇다면, 왜 정답 로직과 같게 구현했는데 틀리는 경우가 종종 발생할까요? 그것은 해당 로직을 구현하는 과정에서 따로 고려해야 할 것들이 있기 때문입니다. 따로 고려해야 할 것들이라면
해당 로직을 코드로 구현하긴 했는데 정말 잘 구현된 것이 맞는지
,따로 처리해야 할 예외 케이스는 없는지
등을 의미합니다.이러한 것들을 잘하려면, 내가 생각한 풀이를 구현하고 내 코드에 대해 비판하면 생각하는 과정을 자주 하시다 보면 늘릴 수 있습니다. 그러니까,
내가 생각한 아이디어를 구현하고 끝
이 아니라,내가 구현한 풀이가 정말 내가 생각한 대로 잘 돌아가는지를 체크
해야 하는 것이죠.즉 정리하면, 내 풀이에 대해 비판적으로 생각하며 문제를 많이 풀다 보면, 풀이 코드에 대한 완성도를 높일 수 있습니다! (예외 없이 정답을 찾아내는 코드를 더 잘 짤 수 있습니다!)
사실, 질문하신 문제는 예외 케이스를 찾아내기 어려운 문제라고 생각합니다. 따라서, 이 문제의 예외 케이스를 찾지 못했다고 너무 좌절하지 않으셨으면 합니다!