728x90
본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.
문의는 댓글 바람.
문제 출처 : https://www.acmicpc.net/problem/status/16204/1002/1
[문제 설명]
[접근 방법]
M==K이면 양면이 O인 경우 + 양면이 X인 경우 => M + (N-M) => N이 최댓값
M > K이면 K + (N-M)
M < K이면 M + (N-K)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N;
static int M;
static int K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] inputs = br.readLine().split(" ");
// 전체 개수
N = Integer.parseInt(inputs[0]);
// 앞면이 O인 카드
M = Integer.parseInt(inputs[1]);
// 뒷면이 X인 카드
K = Integer.parseInt(inputs[2]);
// 양면이 O인 카드
int numOfBothCircleCard = Math.min(M,K);
// 양면이 X인 카드
int numOfBothCrossCard = Math.max(M,K);
// 양면이 같은 카드
System.out.println(numOfBothCircleCard + (N-numOfBothCrossCard));
}
}
[내 답안 수정하기]
양면이 O인 경우는 무조건 M과 K중에 최솟값이다.
M > K이면 양면이 X인 경우는 N-M이고, M < K이면 양면이 X인 경우는 N-K이다.
M > K인 경우
M과 K는 둘다 양수라는 조건이 있으므로 N-M < N-K이다.
M < K인 경우
마찬가지로 N-K < N-M이다.
즉, M과 K중에서 작은 수가 무조건 O의 최대 개수이고, N-K와 N-M 중 작은 수가 X의 개수가 된다.
[수정 코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N;
static int M;
static int K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] inputs = br.readLine().split(" ");
// 전체 개수
N = Integer.parseInt(inputs[0]);
// 앞면이 O인 카드
M = Integer.parseInt(inputs[1]);
// 뒷면이 X인 카드
K = Integer.parseInt(inputs[2]);
// 양면이 O인 카드
int numOfBothCircleCard = Math.min(M,K);
// 양면이 X인 카드
int numOfBothCrossCard = Math.min(N-M,N-K);
// 양면이 같은 카드
System.out.println(numOfBothCircleCard + numOfBothCrossCard);
}
}
[답지를 참고한 코드]
다른 사람들 답을 보니 StringTokenizer를 사용하면 굉장히 간단하게 입력을 받을 수 있었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int M;
static int K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
// 전체 개수
int N = Integer.parseInt(st.nextToken());
// 앞면이 O인 카드
int M = Integer.parseInt(st.nextToken());
// 뒷면이 X인 카드
int K = Integer.parseInt(st.nextToken());
// 양면이 O인 카드
int numOfBothCircleCard = Math.min(M,K);
// 양면이 X인 카드
int numOfBothCrossCard = Math.min(N-M,N-K);
// 양면이 같은 카드
System.out.println(numOfBothCircleCard + numOfBothCrossCard);
}
}
728x90
반응형
'알고리즘 문제 풀이 > 구현' 카테고리의 다른 글
백준 - 기상캐스터 (0) | 2022.01.30 |
---|---|
백준 - 경비원 (0) | 2022.01.17 |
백준 - 수강신청 (0) | 2022.01.09 |
백준 - 송이의 카드 게임 (0) | 2021.12.30 |
백준 - 와글와글 숭고한 (0) | 2021.12.28 |