배열에 저장된 여러 정수 중에서 두 정수의 합이 우리가 지정한 특정 값과 일치하는지 확인해야 하는 경우가 종종 있습니다. 이 글에서는 C#의 이중 반복문을 활용해 이 문제를 간단하게 해결하는 방법을 알아보겠습니다.
문제 상황
먼저 다음과 같은 정수 배열이 있다고 가정해 보겠습니다.
int[] arr = new int[] { 7, 4, 6, 2 };그리고 찾고자 하는 목표 값(두 정수의 합과 일치해야 하는 값)은 다음과 같습니다.
int res = 8;
즉, 배열에 있는 두 요소를 더했을 때 그 결과가 8이 되는 조합이 존재하는지 확인하는 것이 목표입니다. 실제로 7 + ... 는 아니지만, 예를 들어 6 + 2 = 8처럼 배열 내 두 수의 합이 목표 값과 같은지 검사할 수 있습니다.
핵심 로직: 이중 반복문 활용
가장 직관적인 방법은 배열의 모든 요소 쌍을 비교하는 것입니다. 바깥쪽 반복문과 안쪽 반복문을 사용해 서로 다른 인덱스의 두 요소를 더한 뒤, 그 합이 목표 값과 일치하는지 확인합니다.
for (int i = 0; i < arr.Length; i++) {
for (int j = 0; j < arr.Length; j++) {
if (i != j) {
int sum = arr[i] + arr[j];
if (sum == res) {
Console.WriteLine(arr[i]);
}
}
}
}여기서 i != j 조건이 중요합니다. 같은 요소를 자기 자신과 더하는 것을 방지하기 위해서입니다. 예를 들어 인덱스 i와 j가 동일하면 arr[i] + arr[i]가 되어 의도하지 않은 결과가 나올 수 있습니다.
전체 예제 코드
위 로직을 포함한 완전한 C# 프로그램은 다음과 같습니다.
using System;
using System.Collections.Generic;
namespace Demo {
public class Program {
public static void Main(string[] args) {
int[] arr = new int[] {
7,
4,
6,
2
};
// 목표 정수
int res = 8;
Console.WriteLine("Given Integer {0}: ", res);
Console.WriteLine("Sum of:");
for (int i = 0; i < arr.Length; i++) {
for (int j = 0; j < arr.Length; j++) {
if (i != j) {
int sum = arr[i] + arr[j];
if (sum == res) {
Console.WriteLine(arr[i]);
}
}
}
}
}
}
}실행 결과
프로그램을 실행하면 합이 8이 되는 숫자들이 출력됩니다. 배열에서 6 + 2 = 8 조합이 존재하므로 해당 숫자들이 화면에 표시됩니다.
Given Integer 8: Sum of: 6 2
정리 및 개선 아이디어
이 방법은 구현이 매우 간단하지만, 이중 반복문 때문에 시간 복잡도가 O(n²)입니다. 배열의 크기가 커지면 성능이 저하될 수 있으므로, 다음과 같은 최적화 방법도 고려해 볼 수 있습니다.
- HashSet 활용: 배열을 한 번만 순회하면서 각 요소에 대해 '목표 값 - 현재 요소'가 이미 집합에 있는지 확인하면 O(n) 시간 복잡도로 해결할 수 있습니다.
- j를 i+1부터 시작: 안쪽 반복문을
for (int j = i + 1; ...)로 시작하면 중복된 쌍 검사를 피하고 불필요한 연산을 줄일 수 있습니다.
작은 배열에서는 단순한 이중 반복문 방식이 충분히 효율적이며, 코드 가독성 면에서도 이해하기 쉬운 장점이 있습니다.