문제 연습

선생님이 조회 시간에 출석부를 부르고 있습니다.

학생들의 번호를 호명하여 결석한 학생들을 알아내고 있습니다.

선생님은 실수로 몇 명의 번호를 다른 번호로 잘못 호명했습니다.

선생님은 학생들을 순서대로 호명할 필요는 없으며, 번호가 불리워진 학생은 제대로 호명했다고 가정합니다.

선생님이 호명한 숫자를 담은 배열 nums가 주어졌을 때, 선생님이 잘못 호명한 학생들의 원래 번호를 정수 배열로 순서대로 출력하는 프로그램을 작성하세요.

단, 출력 배열은 오름차순으로 정렬하여 반환하고, 반에는 학생이 1번부터 빈 번호 없이 num.length명이 있다고 가정하세요.


입력 형식

· nums : 선생님이 호명한 번호가 순서대로 적힌 정수 배열


출력 형식

· 선생님이 잘못 호명한 학생들의 원래 번호를 정수 배열로 반환


제약 사항

· 1 <= nums <= 100


입출력 예시

· 예시1

  · 입력

      · nums = {1, 2, 3, 4, 6, 6, 6}

  · 출력 : {5, 7}

  · 설명 : 5번 학생과 7번 학생을 6번으로 잘못 호명했다.

 

· 예시2

  · 입력

      · nums = {1, 3, 4, 8}

  · 출력 : {2}

  · 설명 : 2번 학생을 8번으로 잘못 호명했다.


정답 코드

import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

class Solution232 {
    public int[] solution(int[] nums) {
        // nums 배열을 Arrays.stream을 사용하여 IntStream으로 변환
        // IntStream : int 타입의 데이터를 손쉽게 다룰 수 있도록 다양한 메소드를 제공
        Set<Integer> numsSet = Arrays.stream(nums)
                .boxed()
                // boxed() : IntStream을 Stream<Integer>로 변환하는 메소드
                .collect(Collectors.toSet());
                // Stream 요소들을 Set으로 수집하는 메소드
                // Set은 중복을 허용하지 안흔 데이터 집합임

        // 1부터 nums 배열의 길이 + 1까지의 정수를 생성
        return IntStream.range(1, nums.length + 1)
                // 생성된 정수들 중에서, numSet에 포함되어 있지 않은 정수만 필터링
                .filter(i -> !numsSet.contains(i))
                .toArray();
    }

    public static void main(String[] args) {
        Solution232 st = new Solution232();
        int[] nums = {1, 2, 3, 4, 6, 6, 6};
        System.out.println(Arrays.toString(st.solution(nums)));
        int[] nums2 = {1, 3, 4, 8};
        System.out.println(Arrays.toString(st.solution(nums2)));
    }
}