본문 바로가기
IT 공부/알고리즘 (컴퓨팅 사고력 연습)

[피드백] - 일상 언어를 제대로 이해하자. (문제 해석 실패 사례)

by exdus3156 2024. 3. 25.

컴퓨터로 문제를 해결할 때, 코딩테스트처럼 미리 전산학/컴퓨터공학적 개념으로 잘 정리된 문제라고 해도 어느 정도는 일상 언어를 통해 문제 사항이 기술된다. 여기서 프로그래머는 요구 사항을 정확하게 해석해야 한다. 이를 위해 커뮤니케이션이 필요하다.

아래는 내 실수다.

문제는 다음과 같다.

N개의 사탕을 3명의 어린이에게 나눠주려고 한다. 최대한 공평하게 나누려고 한다. 공평함의 기준은 받는 사탕의 총 무게를 기준으로 가장 무거운 어린이의 사탕 무게와 가장 가벼운 어린이의 사탕 무게의 차이다. 사탕의 무게는 20이하의 정수로 주어진다. 가장 공평한 분배일 때의 무게 차이를 구하는 알고리즘은?

 

여기서 나는 나름 꽤 만족스런 해법을 고안했으나 결과적으로 완전히 틀린 대답이 되고 말았는데, 그 이유는 문제의 요구 사항을 정확하게 이해하지 못했기 때문이다. 문제는 "공평하다"라는 단어였다.

나도 모르게 "공평하게 나눠주다"를 N개의 사탕을 개수 관점에서 골고루 나눠주는 것으로 이해했다. 즉, 사탕이 총 9개가 있고, 어린이가 3명이라면 각 어린이는 3개씩 사탕을 받을 것이고, 그 사탕의 총 무게의 차이로 공평함의 점수를 계산한다고 믿었던 것이다. 

위와 같이 이해하면 어느 어린이도 사탕을 아무것도 받지 못하는 상황은 발생하지 않는다. (적어도 사탕이 3개 이상이라면..) 그러나 이 문제에서 공평함이란 그런 의미를 뜻하지 않았다. 그저 사탕을 나눠주고, 큰 무게와 작은 무게의 차이만을 구하면 된다. 공평함은 계산 방법을 말하는 것이지, 사탕을 나눠주는 방식과는 별개다.

따라서 사탕을 나눠주는 경우의 수는, 각 사탕을 3명 중 누구에게 줄 것인지 판단하는 것의 연속이므로 3의 N제곱이다. 즉, 한 사람이 N개의 사탕을 전부 가질 수도 있고, 아니면 내가 생각한대로 개수 자체가 골고루 분포될 수도 있다.