[백준/Java] 3052번 문제 해설 및 답안

이재윤·2024년 1월 4일

백준

목록 보기
4/25

백준 3052번 자바 풀이

문제는 백준 사이트와 똑같으니, 해설부터 보셔도 됩니다.

문제

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

출력

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

예제

입력
39
40
41
42
43
44
82
83
84
85

출력
6

풀이방법은 총 2가지입니다. 두 코드의 시간은 거의 비슷하게 측정되나 2번째 풀이의 코드가 더 간결합니다.

해설1

우선 for문을 사용하여 입력받은 수를 int타입 배열에 넣어줍니다. 넣어줄 때 입력받은 수에 % 42를 해줘서 코드를 줄여줍니다. 이후, 첫번째 for문만큼 반복하는 for문을 추가하여 배열에 추가될 때마다 배열 안에 있는 모든 요소를 한번씩 접근합니다. 이때, 본인은 제외하고 i번째 요소가 j번째랑 같으면 i번째 요소를 -1로 변경해줍니다. 그 이유는 % 연산자를 사용할 경우 음수가 절대 나올 수 없는 점을 이용하였습니다. 마지막으로 for each문에 if문을 사용하여 배열 안에 있는 모든 요소 중 -1이 있을 때마다 count를 1씩 더해줍니다.

  1. for문(i = 0 ~ 9)을 통해 int타입 배열에 입력받은 수의 % 42 값을 넣는다.
  2. 이후, for문(j = 0 ~ i)을 하나 더 사용하여 배열의 요소가 추가될 때마다 모든 요소에 접근한다.
  3. 본인 제외(i != j)하고 i번째 요소와 j번째 요소가 같으면 i번째 요소를 -1로 변경한다.
  4. for each문을 통하여 요소 중 -1이 있을 때마다 count를 1씩 더해준다.

답안1

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] arr = new int[10];
		int count = 0;
		
		for (int i = 0; i < arr.length; i++) {
			arr[i] = sc.nextInt() % 42;
			for (int j = 0; j <= i; j++) {
				if (i != j && arr[i] == arr[j]) arr[i] = -1;
			}
		}
		for (int i : arr) {
			if (i != -1) count++;
		}
		System.out.println(count);
	}

}

해설2

boolean타입의 배열을 42개 크기로 선언해줍니다. 10개의 수를 입력받기에 10번 반복하는 for문에 입력받은 수 % 42번째 인덱스의 값을 true로 변경해줍니다. 마지막으로 for each문에 if문을 사용하여 배열의 모든 요소 중 true인 값이 있을 때마다 count를 1씩 더해줍니다.

  1. boolean타입의 배열을 42개 크기로 선언
  2. 10번 반복하는 for문에 [입력받은 수 % 42]번째 인덱스의 값을 true 변경해준다.
  3. 본인 제외(i != j)하고 i번째 요소와 j번째 요소가 같으면 i번째 요소를 -1로 변경한다.
  4. for each문을 통하여 요소 중 true가 있을 때마다 count를 1씩 더해준다.

답안2

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		boolean[] arr = new boolean[42];
		int count = 0;
		
		for (int i = 0; i < 10; i++) {
			arr[sc.nextInt() % 42] = true;
		}
		for (boolean tf : arr) {
			if (tf) count++;
		}
		System.out.println(count);
	}

}
profile
부족한 점이 많습니다. 피드백은 환영입니다!

0개의 댓글