-
백준 3052번 : 나머지알고리즘, SQL/알고리즘 2023. 11. 28. 16:08
문제
두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다.
예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다.
그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
https://www.acmicpc.net/problem/3052
문제보고 별 생각 없이 이중for문 사용하면 될 것 같아서 사용했는데, 잘 안돼서 이것저것하다가 2시간 정도 해맸다...
이게 풀 수 있을 거 같은데 안돼서 이악물고 혼자 풀었다.
내 코드
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int[] arr = new int[10]; int[] res = new int [10]; for(int i=0; i<10; i++) { arr[i] = scan.nextInt(); } for(int i=0; i<arr.length; i++) { arr[i] = arr[i] % 42; //42로 나눈 것의 나머지로 arr 재정의 } for(int i=0; i<arr.length; i++) { //1:1비교를 통해서 같은 값이 있는지 확인 int count = 0; for(int j=i; j<arr.length; j++ ) { //이전에 비교했던 값 중복비교 방지를 위해 j를 i값에 맞춤 if(arr[i] == arr[j]) { ++count; res[i] = count; //배열에 저장하지 않고 직접 비교했어도 됐음(불필요 코드) } } } int count1 = 0; for(int i: res) { //(불필요 코드) if(i==1) { count1++; } } System.out.println(count1); } }
중첩 반복문을 사용해서 1:1 비교를 통해서 풀었다.
1:1로 비교할 때, 내부의 for문에서 값을 중복적으로 비교하는 것을 어떻게 처리해야할지에 대해 시간을 많이 썼다.
사실 이전에 풀었던 백준 1157번(단어 공부) 문제에서 알파벳을 배열로 만들어서 중첩 반복문을 사용안한 것 처럼 만들 수 있을것 같은데,,,라고 생각하다가 뇌용량이 부족해서 실패했었다.
그런데 검색해보니까 그렇게 푸신 분이 있었다.
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { boolean[] arr = new boolean[42]; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); for(int i = 0 ; i < 10 ; i++) { arr[Integer.parseInt(br.readLine()) % 42] = true; } int count = 0; for(boolean value : arr) { if(value){ // value 가 true 라면 count++; } } System.out.println(count); } }
나머지가 나올 수 있는 수(0~41)를 배열로 만들어서 중첩반복문을 사용하지 않고 문제를 풀었다.
그런데 다 풀고 검색해보니까 HashSet을 사용해서 간단하게 풀 수 있는 문제였다..
다른풀이
import java.util.Scanner; import java.util.HashSet; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); HashSet<Integer> h = new HashSet<Integer>(); for (int i = 0; i < 10; i++) { h.add(in.nextInt() % 42); //입력받은 값의 나머지 값을 add메소드를 통해 HashSet에 저장 } in.close(); System.out.print(h.size()); } }
에...? 이렇게 쉽게 푸는거라고,,?
중복원소를 허용하지 않는 HashSet을 사용하면 되는 것이었는데 몰라봤다.
문제에서 "서로 다른 값이 몇 개인가?" 라는 말이 "중복을 없앤 값이 몇 개인가?" 라는 뜻으로 HashSet을 사용하라는 뜻이었다.
HashSet에 대해 정리해야겠다..
아직 많이 부족함을 다시 느낀다ㅠ
참고자료
'알고리즘, SQL > 알고리즘' 카테고리의 다른 글
백준 7568번 : 덩치 (1) 2023.12.12 queue란 무엇인가? (0) 2023.12.10 백준 2164번 : 카드2 (0) 2023.12.06 HashSet이란? (0) 2023.12.02 백준 1157번 : 단어 공부 (2) 2023.11.27