[Java] 백준 문제 3052 - 나머지
백준 단계별 문제에서 배열에 관한 문제이다.
전체 소스코드
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 10개의 수를 입력 받는다.: 길이 10
int ar[] = new int [10];
// 나머지 값을 저장할 array : 길이 10
int remain[] = new int [10];
int b = 42;
int count = 1; // 서로 다른 수 카운트
// 입력과 동시에 나머지 저장
for (int i = 0; i < 10; i++ ) {
ar[i] = sc.nextInt();
remain[i] = ar[i] % b;
}
// 정렬
Arrays.sort(remain);
for (int j = 0; j < ar.length - 1; j++)
if (remain[j] != remain[j+1]) count ++;
System.out.println(count);
sc.close();
}
}
알고리즘은 직접 풀어보는 것이 좋고, 나중에 다른 사람이 푼 것도 보면 도움이 많이 된다.
내가 푼 방식은 다음과 같다.
코드 설명
Scanner sc = new Scanner(System.in);
// 10개의 수를 입력 받는다.: 길이 10
int ar[] = new int [10];
// 나머지 값을 저장할 array : 길이 10
int remain[] = new int [10];
int b = 42;
int count = 1; // 서로 다른 수 카운트
자바에서 키보드 입력을 받을 때 사용하는 클래스는 Scanner, BufferedReader가 있다. BufferedReader가 속도가 더 빠르다고 하지만, 간단한 문제에서는 문제되지 않고 큰 차이가 없기 때문에 코드를 더 간소화해서 볼 수 있는 Scanner 클래스를 사용했다.
입력받을 10개의 정수를 저장할 배열 int [] ar = new int [10]; 를 선언하고, 나머지를 저장할 int [] remain = new int [10]; 배열을 선언한다. 나머지를 구할 나눗셈 대상인 B도 세팅하고, 나머지에서 서로 다른 수를 count할 변수 count도 선언한다.
// 입력과 동시에 나머지 저장
for (int i = 0; i < 10; i++ ) {
ar[i] = sc.nextInt();
remain[i] = ar[i] % b;
}
반복문을 사용해 입력받음과 동시에 나머지를 구해 remain에 저장한다.
반복문의 조건문 숫자 10은 ar.length 등으로 대체될 수 있다.
// 정렬
Arrays.sort(remain);
다른 수를 비교하여 찾기 위해 나머지 값을 담은 배열을 정렬한다. 정렬을 하여 같은 숫자는 바로 옆에 오도록 하며 갈수록 큰 수를 나타내어 비교를 쉽게 하기 위함이다.
5, 10, 2, 13, ... 이와 같이 정렬되지 않은 수의 비교는 쉽지 않은데, 0, 1, 2, 2, 3, ... 과 같이 정렬된 배열은 앞에서 부터 비교를 하면 다른 수를 찾기가 쉽다. 무조건 숫자 하나는 있으므로 count는 1로 세팅해두었다.
위 예시로 비교해보자.
첫 번째 숫자 0, 두 번째 숫자 1의 비교 시 다른 숫자 이므로 count를 증가시킨다. (count = 2)
두 번째 숫자 1, 세 번째 숫자 2의 비교 시 다른 숫자 이므로 count를 증가시킨다. (count = 3)
세 번째 숫자 2, 네 번째 숫자 2의 비교 시 같은 숫자 이므로 count를 증가시키지 않는다. (count = 3)
네 번째 숫자 2, 다섯 번째 숫자 3의 비교 시 다른 숫자 이므로 count를 증가시킨다. (count = 4)
실제로 다른 숫자는 0, 1, 2, 3 으로 4개이다. count도 4이다.
이를 코드로 보면 다음과 같다.
for (int j = 0; j < ar.length - 1; j++)
if (remain[j] != remain[j+1]) count ++;
System.out.println(count);
sc.close();
반복문을 통해 다른 숫자인 경우에 count를 증가 시킨다. 그리고 count를 출력하고, Scanner 클래스를 소멸시킨다.
지적, 조언은 언제나 환영입니다. 도움이 되셨다면 좋아요 꾹! 저에게 큰 힘이 된답니다!!
'Algorithm' 카테고리의 다른 글
[Java] 백문 문제 8958 - OX퀴즈 (0) | 2022.04.23 |
---|---|
[Java] 백준 문제 1546 평균 (0) | 2022.04.23 |
[Java] 백준 문제 2577 숫자의 개수 (0) | 2022.04.21 |
[Java] 백준 문제 2562 최댓값 (0) | 2022.04.20 |
[Java] 백준 10818 최소, 최대 (0) | 2022.04.19 |