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

purplejay님의 프로필 이미지
purplejay

작성한 질문수

세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)

2021 Dev-Matching: 웹 백엔드 개발자(상반기) 2번 문제 - 행렬 테두리 회전하기

실전 문제풀이 관련 질문

작성

·

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

purplejay님의 프로필 이미지
purplejay
질문자

그동안 생각을 좀 해봤는데 반례를 찾은 것 같습니다. [0,0,30,2,1] 처럼 cost에 비해 cop이나 alg를 과도하게 많이 주면 제 테이블 안에는 답이 없네요. 혹시 이러한 반례는 문제를 많이 풀다보면 잘 찾게 되나요..? 제 풀이가 보통 일반적인 사례에는 잘 되는데 특수한 케이스에서 실패하는 경우가 많네요 ㅠㅠ

알리 Ally님의 프로필 이미지
알리 Ally
지식공유자

안녕하세요, purplejay님!

해당 풀이가 틀린 이유를 찾으셨다니 다행입니다!

문제를 풀 때 일반적인 사례에서는 통과를 하는데 특수한 사례에 대해 고려하지 못해 어려움을 겪는 것 같아, 이에 대해 답변을 드리겠습니다.

 

먼저, 그러한 풀이(일반적인 사례에 대해 잘 되지만 특수한 사례에 대해 안 되는 풀이)를 짤 수 있다는 것도 되게 잘 하고 있다고 말해드리고 싶습니다. 왜냐하면, 풀이의 아이디어는 올바르게 접근한 것이기 때문이죠.

 

[오류 없는 코드를 짜는 방법]

문제를 풀다 보면, 정답 로직과 같게 구현했는데 틀리는 경우를 많이 접할 수 있습니다. 그리고, 그러한 경험은 자연스러운 현상입니다.

실제로, 백준에서 잘하는 유저들의 정답률을 봐도 50% 이하인 사람이 존재하는 것처럼 처음 제출한 풀이가 바로 정답인 경우는 그리 많지 않습니다.

 

그렇다면, 왜 정답 로직과 같게 구현했는데 틀리는 경우가 종종 발생할까요? 그것은 해당 로직을 구현하는 과정에서 따로 고려해야 할 것들이 있기 때문입니다. 따로 고려해야 할 것들이라면 해당 로직을 코드로 구현하긴 했는데 정말 잘 구현된 것이 맞는지, 따로 처리해야 할 예외 케이스는 없는지 등을 의미합니다.

 

이러한 것들을 잘하려면, 내가 생각한 풀이를 구현하고 내 코드에 대해 비판하면 생각하는 과정을 자주 하시다 보면 늘릴 수 있습니다. 그러니까, 내가 생각한 아이디어를 구현하고 끝이 아니라, 내가 구현한 풀이가 정말 내가 생각한 대로 잘 돌아가는지를 체크해야 하는 것이죠.

 

즉 정리하면, 내 풀이에 대해 비판적으로 생각하며 문제를 많이 풀다 보면, 풀이 코드에 대한 완성도를 높일 수 있습니다! (예외 없이 정답을 찾아내는 코드를 더 잘 짤 수 있습니다!)

 

사실, 질문하신 문제는 예외 케이스를 찾아내기 어려운 문제라고 생각합니다. 따라서, 이 문제의 예외 케이스를 찾지 못했다고 너무 좌절하지 않으셨으면 합니다!

purplejay님의 프로필 이미지
purplejay

작성한 질문수

질문하기