컴퓨터로 문제를 해결할 때, 코딩테스트처럼 미리 전산학/컴퓨터공학적 개념으로 잘 정리된 문제라고 해도 어느 정도는 일상 언어를 통해 문제 사항이 기술된다. 여기서 프로그래머는 요구 사항을 정확하게 해석해야 한다. 이를 위해 커뮤니케이션이 필요하다.
아래는 내 실수다.
문제는 다음과 같다.
N개의 사탕을 3명의 어린이에게 나눠주려고 한다. 최대한 공평하게 나누려고 한다. 공평함의 기준은 받는 사탕의 총 무게를 기준으로 가장 무거운 어린이의 사탕 무게와 가장 가벼운 어린이의 사탕 무게의 차이다. 사탕의 무게는 20이하의 정수로 주어진다. 가장 공평한 분배일 때의 무게 차이를 구하는 알고리즘은?
여기서 나는 나름 꽤 만족스런 해법을 고안했으나 결과적으로 완전히 틀린 대답이 되고 말았는데, 그 이유는 문제의 요구 사항을 정확하게 이해하지 못했기 때문이다. 문제는 "공평하다"라는 단어였다.
나도 모르게 "공평하게 나눠주다"를 N개의 사탕을 개수 관점에서 골고루 나눠주는 것으로 이해했다. 즉, 사탕이 총 9개가 있고, 어린이가 3명이라면 각 어린이는 3개씩 사탕을 받을 것이고, 그 사탕의 총 무게의 차이로 공평함의 점수를 계산한다고 믿었던 것이다.
위와 같이 이해하면 어느 어린이도 사탕을 아무것도 받지 못하는 상황은 발생하지 않는다. (적어도 사탕이 3개 이상이라면..) 그러나 이 문제에서 공평함이란 그런 의미를 뜻하지 않았다. 그저 사탕을 나눠주고, 큰 무게와 작은 무게의 차이만을 구하면 된다. 공평함은 계산 방법을 말하는 것이지, 사탕을 나눠주는 방식과는 별개다.
따라서 사탕을 나눠주는 경우의 수는, 각 사탕을 3명 중 누구에게 줄 것인지 판단하는 것의 연속이므로 3의 N제곱이다. 즉, 한 사람이 N개의 사탕을 전부 가질 수도 있고, 아니면 내가 생각한대로 개수 자체가 골고루 분포될 수도 있다.
'IT 공부 > 알고리즘 (컴퓨팅 사고력 연습)' 카테고리의 다른 글
주어진 합을 가지는 특정 구간 구하기 (0) | 2024.03.20 |
---|---|
문제를 정확히 정의할 줄 아는 능력... (0) | 2023.11.29 |
주식 가격 문제 - 거꾸로 생각하기는 정말 중요하다. (0) | 2023.11.10 |
짝 찾기 문제와 스택의 본질 (0) | 2023.11.10 |
오늘의 피드백 - 거꾸로 생각할 때 주의할 점. (0) | 2023.11.07 |