문제 정의
다음과 같은 조건을 충족하는 함수를 작성하세요:
주어진 정수 배열이 주어졌을 때, 이 배열에서 두 수를 더하여 특정 목표값을 만드는 두 수의 인덱스를 반환하는 함수를 작성하시오. 배열에는 항상 해답이 존재한다고 가정하며, 같은 요소를 두 번 사용하는 것은 허용되지 않습니다.
function twoSum(nums, target) {
// 여기에 코드를 작성하세요.
}
입력 예시
입력:
twoSum([2, 7, 11, 15], 9)
출력 예시
출력:
0, 1
문제 풀이 과정
이 문제를 해결하기 위해, 우리는 두 가지 접근 방식을 사용할 수 있습니다. 첫 번째는 이중 루프를 사용하는 방법이고, 두 번째는 해시맵을 활용하는 방법입니다. 효율성을 고려하여 해시맵을 사용하는 방법을 선택하겠습니다.
1. 문제 분석
우리가 해야 할 일은 배열의 각 요소를 살펴보면서, 목표값에서 해당 요소를 뺀 값을 찾는 것입니다. 이 값을 발견하면, 그 요소의 인덱스를 반환하면 됩니다.
2. 해시맵 사용
첫 번째 단계로, 빈 해시맵(객체)을 생성합니다. 배열을 순회하면서 각 요소를 해시맵에 추가하고, 그 요소의 인덱스도 함께 저장합니다. 그 후, 매 순회할 때마다 목표값에서 현재 요소를 뺀 값이 해시맵에 존재하는지 확인합니다. 존재하면 그 인덱스를 반환합니다.
function twoSum(nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i];
if (map.has(complement)) {
return [map.get(complement), i];
}
map.set(nums[i], i);
}
}
3. 디버깅 사례
코드를 작성한 후, 오류가 발생할 수 있는 부분을 확인하는 것이 중요합니다. 디버깅을 통해 ‘목표값에서 현재 요소를 뺀 값을 찾는 로직’에서 의도한 대로 작동하는지 체크할 수 있습니다. 콘솔 로그를 활용하여 각 단계에서 변수의 상태를 확인할 수도 있습니다.
function twoSum(nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i];
console.log(`Current Number: ${nums[i]}, Complement: ${complement}`);
if (map.has(complement)) {
console.log(`Found complement: ${complement} at index ${map.get(complement)}`);
return [map.get(complement), i];
}
map.set(nums[i], i);
}
}
결론
위와 같은 방법으로 문제를 해결하면, 자바스크립트의 특성을 활용할 수 있고, 디버깅 또한 수월하게 진행할 수 있습니다. 코드를 작성한 후에는 항상 디버깅 툴(브라우저의 개발자 도구 등)을 활용해 다양한 케이스를 테스트해보고, 각 변수의 상태를 확인하며 문제를 보다 깊이 이해하는데 초점을 맞추는 것이 좋습니다.
이번 강좌에서는 자바스크립트에서의 알고리즘 문제 풀이와 함께 디버깅의 중요성을 알아보았습니다. 이러한 접근법을 통해 여러분의 코딩 테스트 준비에 도움이 되기를 바랍니다.