실전 문제풀이 관련 질문
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
Answer 1
0
그동안 생각을 좀 해봤는데 반례를 찾은 것 같습니다. [0,0,30,2,1] 처럼 cost에 비해 cop이나 alg를 과도하게 많이 주면 제 테이블 안에는 답이 없네요. 혹시 이러한 반례는 문제를 많이 풀다보면 잘 찾게 되나요..? 제 풀이가 보통 일반적인 사례에는 잘 되는데 특수한 케이스에서 실패하는 경우가 많네요 ㅠㅠ
1
안녕하세요, purplejay님!
해당 풀이가 틀린 이유를 찾으셨다니 다행입니다!
문제를 풀 때 일반적인 사례에서는 통과를 하는데 특수한 사례에 대해 고려하지 못해 어려움을 겪는 것 같아, 이에 대해 답변을 드리겠습니다.
먼저, 그러한 풀이(일반적인 사례에 대해 잘 되지만 특수한 사례에 대해 안 되는 풀이)를 짤 수 있다는 것도 되게 잘 하고 있다고 말해드리고 싶습니다. 왜냐하면, 풀이의 아이디어는 올바르게 접근한 것이기 때문이죠.
[오류 없는 코드를 짜는 방법]
문제를 풀다 보면, 정답 로직과 같게 구현했는데 틀리는 경우를 많이 접할 수 있습니다. 그리고, 그러한 경험은 자연스러운 현상입니다.
실제로, 백준에서 잘하는 유저들의 정답률을 봐도 50% 이하인 사람이 존재하는 것처럼 처음 제출한 풀이가 바로 정답인 경우는 그리 많지 않습니다.
그렇다면, 왜 정답 로직과 같게 구현했는데 틀리는 경우가 종종 발생할까요? 그것은 해당 로직을 구현하는 과정에서 따로 고려해야 할 것들이 있기 때문입니다. 따로 고려해야 할 것들이라면 해당 로직을 코드로 구현하긴 했는데 정말 잘 구현된 것이 맞는지, 따로 처리해야 할 예외 케이스는 없는지 등을 의미합니다.
이러한 것들을 잘하려면, 내가 생각한 풀이를 구현하고 내 코드에 대해 비판하면 생각하는 과정을 자주 하시다 보면 늘릴 수 있습니다. 그러니까, 내가 생각한 아이디어를 구현하고 끝이 아니라, 내가 구현한 풀이가 정말 내가 생각한 대로 잘 돌아가는지를 체크해야 하는 것이죠.
즉 정리하면, 내 풀이에 대해 비판적으로 생각하며 문제를 많이 풀다 보면, 풀이 코드에 대한 완성도를 높일 수 있습니다! (예외 없이 정답을 찾아내는 코드를 더 잘 짤 수 있습니다!)
사실, 질문하신 문제는 예외 케이스를 찾아내기 어려운 문제라고 생각합니다. 따라서, 이 문제의 예외 케이스를 찾지 못했다고 너무 좌절하지 않으셨으면 합니다!
Iterable 관련 설명 중 의문점
1
71
1
DP 알고리즘 index 0 이유?
0
80
2
백준에서 queue.PriorityQueue() 사용 시 런타임에러가 납니다.
0
78
2
(시간 초과) BOJ 1342 관련하여 질문이 있습니다
1
79
2
BFS, DFS
0
102
2
이중연결리스트에 관한 수업 내용도 있을까요?
0
98
1
영상에서 설명이 잘못됐고 자막이 맞는 내용이라고 자막에 표기
0
110
2
최대값 int(1e6, 1e7, 1e8) 기준
0
268
2
섹션 3 BOJ 1342 //= 연산자 관련
0
87
3
라이브러리 사용
0
118
2
2번 구현 방법 질문 있습니다.
0
167
1
브루트 포스 풀이
0
144
2
다익스트라 음수 간선
0
158
1
종료 조건
0
117
2
BOJ 1342 메모리초과 관련
0
122
2
진짜 엄청나네요. 이 가격에 새로운 컨텐츠 추가라니
0
214
1
섹션3 브루트포스 알고리즘 1342 풀이1 질문
0
150
2
boj 3020
0
127
1
강의 내용 중 백트래킹 존재 여부
0
155
1
제가 공부하는 방법이 괜찮은지 궁금합니다
1
260
2
DP 11053관련 질문있습니다.
0
120
1
17609 투포인터 문제를 재귀로 풀 경우가 궁금합니다!
0
138
3
3020번 풀이 코드관련 질문있어요
0
171
2
재귀 관련 문제 관찰할 때 질문
0
197
1

