자바 코딩테스트 강좌: 디버깅 활용 사례 살펴보기
코딩 테스트는 현대의 많은 IT 산업 체에서 필수적인 프로세스가 되었습니다. 해마다 수많은 개발자들이 코딩 테스트를 준비하며, 알고리즘 문제 해결 능력을 높이고자 다양한 방법을 시도합니다. 이 강좌에서는 자바를 사용한 알고리즘 문제 풀이와 함께 디버깅 기술의 활용을 중점적으로 다루고자 합니다.
문제: 배열에서 두 수의 합 찾기
다음은 주어진 배열에서 두 수의 합이 특정 타겟 값이 되는 두 숫자의 인덱스를 찾는 문제입니다.
문제 설명: 정수 배열nums
와 정수 타겟target
이 주어질 때, 타겟을 이루는 두 수의 인덱스를 반환하는 함수를 작성하십시오. 각 입력은 단 하나의 정답이 존재하며, 같은 요소를 두 번 사용하지 않습니다. 함수 시그니처:public int[] twoSum(int[] nums, int target)
예시
입력: nums = [2, 7, 11, 15], target = 9 출력: [0, 1] 설명: nums[0] + nums[1] = 2 + 7 = 9이기 때문에 출력은 [0, 1]입니다.
문제 풀이 과정
이 문제는 배열에서 합이 주어진 타겟 값인 두 숫자를 찾는 문제입니다. 이를 해결하기 위해 우리는 여러 접근 방식을 고려할 수 있습니다.
1. 브루트포스(Brute Force) 방법
가장 간단한 방법은 이중 루프를 통해 모든 조합을 고려하는 것입니다. 타겟을 이루는 두 수를 찾기 위해 배열의 모든 요소를 최악의 경우 O(n²)의 시간 복잡도로 검사합니다.
자바 코드: public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[i] + nums[j] == target) { return new int[] { i, j }; } } } throw new IllegalArgumentException("No two sum solution"); }
2. 해시맵(HashMap) 사용하기
이중 루프를 사용하는 대신, 해시맵을 사용하여 값과 인덱스를 저장하고, 필요한 값이 해시맵에 존재하는지 확인할 수 있습니다. 이를 통해 시간 복잡도를 O(n)으로 줄일 수 있습니다.
자바 코드: import java.util.HashMap; public int[] twoSum(int[] nums, int target) { HashMapmap = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement)) { return new int[] { map.get(complement), i }; } map.put(nums[i], i); } throw new IllegalArgumentException("No two sum solution"); }
디버깅 과정
이제 위 코드에서 디버깅 기법을 사용하는 방법에 대해 알아보겠습니다. 디버그는 코드의 동작을 이해하고 문제를 해결하는 데 중요한 역할을 합니다. 자바에서 가장 일반적으로 사용하는 디버그 방법은 다음과 같습니다.
- 출력문(System.out.println): 코드의 특정 부분에서 변수를 출력하여 변수의 상태를 파악하는 방법입니다.
System.out.println("Current index: " + i); System.out.println("Current number: " + nums[i]); System.out.println("Complement: " + complement);
테스트 케이스
다음은 우리가 작성한 함수에 대한 다양한 테스트 케이스입니다. 이러한 테스트는 코드가 예상대로 작동하는지 확인하는 데 도움을 줍니다.
public void testTwoSum() { assertArrayEquals(new int[] {0, 1}, twoSum(new int[]{2, 7, 11, 15}, 9)); assertArrayEquals(new int[] {1, 2}, twoSum(new int[]{3, 2, 4}, 6)); assertArrayEquals(new int[] {0, 1}, twoSum(new int[]{3, 3}, 6)); }
결론
이 글에서는 배열에서 두 수의 합을 찾는 문제를 다루었으며, 다양한 접근 방법 및 디버깅 기법에 대해 설명하였습니다. 이처럼 알고리즘 문제를 해결하기 위해서는 단순히 문제를 이해하는 것을 넘어, 다양한 알고리즘을 사용하고 그 과정에서 디버깅 기술을 활용하는 것이 중요합니다. 자바를 통해 이러한 문제를 풀어보면서 여러분의 프로그래밍 능력을 한층 더 발전시킬 수 있기를 바랍니다.
이 강좌가 유용하셨다면, 다른 알고리즘 문제와 디버깅 기법에 대해서도 계속해서 공부하길 권장합니다. 기초가 탄탄할수록 더 복잡한 문제를 해결하는 데 수월할 것입니다.