1. 문제
2. 접근방법
순열과 시뮬레이션이 컴비네이션 된 재밌는 문제!
첫번째 선수는 무조건 4번 타자이고
나머지 선수들을 각 타순에 배치시켜 경기를 진행하여 가장 큰 점수가 나오는 상황의 점수를 구하는 문제
첫 번째 선수를 제외한 8명의 선수를 순열을 이용해
줄 세우기를 하고 주어진 야구 규칙에 맞춰 시뮬레이션 시켜보면 된다.
시뮬레이션 시킬때 주의할점은 첫번째선수는 4번타자에 배치시켜 줘야 한다는 것과
이닝이 종료되면 맵에 남아있던 선수들을 비워줘야 한다는것만 조심하자.
3. 자바 코드
package Gold;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class P17281야구 {
static int N, round[][], max;
static int player[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
static int sel[] = new int[8];
static boolean visit[] = new boolean[9];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
round = new int[N][9];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 9; j++) {
round[i][j] = Integer.parseInt(st.nextToken());
}
}
powerset(0);
System.out.println(max);
}
static void powerset(int selidx) {
if (selidx == 8) {
max = Math.max(play(), max);
}
for (int i = 1; i <= 8; i++) {
if (visit[i])
continue;
sel[selidx] = i;
visit[i] = true;
powerset(selidx + 1);
visit[i] = false;
}
}
static int play() {
int nownum = 0; // 현재 칠 타자의 타순
int score = 0;
int out = 0;
int map[] = new int[3];
int hit = 0; // 뭘로 치는지
gg: for (int i = 0; i < N; i++) { // i는 라운드
while (true) { //반복 한번당 타자 한명
if (nownum < 3) {
hit = round[i][sel[nownum]];
}
if (nownum == 3) {
hit = round[i][0];
}
if (nownum > 3) {
hit = round[i][sel[nownum - 1]];
}
nownum = (nownum+1)%9;
if (hit == 0) {
out++;
if (out == 3) {
out = 0;
Arrays.fill(map, 0);
break;
}
continue;
}
for (int j = 2; j >= 0; j--) {// 기존 맵에 있던 친구들 위치 바꾸기
int pos = j;
if (map[pos] == 1) {
map[pos] = 0;
pos = pos + hit;
if (pos > 2) {
score++;
continue;
}
map[pos] = 1;
}
}
if(hit == 4) {
score ++;
continue;
}
map[hit-1] = 1;
}
}
return score;
}
}
4. 마치며
삼성 a형 기출문제들은 시뮬레이션이 많아서 푸는 재미가 있다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준] 16236 아기상어 (1) | 2020.10.01 |
---|---|
[백준] 2579 계단오르기 (0) | 2020.09.29 |
[백준] 2116 주사위 쌓기 (0) | 2020.09.26 |
[백준] 2628 종이자르기 (0) | 2020.09.26 |
[백준] 2669 직사각형네개의합집합의면적구하기 (0) | 2020.09.26 |