swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWgv9va6HnkDFAW0
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
인영이의 카드내는 순서를 중복을 허용하지 않는 순열로 구하였다.
주석에서의 인영=>규영 규영=>인영 으로 바꾸어 읽어야 한다. (문제를 잘못읽었다)
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Scanner;
/* 문제 잘못읽어서 규영이랑 인영이 서로바뀜. ***주석에서 인영,규영을 반대로 읽으면 된다.***
* 입력: 규영이의 카드9개
* 구할것: 규영이가 이기는경우 수 win, 지는경우 수 res-win(총경우의수 -규영이가이기는경우)
* 규영이순서는 고정. 변하는값-> 인영이카드내는순서에 따라 승패가정해짐. 순서? 순열!중복x
* 숫자 1~18
* 이기는경우: 높은수적힌카드낸사람 두카드적힌수 합만큼점수얻. 총점같으면 무승부(카운트x)
*/
public class 규영이와인영이의카드게임 {
static int win,res;
static int [] ins ;//인영이의 카드배열
static int [] gus ;//규영이의 카드배열
static boolean[] gu;//규영이 카드를 넣기위한 체크배열
public static void main(String[] args) throws FileNotFoundException {
System.setIn(new FileInputStream("input/규영이와인영이의카드게임.txt"));
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int tc = 1; tc <= T; tc++) {
win =0;//이기는경우의수 초기화
res=0;//지는경우의수 초기화
ins = new int[9];
gus = new int[9];
gu = new boolean[18];
for (int i = 0; i < 9; i++) {
ins[i] = sc.nextInt();//인영이의 카드배열 저장
gu[ins[i]-1] = true;//중복체크
}
//규영이 카드배열 저장
//만약 체크배열의값이 false면 그 인덱스(0부터시작하므로 +1해줌)를 규영이배열에 넣음
int cnt=0;//규영이배열인덱스를 0부터시작
for (int i = 0; i < 18; i++) {
if(!gu[i]) {//만약 골라지지않았다면
gus[cnt++]= i+1;//그 수를 배열에 넣고 cnt증가(후치연산이라 연산이 끝난후 증가)
}
}
//순열
permutation(new int [9],new boolean[9],0);//규영이 카드를 담을 배열, 방문체크배열, 뽑은수
System.out.printf("#%d %d %d\n", tc, res-win,win);
}
}
private static void permutation(int[] sel, boolean[] v, int k) {
if(k==gus.length) {//규영이배열길이만큼 돌았으면
//인영규영 승패 비교시작
res++;//모든경우의수
int scorein=0;//인영이의점수
int scoregu=0;//규영이의점수
for (int i = 0; i < 9; i++) {
int a = ins[i];//인영이의카드
int b = sel[i];//규영이의카드
if(a>b) scorein += a+b;//인영이가 이길경우 두 카드의 합만큼 점수를 얻는다
if(a<b) scoregu += a+b;//규영이가 이길경우 두 카드의 합만큼 점수를 얻는다
//같을경우 아무것도하지않음.
}//end for
if(scorein<scoregu) win++;//규영이가 이길경우
return;
}
for (int i = 0; i < 9; i++) {
if(!v[i]) {
v[i]=true;
sel[k]=gus[i];//규영이배열에서 뽑음
permutation(sel, v, k+1);
v[i]=false;
}
}
}
}
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA]- 8382 방향 전환 (0) | 2021.03.15 |
---|---|
SWEA-3234 준환이의 양팔저울 (0) | 2021.02.21 |
SWEA-1220 Magnetic (0) | 2021.02.13 |
SWEA- 9229 한빈이와 Spot Mart (0) | 2021.02.08 |
SWEA- 1233 계산기 2 (0) | 2021.02.07 |
댓글