console.log

[BOJ] 17281 ⚾ JAVA 본문

알고리즘/백준

[BOJ] 17281 ⚾ JAVA

foresight 2023. 10. 3. 13:19

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

 

17281번: ⚾

⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종

www.acmicpc.net

 

메모리 : 78380 kb
실행시간 : 544 ms

 

문제분석

순열 + 완전탐색 + 시뮬레이션

 

걸린시간

1시간 ⏱️

 

풀이방법

1. 1번은 1로 고정해 놓고 2번부터 타순 순열로 뽑아내기 (모든 순서를 정한 뒤에는 4번과 1번 스왑)
2. 이닝 별로 out 카운트, 전체 이닝에 대해 score카운트 하며 게임 진행

 

포인트

1번 선수가 4번 차례 고정인 것을 헷갈리지 말자...
저는 4번 선수가 1번 차례 고정인 줄 알고 시간낭비 엄청 했습니다 ... ^^...

 

코드

package study.day0818;

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

public class BOJ_17281_야구 {	// 메모리 : 78380 kb	실행시간 : 544 ms
	static int[][] map;
	static int[] hit = new int[10];
	static int N;
	static int ans = 0;
	public static void main(String[] args) throws NumberFormatException, IOException {
		 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		 N = Integer.parseInt(br.readLine());
		 map = new int[N][10];
		 boolean[] isSelected = new boolean[10];
		 for (int i = 0; i < N; i++) {
			 String[] temp = br.readLine().split(" ");
			for (int j = 1; j < 10; j++) {
				map[i][j] = Integer.parseInt(temp[j - 1]);
			}
		 }
		 hit[1] = 1;
		 isSelected[1] = true;
		 hitter(2, isSelected);
		 System.out.println(ans);
	}
	private static void hitter(int r, boolean[] isSelected) {   // 타순 순열로 뽑아내기
		if(r == 10) {   // 4번과 1번을 스왑
			int temp = hit[1];
			hit[1] = hit[4];
			hit[4] = temp;
			ans = Math.max(ans, play());
			temp = hit[4];
			hit[4] = hit[1];
			hit[1] = temp;
			return;
		}
		for (int i = 2; i < 10; i++) {
			if(isSelected[i]) continue;
			hit[r] = i;
			isSelected[i] = true;
			hitter(r + 1, isSelected);
			isSelected[i] = false;
 		}
	}
	private static int play() { // 게임 진행
		int[] ground;
		int out;
		int score = 0;
		int idx = 1;
		for (int i = 0; i < N; i++) {   // N번의 이닝
			ground = new int[4];
			out = 0;
			while(out < 3) {    // 한 이닝에서 3아웃이 생기면 다음 이닝으로 변경
				if(idx == 10) idx -= 9;
				if(map[i][hit[idx]] == 0) {
					out++;
				}else {
					for (int j = 3; j >= 1; j--) {  // 현재 타자의 결과에 따라 그라운드에 있는 선수 위치 옮기기
						if(ground[j] == 0) continue;
						if(j + map[i][hit[idx]] >= 4) {
							score++;
						}else {
							ground[j + map[i][hit[idx]]] = ground[j];
						}
						ground[j] = 0;
					}
					if(map[i][hit[idx]] == 4) score++;
					else ground[map[i][hit[idx]]] = hit[idx];
				}
				idx++;
			}
		}
		return score;
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ] 1238 파티 JAVA  (0) 2023.10.24
[BOJ] 1342 행운의 문자열 JAVA  (1) 2023.10.04
[BOJ] 17070 파이프 옮기기 1 JAVA  (2) 2023.10.02
[BOJ] 16637 괄호 추가하기 JAVA  (0) 2023.10.01
[BOJ] 14891 톱니바퀴 JAVA  (0) 2023.09.25