네이버클라우드 캠프 | BE/Java 과제

[네이버클라우드 캠프/3주차] 두 수의 합이 유일한 값의 개수 출력하기

three kim 2023. 4. 13. 09:46
728x90

3주 차에는 컬렉션 프레임워크를 주로 배운 만큼, 이를 활용한 과제가 많았습니다.

각 인터페이스가 아닌 List와 Map 두 가지를 모두 활용하여 주어진 문제를 풀어보도록 하겠습니다.

(컬렉션 프레임워크를 활용한 과제는 모두 새롭고, 인사이트를 얻게 되는 것 같습니다.)

 

문제 : 6개의 정수를 입력받아, 두 수의 합이 유일한 값이 되는 개수를 출력하세요.

 

이번 문제는 앞선 3주 차 과제 2개를 활용하여 풀이한 문제였습니다.

 

[네이버클라우드 캠프/3주차] 문자열 중 가장 많이 등장하는 문자 구하기

지난 과제를 풀며, 어렵다고 느꼈던 문제 혹은 새로운 깨달음을 준 문제들에 대해 블로그 글로 정리하고 있습니다. '문제를 풀었을 때 (그때그때) 블로그 글로 작성해 두면 더 좋았을 텐데..'란

1-three.tistory.com

 

[네이버클라우드 캠프/3주차] 연속합이 가장 큰 두 수 구하기

지난 블로그 글이었던 '[네이버클라우드 캠프/3주차] 문자열 중 가장 많이 등장하는 문자 구하기' 에서도 컬렉션 프레임워크 중 하나인 Map을 사용하여 과제를 풀이했는데요. 이번 블로그 글 역시

1-three.tistory.com

 

위의 글도 참고하시면서 아래 코드를 이해해 보시면 좋을 것 같습니다.

 

1. 6개 정수를 입력받아 List에 저장합니다.

public class Main {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
        
		Scanner sc = new Scanner(System.in);
		for(int i = 1; i <= 6; i++) {
			System.out.print(i + "번째 정수 입력 > ");
			list.add(sc.nextInt());
		}
	}
}

 

2. 두 수의 합과 그 개수를 저장할 Map을 생성하고, 유일한 값의 개수를 세는 count 변수를 선언합니다.

public class Main {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
        
		Scanner sc = new Scanner(System.in);
		for(int i = 1; i <= 6; i++) {
			System.out.print(i + "번째 정수 입력 > ");
			list.add(sc.nextInt());
		}
        
		Map<Integer, Integer> sumMap = new HashMap<>();
		int count = 0;
	}
}

 

3. 두 수의 합을 더하기 위해 중첩 for문을 사용합니다.

public class Main {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
        
		Scanner sc = new Scanner(System.in);
		for(int i = 1; i <= 6; i++) {
			System.out.print(i + "번째 정수 입력 > ");
			list.add(sc.nextInt());
		}
        
		Map<Integer, Integer> sumMap = new HashMap<>();
		int count = 0;
        
		for(int i = 0; i < list.size() - 1; i++) {		// 5번 확인
			for(int j = i + 1; j < list.size(); j++) {	// 다음 인덱스와의 합 확인
				Integer sum = list.get(i) + list.get(j);
			}
		}
	}
}

 

 

위 그림과 같은 원리로 두 수의 합을 구하기 위해

바깥 for문은 0번 인덱스부터 4번 인덱스까지

안의 for문은 바깥 for문에서 들어오는 인덱스 번호의 다음 번호부터 5번(끝) 인덱스까지

반복 수행할 수 있도록 작성했습니다.

 

4. Map에 해당 키(두 수의 합)가 존재하는지 확인하기 위해 if문을 사용합니다.

public class Main {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
        
		Scanner sc = new Scanner(System.in);
		for(int i = 1; i <= 6; i++) {
			System.out.print(i + "번째 정수 입력 > ");
			list.add(sc.nextInt());
		}
        
		Map<Integer, Integer> sumMap = new HashMap<>();
		int count = 0;
        
		for(int i = 0; i < list.size() - 1; i++) {
			for(int j = i + 1; j < list.size(); j++) {
				Integer sum = list.get(i) + list.get(j);
				
				if(!sumMap.containsKey(sum)) {		// map에 키(합)가 존재하지 않을 경우
					sumMap.put(sum, 1);
					count++;
				} else {
					sumMap.put(sum, sumMap.get(sum) + 1);
				}
			}
		}
	}
}

 

키(두 수의 합)이 현재 Map에 존재하지 않을 경우,

1을 값(Value)으로 가져가며 유일한 값의 개수를 세는 count를 + 1 합니다.

 

키(두 수의 합)가 현재 Map에 존재할 경우,

기존의 값(Value)에 + 1을 할 수 있도록 작성했습니다.

 

5. Map에 두 수의 합과 그 개수를 대입하기 위해 if문 안에 또 다른 if문을 작성합니다.

public class Main {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
        
		Scanner sc = new Scanner(System.in);
		for(int i = 1; i <= 6; i++) {
			System.out.print(i + "번째 정수 입력 > ");
			list.add(sc.nextInt());
		}
        
		Map<Integer, Integer> sumMap = new HashMap<>();
		int count = 0;
        
		for(int i = 0; i < list.size() - 1; i++) {
			for(int j = i + 1; j < list.size(); j++) {
				Integer sum = list.get(i) + list.get(j);
				
				if(!sumMap.containsKey(sum)) {
					sumMap.put(sum, 1);
					count++;
				} else {
					sumMap.put(sum, sumMap.get(sum) + 1);
					
					if(sumMap.get(sum) == 2) {	// 처음 중복되었을 경우 count 감소
						count--;
					}
				}
			}
		}
	}
}

 

새로운 값이 들어갈 때마다 count가 + 1씩 된다면, 유일한 값이 카운트되는 것이 아니기 때문에

값(Value)이 2가 되었을 경우 (즉, 처음 중복되었다는 것을 확인할 경우)

count - 1을 해줄 수 있도록 하였습니다.

 

<최종 소스코드>

public class Main {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
        
		Scanner sc = new Scanner(System.in);
		for(int i = 1; i <= 6; i++) {
			System.out.print(i + "번째 정수 입력 > ");
			list.add(sc.nextInt());
		}
        
		Map<Integer, Integer> sumMap = new HashMap<>();
		int count = 0;
        
		for(int i = 0; i < list.size() - 1; i++) {
			for(int j = i + 1; j < list.size(); j++) {
				Integer sum = list.get(i) + list.get(j);
				
				if(!sumMap.containsKey(sum)) {
					sumMap.put(sum, 1);
					count++;
				} else {
					sumMap.put(sum, sumMap.get(sum) + 1);
					
					if(sumMap.get(sum) == 2) {
						count--;
					}
				}
			}
		}
		System.out.println("두 수의 합과 개수 : " + sumMap);
		System.out.println("두 수의 합이 유일한 값이 되는 개수 : " + count);
	}
}
<결과>
1번째 정수 입력 > 1
2번째 정수 입력 > 2
3번째 정수 입력 > 3
4번째 정수 입력 > 4
5번째 정수 입력 > 5
6번째 정수 입력 > 6
두 수의 합과 개수 : {3=1, 4=1, 5=2, 6=2, 7=3, 8=2, 9=2, 10=1, 11=1}
두 수의 합이 유일한 값이 되는 개수 : 4

 

🪄 마무리

과제를 풀수록 컬렉션 프레임워크의 중요성을 크게 느끼는 것 같습니다.

꾸준히 문제를 풀어나가며, 컬렉션 프레임워크를 자유자재로 사용할 수 있는 개발자가 되도록 하겠습니다.

감사합니다 🪄