728x90
1. 문제
1~18까지의 카드를 하나씩 내며 게임을 한다.
한 라운드에는 한 장씩 카드를 낸 다음 두 사람이 낸 카드에 적힌 수를 비교해서 점수를 계산한다.
이긴 사람이 두 카드의 합만큼 점수를 얻고, 진 사람은 아무 점수도 얻을 수 없다.
아홉라운드를 끝내고 총점을 따졌을 때, 총점이 더 높은 사람이 이기는 게임이다.
규영이가 낼 카드의 순서와 종류는 이미 정해져있을 때, 규영이가 이기는 경우와 지는 경우가 총 몇가지인지 구한다.
2. 풀이
메인함수
inputCards = 규영이 카드
isSelected = 1~18까지의 카드. 카드번호로 바로 접근하기 위해 19칸을 설정했다.
static int lose, win;
static boolean[] isSelected;
static int[] inputCards;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(in.readLine());
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= T; tc++) {
sb.append("#").append(tc).append(" ");
StringTokenizer st = new StringTokenizer(in.readLine());
lose = 0; win = 0;
inputCards = new int[9];
isSelected = new boolean[19];
for (int i = 0; i < 9; i++) {
inputCards[i] = Integer.parseInt(st.nextToken());
isSelected[inputCards[i]] = true;
}
pickCard(0, 0);
sb.append(win).append(" ").append(lose).append("\n");
}
System.out.print(sb);
}
카드를 뽑는 메서드
9장 뽑았다면 얻은 점수와 171(1+...+18)에서 점수를 뺀 값을 비교해서 승부를 판단한다.
1부터 18까지 반복하며 아직 뽑지 않은 수이고 규영이가 이겼다면, 점수에 두 카드의 값을 합산하여 재귀호출한다.
규영이가 졌다면 카운트만 하나 더한 뒤 재귀호출한다.
private static void pickCard(int cnt, int sumWin) {
if (cnt == 9) {
if (sumWin > 171 - sumWin) ++win;
else if (sumWin < 171 - sumWin) ++lose;
return;
}
for (int i = 1; i <= 18; i++) {
if (isSelected[i]) continue;
isSelected[i] = true;
if (inputCards[cnt] > i) pickCard(cnt + 1, sumWin + i + inputCards[cnt]);
else pickCard(cnt + 1, sumWin);
isSelected[i] = false;
}
}
3. 결과
'코딩테스트 > SWEA' 카테고리의 다른 글
[SWEA] 4012 요리사 - JAVA (0) | 2022.02.16 |
---|---|
[SWEA] 5644 무선충전 - JAVA (0) | 2022.02.16 |
[SWEA] 1233 사칙연산 유효성 검사 - JAVA (0) | 2022.02.11 |
[SWEA] 1210 Ladder1 - JAVA (0) | 2022.02.09 |
[SWEA] 1224 계산기3 - JAVA (0) | 2022.02.09 |
댓글