🌞Algorithm/🔥Baekjoon

[Baekjoon] 19637_IF문 좀 대신 써줘

뿌야._. 2024. 1. 30. 21:46

Silver III

문제(출처: https://www.acmicpc.net/problem/19637)

< IF문 좀 대신 써줘 >

 

문제 풀이 

 

이분탐색을 사용하여 문제를 해결했다.

 

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class _19637_ { // IF문 좀 대신 써줘
	static String name[];
	static int value[];

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(bf.readLine());

		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());

		name = new String[n];
		value = new int[n];

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(bf.readLine());

			name[i] = st.nextToken();
			value[i] = Integer.parseInt(st.nextToken());
		}

		for (int i = 0; i < m; i++) {
			int num = Integer.parseInt(bf.readLine());
			int result = search(num, 0, n - 1);
			bw.write(name[result] + "\n");
		}
		bw.flush();
	}

	private static int search(int num, int start, int end) {
		if (start > end) {
			return -1;
		}

		int mid = (start + end) / 2;

		if (value[mid] < num) {
			if (value[mid + 1] >= num) {
				return mid + 1;
			}
			return search(num, mid + 1, end);
		} else if (value[mid] >= num) {
			if (mid == 0) {
				return 0;
			}
			if (value[mid - 1] < num) {
				return mid;
			}
			return search(num, start, mid - 1);
		}
		return -1;
	}
}
변수)
n, m : 칭호의 개수, 캐릭터들의 개수
name, value : 칭호의 이름, 칭호의 전투력
num : 캐릭터의 전투력
result : 전투력에 맞는 칭호의 인덱스

 

칭호의 개수와 칭호를 출력해야 하는 캐릭터들의 개수를 입력받는다.

n개의 줄에 칭호의 이름과 칭호의 전투력을 입력받아 각 배열에 값을 저장한다.

m개의 줄에 캐릭터의 전투력을 입력받아 search 함수를 호출한 후 얻은 전투력에 맞는 칭호의 인덱스를 사용하여 칭호를 출력한다.

 

search (캐릭터의 전투력, start, end )

start 값이 end 값보다 크면 조건에 맞지 않으므로 종료

중간 인덱스 값을 start와 end를 합하여 2로 나눈 값으로 구한다.

 

중앙값 < 캐릭터의 전투력인 경우

: 중앙값과 다음 값 구간에 해당하는 값이라면 중앙값+1 인덱스 반환

: 중앙값을 기준으로 오른쪽 데이터셋을 선택한다.

 

중앙값 >= 캐릭터의 전투력인 경우

: 중앙값이 0이라면 0 인덱스 반환

: 중앙값과 그전 값 구간에 해당하는 값이라면 중앙값 인덱스 반환

: 중앙값을 기준으로 왼쪽 데이터셋을 선택한다.

 

모든 경우에 해당하지 않는다면 종료


사실 이 문제는 이렇게 해결하는 것이 맞는지 모르겠다! 🫣

 


 

'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글

[Baekjoon] 11967_불켜기  (0) 2024.02.01
[Baekjoon] 8892_팰린드롬  (1) 2024.01.31
[Baekjoon] 10431_줄세우기  (1) 2024.01.29
[Baekjoon] 2865_나는 위대한 슈퍼스타K  (0) 2024.01.26
[Baekjoon] 2799_블라인드  (1) 2024.01.25