-
[네이버클라우드 캠프/3주차] 두 수의 합이 유일한 값의 개수 출력하기네이버클라우드 캠프 | BE/Java 과제 2023. 4. 13. 09:46728x90
3주 차에는 컬렉션 프레임워크를 주로 배운 만큼, 이를 활용한 과제가 많았습니다.
각 인터페이스가 아닌 List와 Map 두 가지를 모두 활용하여 주어진 문제를 풀어보도록 하겠습니다.
(컬렉션 프레임워크를 활용한 과제는 모두 새롭고, 인사이트를 얻게 되는 것 같습니다.)
❓문제 : 6개의 정수를 입력받아, 두 수의 합이 유일한 값이 되는 개수를 출력하세요.
이번 문제는 앞선 3주 차 과제 2개를 활용하여 풀이한 문제였습니다.
위의 글도 참고하시면서 아래 코드를 이해해 보시면 좋을 것 같습니다.
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🪄 마무리
과제를 풀수록 컬렉션 프레임워크의 중요성을 크게 느끼는 것 같습니다.
꾸준히 문제를 풀어나가며, 컬렉션 프레임워크를 자유자재로 사용할 수 있는 개발자가 되도록 하겠습니다.
감사합니다 🪄
'네이버클라우드 캠프 | BE > Java 과제' 카테고리의 다른 글
[네이버클라우드 캠프/3주차] 최소공배수와 최대공약수 출력하기 (0) 2023.04.14 [네이버클라우드 캠프/3주차] 소수 출력하기 (0) 2023.04.14 [네이버클라우드 캠프/3주차] 연속합이 가장 큰 두 수 구하기 (0) 2023.04.12 [네이버클라우드 캠프/3주차] 문자열 중 가장 많이 등장하는 문자 구하기 (0) 2023.04.12 [네이버클라우드 캠프/2주차] 재귀메서드 (feat. BigInteger) (0) 2023.04.12