백준 문제풀이

[BOJ Java] 백준 24465번: 데뷔의 꿈

audxkawjd17 2026. 1. 18. 20:14

 📚 문제

[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]);
			}
		}
	}
}