문제
- 두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
여러가지 풀이가 있을 수 있지만, 입력은 크게 두 가지 방법으로 나눠서 풀이를 진행해보았다.
먼저, Scanner를 이용한 방법이다.
package Step5;
import java.util.Arrays;
import java.util.Scanner;
public class Remainder {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); // Scanner 객체를 생성한다.
int[] remainder = new int[10]; // 입력받은 값의 나머지를 담을 배열을 생성한다.
int cnt = 0; // 서로 다른 나머지 숫자의 갯수 측정
boolean bl; // n번째와 n+1의 숫자 비교를 위한 boolean
for (int i=0; i<remainder.length; i++) {
remainder[i] = input.nextInt() % 42;
} // 배열의 길이만큼 반복문을 돌면서 10개의 값을 입력받음과 동시에 42를 나눈 나머지 값을 배열의 인덱스에 할당해준다.
for (int j=0; j<remainder.length; j++) {
bl = false; // 초기값을 false로 세팅해준다.
for(int k=j+1; k<remainder.length; k++) { // 첫번째 루프에서 0번째와 1번째의 값을 비교해서
if ( remainder[j] == remainder[k]){ // 그 값이 같다면
bl = true; // true로 boolean형을 바꾸고 for문을 빠져나온다.
break;
}
}
if( bl == false ) { // 하지만 값이 다르다면
cnt ++; // cnt를 1 증가시킨다.
}
}
System.out.println(cnt);
System.out.println(Arrays.toString(remainder));
}
}
다음은 Scanner보다 연산 속도가 빠른 BufferedReader를 이용한 방법이다.
package Step5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ImproveRemainder {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] remainder = new int[10];
boolean bl;
int cnt = 0;
for(int i=0; i<remainder.length; i++){
remainder[i] = Integer.parseInt(br.readLine()) % 42; // BufferedReader는 String형이기 때문에 Integer Parsing이 필요하다.
}
for(int j=0; j<10; j++){
bl = false;
for (int k=j+1; k<remainder.length; k++) {
if( remainder[j] == remainder[k] ){
bl = true;
break;
}
}
if ( bl == false ){
cnt ++;
}
}
System.out.println(cnt);
}
}
여러 코드들을 검색하다보니 HashSet을 이용한 방법도 있었다.
package Step5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
public class HashSetRemainder {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
HashSet<Integer> hs = new HashSet<Integer>();
for (int i = 0; i < 10; i++) {
hs.add(Integer.parseInt(br.readLine()) % 42);
//입력받은 값의 나머지 값을 add메소드를 통해 HashSet에 저장
}
br.close();
System.out.print(hs.size()); //HashSet의 값 출력
}
}
HashSet은 Collection중 Set의 파생클래스로, 몇가지 특징이 있다.
- 중복되는 원소를 넣을 경우 하나만 저장한다.(중복원소를 허용하지 않는다.)
- HashSet은 순서 개념이 없어서 정렬하는 기능인 Collection.sort()메소드를 사용할 수 없다.
(정렬하고 싶다면 리스트로 변환 후 정렬해야 한다.)
'Programming > Algorithm' 카테고리의 다른 글
[백준] 팩토리얼 (0) | 2021.10.28 |
---|---|
[백준] 2434번 : 별 찍기 - 1 (0) | 2021.10.27 |
[백준] 빠른 A+B (JAVA) (0) | 2021.10.20 |
선형 리스트 (Linear List) (0) | 2021.09.27 |
알고리즘의 개념 (0) | 2021.09.27 |