오늘은 그래도 순한 맛이었어요!
원래 쉬운 문제는 올리면 안되긴 하는데, 저도 요새 그리디를 못 풀어서인지, 실수가 잦더라구요.
오늘도 어떤 상황을 하나 못 떠올리면서, 살짝 꼬였습니다.
그래서 바로
테스트케이스를 볼까...?
라고 생각했는데, 곰곰히 생각해보니
이렇게 맨날 보기만 하다 나중에 막히면 누가 테스트케이스 알려주게?
라는 생각이 들었어요. 그래서 테스트케이스 예외를 20분간 생각한 결과!
겨우 풀었습니다.
쉬운 문제였지만, 굉장히 기억에 남을 거 같아요. 그 과정까지가 값졌거든요 👏
저와 비슷한 분들이 있을 거라 생각하고, 도움을 드리고자 풀이 과정 공개합니다!
처음에는 다음과 같은 풀이과정을 떠올렸어요.
- 에이~ 어쨌든 한꺼번에 많이 태울 수 있는대로 태워야겠다!
- 그러면 결과적으로 작은 사람들 먼저 태우자!
그랬는데, 결과적으로 계속 30점만 나오더라구요.
그래서 일단 다시 고민해봤는데 제가 놓친 것이 두 개였습니다.
첫째, 최대 탈 수 있는 사람은 2명
결국 제목을 제대로 안 읽어서 발생했더라구요. 그래서 이에 대해 2명이면 다시 새롭게 보트를 만들어주는 식으로 절차형 프로그래밍을 했어요.
그러나... 그래도 30점은 변하지 않더라구요...?
그럼 코드에는 문제가 없으니, 로직에 문제가 있다고 접근 과정을 바꿨습니다.
그렇다면 분명 예외가 존재하겠죠. 정말 최악의 경우에는 어떤 케이스가 있을까? 싶었는데 다음 예외가 있었습니다.
💡 만약 [20,20,80,80], 100이라면, 2가 나와야 하는데... 어라?
제가 놓쳤던 최악의 경우는 무조건 가장 큰 사람과 가장 작은 사람이 같이 타야 해가 나오는 경우였습니다.
그도 그럴 것이, 2명이라는 전제가 깔려있으면 작은 사람들끼리 뭉칠 이유가 없습니다. 최대한 한 번에 2명을 태우게 할 수 있는 최적의 방법이 필요한 법이죠.
결과적으로 이를 고치니, 해결!
const solution = (people, limit) => {
let answer = 0;
people.sort((a, b) => a - b)
while (people.length) {
if (people.pop() + people[0] <= limit) people.shift();
answer++;
}
return answer
}
오우, 통과됐어요!
저는 말이죠, 굉장히 안 좋은 습관을 갖고 있습니다.
항상 테스트케이스를 달라고 원해봤지, 반례를 직접 찾는 과정은 없더라구요.
그런데 오늘 직접 반례를 생각하면서 깨닫았습니다.
반례를 찾아내는 예외처리 과정 역시 생각을 길러주는 힘을 키운다는 것을요.
꽤나 뿌듯한 하루네요. 이상!