[BOJ] ⚾ - 17281번

μ΄λ‚˜μ˜Β·2022λ…„ 1μ›” 18일
0

μ•Œκ³ λ¦¬μ¦˜

λͺ©λ‘ 보기
15/17
post-thumbnail

"⚾" - 17281번 G4

πŸŽƒλ¬Έμ œμ„€λͺ…

βšΎλŠ” 9λͺ…μœΌλ‘œ 이루어진 두 νŒ€μ΄ 곡격과 μˆ˜λΉ„λ₯Ό λ²ˆκ°ˆμ•„ ν•˜λŠ” κ²Œμž„μ΄λ‹€. ν•˜λ‚˜μ˜ 이닝은 곡격과 μˆ˜λΉ„λ‘œ 이루어져 있고, 총 N이닝 λ™μ•ˆ κ²Œμž„μ„ 진행해야 ν•œλ‹€. ν•œ 이닝에 3아웃이 λ°œμƒν•˜λ©΄ 이닝이 μ’…λ£Œλ˜κ³ , 두 νŒ€μ΄ 곡격과 μˆ˜λΉ„λ₯Ό μ„œλ‘œ λ°”κΎΌλ‹€.

두 νŒ€μ€ κ²½κΈ°κ°€ μ‹œμž‘ν•˜κΈ° μ „κΉŒμ§€ νƒ€μˆœ(νƒ€μžκ°€ 타석에 μ„œλŠ” μˆœμ„œ)을 μ •ν•΄μ•Ό ν•˜κ³ , κ²½κΈ° μ€‘μ—λŠ” νƒ€μˆœμ„ λ³€κ²½ν•  수 μ—†λ‹€. 9번 νƒ€μžκΉŒμ§€ 곡을 μ³€λŠ”λ° 3아웃이 λ°œμƒν•˜μ§€ μ•Šμ€ μƒνƒœλ©΄ 이닝은 λλ‚˜μ§€ μ•Šκ³ , 1번 νƒ€μžκ°€ λ‹€μ‹œ 타석에 μ„ λ‹€. νƒ€μˆœμ€ 이닝이 λ³€κ²½λ˜μ–΄λ„ μˆœμ„œλ₯Ό μœ μ§€ν•΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 2이닝에 6번 νƒ€μžκ°€ λ§ˆμ§€λ§‰ νƒ€μžμ˜€λ‹€λ©΄, 3이닝은 7번 νƒ€μžλΆ€ν„° 타석에 μ„ λ‹€.

곡격은 νˆ¬μˆ˜κ°€ λ˜μ§„ 곡을 타석에 μžˆλŠ” νƒ€μžκ°€ μΉ˜λŠ” 것이닀. 곡격 νŒ€μ˜ μ„ μˆ˜κ°€ 1루, 2루, 3루λ₯Ό κ±°μ³μ„œ ν™ˆμ— λ„μ°©ν•˜λ©΄ 1점을 λ“μ ν•œλ‹€. νƒ€μžκ°€ ν™ˆμ— λ„μ°©ν•˜μ§€ λͺ»ν•˜κ³  1루, 2루, 3루 쀑 ν•˜λ‚˜μ— λ¨Έλ¬ΌλŸ¬μžˆμ„ 수 μžˆλ‹€. 루에 μžˆλŠ” μ„ μˆ˜λ₯Ό 주자라고 ν•œλ‹€. 이닝이 μ‹œμž‘λ  λ•ŒλŠ” μ£ΌμžλŠ” μ—†λ‹€.

νƒ€μžκ°€ 곡을 μ³μ„œ 얻을 수 μžˆλŠ” κ²°κ³ΌλŠ” μ•ˆνƒ€, 2루타, 3루타, ν™ˆλŸ°, 아웃 쀑 ν•˜λ‚˜μ΄λ‹€. 각각이 λ°œμƒν–ˆμ„ λ•Œ, λ²Œμ–΄μ§€λŠ” 일은 λ‹€μŒκ³Ό κ°™λ‹€.

  • μ•ˆνƒ€: νƒ€μžμ™€ λͺ¨λ“  μ£Όμžκ°€ ν•œ 루씩 μ§„λ£¨ν•œλ‹€.
  • 2루타: νƒ€μžμ™€ λͺ¨λ“  μ£Όμžκ°€ 두 루씩 μ§„λ£¨ν•œλ‹€.
  • 3루타: νƒ€μžμ™€ λͺ¨λ“  μ£Όμžκ°€ μ„Έ 루씩 μ§„λ£¨ν•œλ‹€.
  • ν™ˆλŸ°: νƒ€μžμ™€ λͺ¨λ“  μ£Όμžκ°€ ν™ˆκΉŒμ§€ μ§„λ£¨ν•œλ‹€.
  • 아웃: λͺ¨λ“  μ£ΌμžλŠ” μ§„λ£¨ν•˜μ§€ λͺ»ν•˜κ³ , 곡격 νŒ€μ— 아웃이 ν•˜λ‚˜ μ¦κ°€ν•œλ‹€.

ν•œ μ•Όκ΅¬νŒ€μ˜ 감독 μ•„μΈνƒ€λŠ” νƒ€μˆœμ„ μ •ν•˜λ €κ³  ν•œλ‹€. 아인타 νŒ€μ˜ μ„ μˆ˜λŠ” 총 9λͺ…이 있고, 1λ²ˆλΆ€ν„° 9λ²ˆκΉŒμ§€ λ²ˆν˜Έκ°€ 맀겨져 μžˆλ‹€. μ•„μΈνƒ€λŠ” μžμ‹ μ΄ κ°€μž₯ μ’‹μ•„ν•˜λŠ” μ„ μˆ˜μΈ 1번 μ„ μˆ˜λ₯Ό 4번 νƒ€μžλ‘œ 미리 κ²°μ •ν–ˆλ‹€. 이제 λ‹€λ₯Έ μ„ μˆ˜μ˜ νƒ€μˆœμ„ λͺ¨λ‘ κ²°μ •ν•΄μ•Ό ν•œλ‹€. μ•„μΈνƒ€λŠ” 각 μ„ μˆ˜κ°€ 각 μ΄λ‹μ—μ„œ μ–΄λ–€ κ²°κ³Όλ₯Ό μ–»λŠ”μ§€ 미리 μ•Œκ³  μžˆλ‹€. κ°€μž₯ λ§Žμ€ 득점을 ν•˜λŠ” νƒ€μˆœμ„ μ°Ύκ³ , κ·Έ λ•Œμ˜ 득점을 κ΅¬ν•΄λ³΄μž.


μž…λ ₯

첫째 쀄에 이닝 수 N(2 ≀ N ≀ 50)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 μ„ μˆ˜κ°€ 각 μ΄λ‹μ—μ„œ μ–»λŠ” κ²°κ³Όκ°€ 1번 이닝뢀터 N번 μ΄λ‹κΉŒμ§€ μˆœμ„œλŒ€λ‘œ 주어진닀. μ΄λ‹μ—μ„œ μ–»λŠ” κ²°κ³ΌλŠ” 9개의 μ •μˆ˜κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€. 각 κ²°κ³Όκ°€ μ˜λ―Έν•˜λŠ” μ •μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • μ•ˆνƒ€: 1
  • 2루타: 2
  • 3루타: 3
  • ν™ˆλŸ°: 4
  • 아웃: 0

각 μ΄λ‹μ—λŠ” 아웃을 κΈ°λ‘ν•˜λŠ” νƒ€μžκ°€ 적어도 ν•œ λͺ… μ‘΄μž¬ν•œλ‹€.


좜λ ₯

μ•„μΈνƒ€νŒ€μ΄ 얻을 수 μžˆλŠ” μ΅œλŒ€ 점수λ₯Ό 좜λ ₯ν•œλ‹€.


πŸ’Ύμž…μΆœλ ₯ 예

μž…λ ₯좜λ ₯
2
4 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
1
2
4 0 0 0 1 1 1 0 0
0 0 0 0 0 0 0 0 0
4
2
0 4 4 4 4 4 4 4 4
0 4 4 4 4 4 4 4 4
43
2
4 3 2 1 0 4 3 2 1
1 2 3 4 1 2 3 4 0
46
9
4 4 4 4 4 4 4 4 0
4 4 4 4 4 4 4 4 0
4 4 4 4 4 4 4 4 0
4 4 4 4 4 4 4 4 0
4 4 4 4 4 4 4 4 0
4 4 4 4 4 4 4 4 0
4 4 4 4 4 4 4 4 0
4 4 4 4 4 4 4 4 0
4 4 4 4 4 4 4 4 0
216
9
1 2 4 3 0 2 1 0 3
1 2 1 2 0 0 0 0 1
3 4 2 3 1 2 3 4 0
0 1 2 3 4 2 1 0 0
0 0 0 0 0 0 1 4 4
0 4 0 4 0 4 0 4 0
0 4 2 2 2 2 2 2 2
1 1 1 1 1 1 1 1 0
0 2 0 3 0 1 0 2 0
89

μ•Œκ³ λ¦¬μ¦˜ λΆ„λ₯˜

  • κ΅¬ν˜„
  • 브루트포슀 μ•Œκ³ λ¦¬μ¦˜

κ°•μ˜λ‚΄μš©

βœ”οΈκ²Œμž„μ„ μ‹œμž‘ν•˜κΈ° 전에 νƒ€μˆœμ„ λͺ¨λ‘ κ²°μ •ν•œλ‹€. (단, 1λ²ˆμ„ μˆ˜λŠ” 4λ²ˆνƒ€μžλ‘œ κ³ μ •)
Β Β Β Β => 8!
βœ”οΈμ‹œκ°„λ³΅μž‘λ„ : (κ²Œμž„ ν”Œλ ˆμ΄) N x (1이닝당) x 3아웃 x 9λͺ… μ„ μˆ˜
Β Β Β Β => 8! x N(μ΅œλŒ€ 50) x 3 x 9 = 54432000


🌟문제 이해 및 ν’€μ΄κ³„νš

✏️1번 μ„ μˆ˜(4번 νƒ€μžλ‘œ κ³ μ •) μ œμ™Έν•˜κ³  λ‚˜λ¨Έμ§€ 8λͺ…μ˜ μˆœμ„œλ₯Ό μˆœμ—΄λ‘œ λͺ¨λ‘ κ΅¬ν•˜κ³ , 각 μˆœμ„œμ— λŒ€ν•΄ ν”Œλ ˆμ΄ ν›„ μ΅œλŒ€κ°’μ„ λ½‘λŠ”λ‹€.


βœπŸ»λ‚΄ μ½”λ“œ1 - μ˜€λ‹΅μ½”λ“œ

package BOJ;

import java.util.Arrays;
import java.util.Scanner;

public class boj_17281 {
	
	static int n, max = 0;
	static int[][] inning;
	static boolean[] visited = new boolean[10];

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		n = sc.nextInt();
		inning = new int[n][9];
		for(int i=0; i<n; i++) {
			for(int j=0; j<9; j++) {
				inning[i][j] = sc.nextInt();
			}
		}
		sc.close();
		
		// νƒ€μž μˆœμ„œλ₯Ό κ³ λ €ν•˜μ§€ μ•Šμ€ ν”Œλ ˆμ΄ - 였λ₯˜μ½”λ“œ
		for(int i=0; i<n; i++) {
			if(out >= 3) break;
			while(true) {
				if(idx >= 9) idx = 0;
				// μœ νš¨νƒ€μΌ λ•Œ
				if(inning[i][idx] != 0) {
					for(int k=3; k>=1; k--) {
						if(base[k] > 0) {
							base[k] = 0;
							if(k + inning[i][idx] > 3) score += 1;
							else {
								base[k+inning[i][idx]] = 1;
							}
						}
					}
					if(inning[i][idx] == 4) score += 1;
					else base[inning[i][idx]] = 1;
					idx += 1;
				}
				// 아웃일 λ•Œ
				else {
					idx += 1;
					out += 1;
					break;
				}
			}
		}
		
		System.out.println(max);
	}
	
}

βŒμ²˜μŒμ—λŠ” μˆœμ„œμ— λŒ€ν•œ κ³ λ €λ₯Ό μ „ν˜€ ν•˜μ§€ μ•Šκ³  κ·Έλƒ₯ μˆœμ„œλŒ€λ‘œ κ²Œμž„μ„ μ§„ν–‰ν–ˆλ‹€. κ²Œμž„ ν”Œλ ˆμ΄ μ „, νŒ€μ˜ μˆœμ„œλ₯Ό 미리 μ •ν•΄μ•Ό ν•œλ‹€.

βš”οΈμˆœμ—΄μ„ μ΄μš©ν•˜μ—¬ λͺ¨λ“  μˆœμ„œλ₯Ό κ΅¬ν•œ λ’€, κ²Œμž„μ„ μ§„ν–‰ν•˜κ³  ν”Œλ ˆμ΄ 쀑 제일 큰 점수λ₯Ό μ €μž₯ν•œλ‹€.

βš”οΈorder()ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μˆœμ—΄λ‘œ μ„ μˆ˜μ˜ λͺ¨λ“  μˆœμ„œλ₯Ό ꡬ해 runners[]배열에 μ €μž₯ν•œλ‹€.(4λ²ˆνƒ€μž 1λ²ˆμ„ μˆ˜λ‘œ κ³ μ •)

βš”οΈrunners[]배열을 μ΄μš©ν•˜μ—¬ νƒ€μˆœμ„ μ •ν•œλ‹€. (4λ²ˆνƒ€μž 1λ²ˆμ„ μˆ˜λ‘œ κ³ μ •)

βš”οΈμœ νš¨νƒ€μ™€ 아웃일 λ•Œλ₯Ό κ΅¬λΆ„ν•˜μ—¬ νƒ€μžμ˜ μˆœμ„œλŠ” μœ μ§€ν•œ 채 base[]배열을 μ΄μš©ν•˜μ—¬ 각 1루,2루,3루에 μ£Όμžκ°€ μžˆλŠ”μ§€ κ²€μ‚¬ν•˜κ³  μ•ˆνƒ€ μˆ˜μ— 따라 μ–»λŠ” 점수λ₯Ό 계산해쀀닀.


βœπŸ»λ‚΄ μ½”λ“œ2 + κ°•μ˜

package BOJ;

import java.util.Arrays;
import java.util.Scanner;

/*
 * 2021.01.18 daily algo/commit
 * 
 * Brute Force
 * λ¬Έμ œμ— λŒ€ν•œ 기본적인 이해!
 * - ν•œ 이닝은 3아웃이 되기 μ „κΉŒμ§€ λ°˜λ³΅λœλ‹€.
 * - 3아웃 μ‹œ μ£ΌμžλŠ” μ΄ˆκΈ°ν™”λœλ‹€.
 * - λ‹€μŒ μ΄λ‹μœΌλ‘œ λ„˜μ–΄κ°ˆ λ•Œ νƒ€μžμ˜ μˆœμ„œλŠ” μœ μ§€λœλ‹€.
 */

public class boj_17281 {
	
	static int n, max = 0;
	static int[][] inning;
	static int[] runners;
	static boolean[] visited = new boolean[10];

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		n = sc.nextInt();
		inning = new int[n][9];
		for(int i=0; i<n; i++) {
			for(int j=0; j<9; j++) {
				inning[i][j] = sc.nextInt();
			}
		}
		sc.close();
		
		runners = new int[10]; // ν˜„μž¬ νƒ€μž μˆœμ„œ
		runners[4] = 1; // 4λ²ˆνƒ€μžλŠ” 무쑰건 1λ²ˆμ„ μˆ˜
		order(9, 1, 2, runners);
		
		System.out.println(max);
	}
	
	// μ„ μˆ˜ μˆœμ„œ μ •ν•˜κΈ°
	public static void order(int n, int r, int start, int[] runners) {
		if(r == 9) {
			max = Math.max(max, play(runners));
			return;
		}
		for(int i=2; i<=9; i++) {
			if(!visited[i]) {
				visited[i] = true;
				if(r >= 4) {
					runners[r+1] = i;
				}
				else runners[r] = i;
				order(n, r+1, i+1, runners);
				visited[i] = false;
			}
		}
	}

	public static int play(int[] runners) {
		int idx = 1; // μˆœμ„œ
		int[] base = new int[4]; // ν˜„μž¬ λ² μ΄μŠ€μ— μžˆλŠ” μ„ μˆ˜
		base[0] = 1;
		int out = 0; // 아웃 수
		int score = 0; // ν˜„μž¬ 점수
		
		for(int i=0; i<n; i++) {
			while(true) {
				if(idx > 9) idx = 1;
				// μœ νš¨νƒ€μΌ λ•Œ
				if(inning[i][runners[idx]-1] != 0) {
					int hits = inning[i][runners[idx]-1];
					for(int k=3; k>=0; k--) {
						if(k + hits > 3) {
							score += base[k];
						}
						else base[k + hits] = base[k];
						if(k == 0) base[k] = 1;
						else base[k] = 0;
					}
					idx += 1;
				}
				// 아웃일 λ•Œ
				else {
					idx += 1;
					out += 1;
					if(out >= 3) {
						out = 0; // 아웃 횟수 μ΄ˆκΈ°ν™”
						Arrays.fill(base, 0);
						base[0] = 1;
						break;
					}
				}
			}
		}
		return score;
	}
}

πŸ’‘base[]배열을 μ΄μš©ν•˜μ—¬ μ•ˆνƒ€ μ μˆ˜μ— 따라 점수λ₯Ό κ³„μ‚°ν•˜λŠ” 것이 ν—·κΉ”λ Έλ‹€. 3 -> 2 -> 1루 순으둜 μ£Όμžκ°€ μžˆλŠ”μ§€ μ—†λŠ”μ§€λ₯Ό κ²€μ‚¬ν•˜κ³  μ£Όμžκ°€ 있으면 1, μ—†μœΌλ©΄ 0으둜 ν‘œν˜„ν•˜λŠ” κ³Όμ •μ—μ„œ μ£Όμžκ°€ ν™ˆμ„ 톡과해 점수λ₯Ό μ–»λŠ” κ²½μš°μ™€ ν™ˆμ„ ν†΅κ³Όν•˜μ§€ λͺ»ν•΄ λ² μ΄μŠ€μ— λ‚¨μ•„μžˆλŠ” 경우λ₯Ό λ‚˜λˆ„μ—ˆλ‹€.
이 λ•Œ, μ£Όμžκ°€ 움직이면 κ·Έ 전을 0으둜 λ§Œλ“€μ–΄μ£ΌλŠ” λ‘œμ§μ„ 두 경우 λͺ¨λ‘ μ§œμ£Όμ–΄μ•Ό ν–ˆλŠ”λ° ν•œ 경우만 ν•΄λ‹Ήν•˜κ²Œ ν•΄μ„œ μ‹œκ°„μ„ 많이 λ‚­λΉ„ν–ˆλ‹€.. γ… .γ… 
디버깅을 ν•œμ°Έμ„ 해보고 λ‚˜μ„œμ•Ό μ™œ μ μˆ˜κ°€ μ œλŒ€λ‘œ μ°νžˆμ§€ μ•Šμ•˜λŠ”μ§€ μ•Œμ•„μ±˜λ‹€..

πŸ’‘λ¬Έμ œμ— λŒ€ν•œ 이해가 아직도 ν•œμ°Έ λΆ€μ‘±ν•œ 것 κ°™λ‹€! λΉ λ₯΄κ²Œ 문제λ₯Ό μ ‘κ·Όν•˜λŠ” 것 보닀 천천히 문제 μ†μ˜ κ·œμΉ™μ„ μ™„λ²½νžˆ νŒŒμ•…ν•œ 후에 μ ‘κ·Όν•˜λŠ” μŠ΅κ΄€μ„ λ“€μ΄μž.

profile
μ†Œν†΅ν•˜λŠ” λ°±μ—”λ“œ 개발자둜 μ„±μž₯ν•˜κΈ°

0개의 λŒ“κΈ€