[백준Java] 16204번 _ 카드뽑기

박주현·2023년 9월 11일
0

Baekjoon

목록 보기
14/24
post-thumbnail

https://www.acmicpc.net/problem/16204

1. 문제

앞 면에 O와 X가 적혀있는 카드 N개가 있다. N개의 카드 중 M개의 카드의 앞면에는 O가 한 개 적혀있고, 나머지 N-M개의 카드의 앞면에는 X가 한 개 적혀있다. 카드의 뒷 면은 두 종류의 카드 모두 같은 모양이라 구분할 수 없다.

카드의 뒷 면에 O나 X를 하나씩 적으려고 한다. 이 때, O는 K개, X는 N-K개 적으려고 한다.

앞 면과 뒷 면에 같은 모양이 적혀있는 카드의 최대 개수를 구하는 프로그램을 작성하시오.

2. 입력

첫째 줄에 N, M, K가 주어진다. (1 ≤ N ≤ 1,000,000, 0 ≤ M, K ≤ N)

3. 출력

첫째 줄에 앞 면과 뒷 면에 같은 모양이 적혀있는 카드의 최대 개수를 출력한다.

4. 코드

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

public class Num16204 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        /*
            N은 카드의 수

            동그라미 )
            카드 앞면의 M개의 동그라미
            카드 뒷면의 K개의 동그라미
            -> 앞면, 뒷면의 동그라미가 겹칠 최대 경우의 수는 "두 수 중 작은수"

            엑스 )
            카드 앞면의 (N-M)개의 엑스
            카드 뒷면의 (N-K)개의 엑스
            -> 앞면, 뒷면의 엑스가 겹칠 최대 경우의 수는 "두 수 중 작은수"

            작은 수 구하기 문제 => Math.min 사용
         */
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        System.out.println(Math.min(M,K) + Math.min((N-M),(N-K)));
    }
}

5. 회고

문제를 보고나서, 주석으로 문제를 정리해보고 난 후,
if문을 사용해서 M개의 동그라미와 K개의 동그라미 갯수가 맞아떨어지는 경우를 구하려고 했던
나로서는 풀이를 보고 정말 터무니없는 발상이었던 것을 깨달았다

5. 학습한 내용

단순히 Math.min을 사용해서 두개를 더해주면 두 수 중 가장 작은수가 나온다는 것을 깨달았다.

profile
빌드업 막 시작하는 개발자

0개의 댓글