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까지 정수를 다 넣어서
중복되는 값을 제거하면서 찾아가는게 키 포인트 입니다.
'백준 알고리즘' 카테고리의 다른 글
[백준 11659번] - 구간 합 구하기4 자바 [With Java] (0) | 2023.08.04 |
---|---|
[백준 10809] 알파벳 찾기 - 자바 [ With Java] (0) | 2023.08.04 |
[백준 알고리즘] 1546 - 평균 구하기 자바 - [With Java] (0) | 2023.08.03 |
[백준 알고리즘 ] 문제 번호 : 10807 [With Java 자바] (0) | 2023.08.01 |
[백준 2525번 ] 오븐 시계 -[JAVA 자바 ] (0) | 2023.07.31 |