2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[백준 알고리즘 5597] - 과제 안내신분? 자바 (With Java)

2023. 8. 3. 20:50ㆍ백준 알고리즘

5597번: 과제 안 내신 분..? (acmicpc.net)

 

5597번: 과제 안 내신 분..?

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데,

www.acmicpc.net

 

 

 

 

 

 

 

 

 

[설명]

이 문제의 경우 1~30까지 번호가 있다면  이 번호 중 과제를 안낸 사람을 찾는 문제 입니다.

 

언뜻 보기엔 어려워 보입니다. 1~30까지 수 중에 없는 숫자를 찾아야 하니 어떤식으로 구현해야 할지 막막하죠

 

일단 두 가지의 방법이 존재 합니다.

 

 

1. Set Stream을 쓰는 경우.

 

2.배열과 반복문으로 사용하는 경우

 

1번의 경우 Set의 자료구조와 Stream 람다를 사용 한다면 아주 쉽게 풀 수 있는 문제입니다.

 

 

 

[Set Stream]

 

1번의 경우 단순하게 Set에 1~30까지 숫자를 전부 다 넣습니다.

Set의 경우 중복을 허용하지 않기 때문에

 

1~30까지 28개의 값 중 랜덤한 값이 들어오게 된다 하더라도 중복이 허용되지 않습니다.

그렇기 때문에 반복문과 contains로 이 입력값이 포함되어있다면 삭제 시키는 코드를 만들면 됩니다.

 

 

 

이렇게 첫번째 포문에서 1 ~ 30까지의 숫자를 전부 다 넣은 후

 

set.contain(b)로 중복된 값이 있는 경우 이 원소를 remove해버리면

 

2개의 값이 남게 됩니다.

 

물론 if문으로 찾아도 되지만 귀찮은 관계로 스트림람다로 min과 max의 값을 구해서 출력했습니다.

 

 

import java.util.*;

public class Main{

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        Set<Integer> set = new HashSet<>();

        for(int i=1; i<=30; i++){
            set.add(i);
        }
        for(int j=1; j<=28;j++){
            int b = sc.nextInt();
            if(set.contains(b)) set.remove(b);
        }
        int min =   set.stream().min(Integer :: compareTo).get();
        int max =   set.stream().max(Integer :: compareTo).get();
        System.out.println(min);
        System.out.println(max);
    }

}

 

 

스트림 람다의 코드 입니다.

 

 

[배열의 코드]

 

배열의 경우 조금 복잡할 수 있습니다.

각 원소를 하나씩 직접 건드려서 찾아야하니 여간 귀찮은 일이 아닐 수 없죠

 

 

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] array = new int[30];
        int min = 9999;
        int max = 0;

        for (int i = 1; i <= 30; i++) {
            array[i - 1] = i;
        }
        Arrays.sort(array);
        for (int j = 1; j <= 28; j++) {
            int b = sc.nextInt();

            for (int a = 1; a <= array.length; a++) {

                if (array[a - 1] == b) {
                    array[a - 1] = 0;
                    break;
                }
            }
        }


        for (int k = 0; k < array.length; k++) {

            if (array[k] != 0) {
                if (min > array[k]) min = array[k];
                if (min < array[k]) max = array[k];

            }



        }
        System.out.println(min);
        System.out.println(max);

    }
}

 

 

배열의 코드입니다.

 

일단 1~30까지 모든 상수를 다 채운 다음

 

하나하나 비교합니다. 

 

똑같은 값이 있으면 0으로 바꿉니다.

 

그러면 중복되지 않은 값 ) 예 2 , 8이 남게 되겠죠.

 

여기서 또 for문을 돌려서 작은 값은 min으로 큰 값은 max로

하면 끝이 납니다.

 

이 문제의 키 포인트는 1~30까지 정수를 다 넣어서

중복되는 값을 제거하면서 찾아가는게 키 포인트 입니다.