📚 문제
[BOJ Java] 백준 24465번: 데뷔의 꿈
https://www.acmicpc.net/problem/24465

📝 입력 및 출력

🔎 문제 풀이
- 먼저 기존 멤버 7명의 생일을 입력받고, 어느 별자리인지 체크한다. check 함수를 따로 만들어 활용하였고, star 배열에 유무를 저장하였다.
- 오디션 지원자 수 N을 입력받고, N개의 줄에서 지원자들의 생일을 입력받을 때마다 어느 별자리인지 체크하고, 기존 멤버와 겹치지 않는 별자리인 경우에만 생월, 생일을 int 배열로 List에 저장한다.
- Collections.sort()로 생월을 기준으로 정렬하고, 생월이 같은 경우에는 람다식을 활용하여 생일을 기준으로 리스트를 정렬한다. 아래에서 람다식에 대한 설명을 좀 더 자세히 하겠다.
- 리스트가 비어있는 경우는 합격자가 한 명도 없다는 뜻이므로 "ALL FAILED"를 출력하고, 아닌 경우에는 정렬된 값을 순서대로 출력한다.
람다식이란?
함수를 간단한 하나의 식으로 표현한 것이다. 클래스, 객체를 만들지 않고 이름 없는 함수를 만들어 바로 전달할 수 있다.
1. 람다식의 기본 구조
(매개변수) → { 실행문 }
매개변수: 함수에 전달되는 값.
화살표: 매개변수를 이용해 다음의 실행문을 수행한다는 의미.
실행문: 실제로 수행할 코드. 결과값을 return 할 수 있음.
2. 람다식 설명
list.sort((a, b) -> {
if (a[0] == b[0])
return a[1] - b[1];
return a[0] - b[0];
});
- (a, b)는 리스트에서 꺼낸 두 값을 의미한다. sort()는 두 값을 꺼내 비교하고, 크기에 따라 위치를 바꾸는 함수로, 비교 대상이 되는 두 값이 a, b이다.
- 정렬 메소드는 음수가 return 되면 a가 앞이라고 판단하고(순서 유지), 양수면 b가 앞이라고 판단한다(순서 변경). 예를 들어, a[1]=10, b[1]=20이면, 10-20=-10이므로 a가 앞으로 간다. (오름차순으로 정렬하는 경우)
- 내림차순으로 정렬하고 싶으면 return 부분에서 a와 b의 자리를 바꾸면 된다. (return b[1]-a[1]; 와 같이)
+) C++로만 알고리즘 문제 풀이를 하다가 최근 Java로도 병행하며 풀어보고 있다. 남들은 C에서 Java로 넘어가는건 어렵지 않다던데 왜 난 이렇게 어려운지 .... 자바를 안 쓴 지 너무 오래되어서 그런 것 같기도 하다....ㅠ
- 하나 더 추가하자면 처음에 System.out.println(i[0] + ' ' + i[1]);로 출력했다가 웬 이상한 숫자만 하나 출력되어서 잠시 헤맬뻔했다. " "로 바꾸니 해결되어서 그냥 제출하긴 했지만 .. 정확한 원인을 찾아보았다.
- ' '는 char 타입이라 아스키 코드로 바뀌어 int랑 더하기 연산이 그냥 이루어진다고 한다. 반면, " "는 String 타입이므로 문자열 연결 연산이 이루어져 내가 원하던 출력 형태로 나타낼 수 있는 것이다.
⌨️ Java 코드
더보기
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
class Main {
static int check(int mon, int day) {
if (mon == 1) {
if (day <= 19)
return 11;
else
return 0;
} else if (mon == 2) {
if (day <= 18)
return 0;
else
return 1;
} else if (mon == 3) {
if (day <= 20)
return 1;
else
return 2;
} else if (mon == 4) {
if (day <= 19)
return 2;
else
return 3;
} else if (mon == 5) {
if (day <= 20)
return 3;
else
return 4;
} else if (mon == 6) {
if (day <= 21)
return 4;
else
return 5;
} else if (mon == 7) {
if (day <= 22)
return 5;
else
return 6;
} else if (mon == 8) {
if (day <= 22)
return 6;
else
return 7;
} else if (mon == 9) {
if (day <= 22)
return 7;
else
return 8;
} else if (mon == 10) {
if (day <= 22)
return 8;
else
return 9;
} else if (mon == 11) {
if (day <= 22)
return 9;
else
return 10;
} else {
if (day <= 21)
return 10;
else
return 11;
}
}
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int[] star = new int[12];
for (int i = 0; i < 7; i++) {
st = new StringTokenizer(br.readLine());
int mon = Integer.parseInt(st.nextToken()), day = Integer.parseInt(st.nextToken());
int mem = check(mon, day);
star[mem] = 1;
}
int n = Integer.parseInt(br.readLine());
List<int[]> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
int mon = Integer.parseInt(st.nextToken()), day = Integer.parseInt(st.nextToken());
int pass = check(mon, day);
if (star[pass] == 0)
list.add(new int[] { mon, day });
}
list.sort((a, b) -> {
if (a[0] == b[0])
return a[1] - b[1];
return a[0] - b[0];
});
if (list.isEmpty())
System.out.println("ALL FAILED");
else {
for (int[] i : list) {
System.out.println(i[0] + " " + i[1]);
}
}
}
}
'백준 문제풀이' 카테고리의 다른 글
| [BOJ Java] 백준 4179번: 불! (0) | 2026.03.07 |
|---|---|
| [BOJ Java] 백준 2170번: 선 긋기 (0) | 2026.02.04 |
| [BOJ C++] 백준 10914번: Veni, vidi, vici (0) | 2025.12.22 |
| [BOJ C++] 백준 1916번: 최소비용 구하기 (0) | 2025.12.20 |
| [BOJ C++] 백준 30805번: 사전 순 최대 공통 부분 수열 (0) | 2025.11.12 |