일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준
- 최단 경로
- 배열
- C언어
- php 프로그래밍 입문 예제
- 페이코 추천인코드
- C
- spring
- php 프로그래밍
- 파이썬
- 스프링
- php
- php 프로그래밍 입문 솔루션
- 한정 분기
- 페이코 친구코드
- 플러터
- 자바
- JAVA SPRING
- 페이코 추천인
- Flutter
- php 프로그래밍 입문 문제풀이
- php 프로그래밍 입문
- SWEA
- php 프로그래밍 입문 연습문제
- programmers
- Java
- 페이코 초대코드
- 자바 스프링
- php 프로그래밍 입문 3판
- 플러터 개발환경 설정
Archives
- Today
- Total
11-07 11:40
ImJay
[BOJ/Java] 6987. 월드컵 본문
반응형
[BOJ/Java] 6987. 월드컵
풀이
package edu.ssafy.im.BOJ.Gold.G4.No6987;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
int arr[][], match[][];
int ans;
public static void main(String[] args) throws IOException {
new Main().sol();
}
private void sol() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 네 가지 결과에 대해 반복
for (int t = 0; t < 4; t++) {
String input = br.readLine(); // 입력을 한 줄 읽음
StringTokenizer st = new StringTokenizer(input); // 공백을 기준으로 문자열을 분리하여 StringTokenizer 생성
arr = new int[6][3]; // 6개국의 승, 무승부, 패의 수를 저장할 배열 생성
ans = 1; // 결과 초기값을 1로 설정 (가능한 결과로 가정)
// 각 나라의 승, 무승부, 패의 수 입력 받기
for (int i = 0; i < 6; i++) {
int sum = 0; // 각 나라의 승, 무승부, 패의 합을 저장할 변수 초기화
for (int j = 0; j < 3; j++) {
arr[i][j] = Integer.parseInt(st.nextToken()); // 문자열을 정수로 변환하여 배열에 저장
sum += arr[i][j]; // 승, 무승부, 패의 수를 합하여 sum에 저장
// 1. 승, 무, 패가 5보다 큰 경우
if (arr[i][j] > 5) {
ans = 0; // 불가능한 결과로 판정
break; // 반복문 종료
}
}
// 2. 승, 무, 패의 합이 5가 아닌 경우
if (sum != 5) {
ans = 0; // 불가능한 결과로 판정
break; // 반복문 종료
}
}
if (ans == 1) { // 가능한 결과인 경우
Arrays.sort(arr, (o1, o2) -> o2[0] - o1[0]); // 각 나라를 승수가 많은 순서로 정렬
// 팀 매칭
int idx = 0;
match = new int[15][2]; // 팀 매칭 결과를 저장할 배열 생성
for (int i = 0; i < 5; i++) {
for (int j = i + 1; j < 6; j++) {
match[idx][0] = i;
match[idx][1] = j;
idx++;
}
}
ans = 0; // 초기값을 불가능한 결과로 설정
recursive(0); // 재귀 함수 호출하여 가능한 결과인지 판별
}
sb.append(ans).append(" "); // 결과를 StringBuilder에 추가
}
System.out.print(sb); // 결과 출력
}
// 가능한 결과를 판별하는 재귀 함수
private void recursive(int matchCount) {
// basis part
if (ans == 1) { // 이미 가능한 결과가 판별된 경우
return; // 함수 종료
}
if (matchCount == 15) { // 모든 경기가 종료된 경우
ans = 1; // 가능한 결과로 판정
return; // 함수 종료
}
// inductive part
int i = match[matchCount][0]; // 현재 경기에서 우리팀의 인덱스
int j = match[matchCount][1]; // 현재 경기에서 상대팀의 인덱스
// 우리팀 승, 상대팀 패
if (arr[i][0] > 0 && arr[j][2] > 0) { // 우리팀이 이기고 상대팀이 지는 경우
arr[i][0]--; // 우리팀의 승수 감소
arr[j][2]--; // 상대팀의 패수 감소
recursive(matchCount + 1); // 다음 경기로 이동하여 재귀 호출
arr[i][0]++; // 우리팀의 승수 원상복구
arr[j][2]++; // 상대팀의 패수 원상복구
}
// 우리팀 무, 상대팀 무
if (arr[i][1] > 0 && arr[j][1] > 0) { // 우리팀과 상대팀이 비기는 경우
arr[i][1]--; // 우리팀의 무승부 수 감소
arr[j][1]--; // 상대팀의 무승부 수 감소
recursive(matchCount + 1); // 다음 경기로 이동하여 재귀 호출
arr[i][1]++; // 우리팀의 무승부 수 원상복구
arr[j][1]++; // 상대팀의 무승부 수 원상복구
}
// 우리팀 패, 상대팀 승
if (arr[i][2] > 0 && arr[j][0] > 0) { // 우리팀이 지고 상대팀이 이기는 경우
arr[i][2]--; // 우리팀의 패수 감소
arr[j][0]--; // 상대팀의 승수 감소
recursive(matchCount + 1); // 다음 경기로 이동하여 재귀 호출
arr[i][2]++; // 우리팀의 패수 원상복구
arr[j][0]++; // 상대팀의 승수 원상복구
}
}
}
반응형
'알고리즘 > BOJ - Java' 카테고리의 다른 글
[BOJ/Java] 16987. 계란으로 계란치기 (0) | 2024.02.04 |
---|---|
[BOJ/Java] 2164. 카드 2 (0) | 2024.02.04 |
[BOJ/Java] 2493. 탑 (0) | 2024.02.04 |
[BOJ/Java] 16943. 숫자 재배치 (0) | 2024.02.04 |
[BOJ/Java] 3040. 백설 공주와 일곱 난쟁이 (0) | 2024.02.04 |
Comments