본문 바로가기
알고리즘 문제풀이 입문: 코딩테스트 대비/섹션 6. Sorting, Searching(정렬, 이분검색과 결정)

중복 확인

by _비니_ 2024. 4. 19.

설명

현수네 반에는 N명의 학생들이 있습니다.

선생님은 반 학생들에게 1부터 10,000,000까지의 자연수 중에서 각자가 좋아하는 숫자 하나 적어 내라고 했습니다.

만약 N명의 학생들이 적어낸 숫자 중 중복된 숫자가 존재하면 D(duplication)를 출력하고,

N명이 모두 각자 다른 숫자를 적어냈다면 U(unique)를 출력하는 프로그램을 작성하세요.

 

입력

첫 번째 줄에 자연수 N(5<=N<=100,000)이 주어진다.

두 번째 줄에 학생들이 적어 낸 N개의 자연수가 입력된다.

 

출력

첫 번째 줄에 D 또는 U를 출력한다.

 

예시 입력 1 

8
20 25 52 30 39 33 43 33

 

예시 출력 1

D

 

 

문제 해결

 

학생들이 입력해서 낸 숫자 중 중복이 존재하면 'D'를 출력하고, 다 다른 숫자이면 'U'를 출력하는 문제이다.

 

처음에는 문제를 HashSet으로 접근해 풀었다. (HashSet은 중복을 허용하지 않기 때문)

Integer 형의 HashSet을 만들어주고, 유일한지 여부를 나타내는 boolean 타입의 변수 isUnique를 true로 초기화 시켜줬다.

HashSet<Integer> num = new HashSet<>();
boolean isUnique = true;

 

 

숫자들을 하나씩 입력받으며 HashSet에 추가하고, 만약 이미 HashSet에 해당 숫자가 존재한다면 isUnique를 false로 만들어주고 반복문을 빠져나온다.

for(int i = 0; i < N; i++) {
    int inputNum = in.nextInt();
    if(!num.add(inputNum)){
        isUnique = false;
        break;
    }
}

 

 

isUniquetrue이면 'U'를 아니면 'D'를 출력해주면 된다.

 

Int형 배열을 사용해 풀으라는 이야기가 나왔기에 코드를 조금 변형해보았다.

Int형 배열 num을 만들어주고 isUnique 변수는 똑같이 두었다.

N만큼 for문을 돌며 num 배열에 숫자들을 저장해준 후 배열을 Arrays.sort 함수를 통해 정렬해준다.

이렇게 정렬이 되었으면 이제 현재 원소와 이전 원소만을 비교해주면 된다.

Scanner in = new Scanner(System.in);
int N = in.nextInt();
int num[] = new int[N];
boolean isUnique = true;

for(int i = 0; i < N; i++){
    num[i] = in.nextInt();
}
Arrays.sort(num);

 

 

이제 N만큼 돌며 num의 i번째 값과 i-1번째 값을 비교하며 만약 값이 같으면 isUnique 값을 false로 바꿔준 후 반복문을 빠져나온다.

for(int i = 1; i < N; i++) {
    if (num[i] == num[i - 1]) {
        isUnique = false;
        break;
    }
}

 

 

최종 코드

 

< HashSet >

import java.util.HashSet;
import java.util.Scanner;

public class P05_중복확인 {
    public static void main(String[] args) {
        // 중복이 존재하면 D 출력, 다 다르면 U 출력

        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        HashSet<Integer> num = new HashSet<>();
        boolean isUnique = true;

        for(int i = 0; i < N; i++) {
            int inputNum = in.nextInt();
            if(!num.add(inputNum)){
                isUnique = false;
                break;
            }
        }
        if(isUnique)
            System.out.println("U");
        else
            System.out.println("D");
    }
}

 

< Int형 배열 >

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;

public class P05_중복확인 {
    public static void main(String[] args) {
        // 중복이 존재하면 D 출력, 다 다르면 U 출력

        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int num[] = new int[N];
        boolean isUnique = true;

        for(int i = 0; i < N; i++){
            num[i] = in.nextInt();
        }
        Arrays.sort(num);

        for(int i = 1; i < N; i++) {
            if (num[i] == num[i - 1]) {
                isUnique = false;
                break;
            }
        }

        if(isUnique)
            System.out.println("U");
        else
            System.out.println("D");
    }
}

 

반응형