[SWEA/순조부] 6808: 규영이와 인영이의 카드게임 - 자바

2022. 8. 28. 00:11· Problem Solving/CT-Java
목차
  1. 문제
  2. 풀이

문제


문제링크

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

풀이


규영이의 카드와 순서가 정해지고 인영이가 내는 순서에 따라 승패가 갈린다. 

즉, 순열을 통해 인영이의 카드 순서의 경우의 수를 모두 구하고 승패 여부를 확인하면 된다.

순열을 구하는 방법은 대표적으로 두가지가 있는데 swap을 이용하여 순서를 구하거나 

boolean 배열을 이용해 check하는 방법이다.

 

풀이1

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

public class SWEA_6808 {
	static StringTokenizer st;
	static int a[];
	static int b[];
	static int win, defeat;
	static int totalCnt;
	static int nums[];
	static boolean isSelect[];
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int t = Integer.parseInt(br.readLine());
		
		for(int tc = 1; tc <= t; tc++) {
			a = new int[9];
			b = new int[9];
			nums = new int[9];
			boolean[] cardCheck = new boolean[19];
			isSelect = new boolean[9];
			
			st = new StringTokenizer(br.readLine());
			for (int i = 0; i < 9; i++) {
				int inputNum = Integer.parseInt(st.nextToken());
				a[i] = inputNum;
				cardCheck[inputNum] = true; 
			}
			
			win = 0;
			defeat = 0;
			
			int idx = 0;
			for (int i = 1; i <= 18; i++) {
				if(cardCheck[i]) continue;
				b[idx] = i;
				idx++;
			}
		
			permutation(0);
			System.out.printf("#%d %d %d%n", tc, win, defeat);
		}
	}
	
	public static void permutation(int cnt) {
		if(cnt == 9) {
			totalCnt++;
			solution();
			return;
		}
		
		for(int i = 0; i< 9; i++) {
			if(isSelect[i]) continue;
			nums[cnt] = b[i];
			isSelect[i] = true;
			permutation(cnt+1);			
			isSelect[i] = false;
		}
	}
	
	public static void solution() {
		int aCount = 0;
		int bCount = 0;
		for(int i = 0; i < 9; i++) {
			if (a[i]> nums[i]) aCount += a[i]+nums[i];
			else if (a[i] < nums[i]) bCount += a[i]+nums[i];
		}
		if(aCount > bCount) win++;
		else if (aCount < bCount) defeat++;
	}
	
}

 

풀이2 - swap

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

public class SWEA_6808_규영이 {
	static int win = 0;
	static int lose = 0;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int TC = Integer.parseInt(st.nextToken());
		for (int t = 1; t <= TC; t++) {

			// 카드를 배열에 삽입한다.
			int[] cardK = new int[9]; // 규영이의 카드 셋
			int[] cardI = new int[9]; // 인영이의 카드 셋
			st = new StringTokenizer(br.readLine());
			for (int i = 0; i < 9; i++) {
				cardK[i] = Integer.parseInt(st.nextToken());
			}
			int[] temp = new int[18];
			for (int i = 0; i < 9; i++) {
				temp[cardK[i] - 1]++;
			}
			int j = 0;
			for (int i = 0; i < 18; i++) {
				if (temp[i] == 0)
					cardI[j++] = i + 1;
			}

			// 인영이의 카드 순열을 만들고 규영이의 카드 셋과 비교하여 승리 분석
			permutation(cardI, cardK, 0, 9, 9);
			System.out.printf("#%d %d %d\n", t, win, lose);

		}

	}

	static void permutation(int[] std, int[] arr, int depth, int n, int r) {
		if (depth == r) {
			comp(std, arr);
			return;
		}
		for (int i = depth; i < n; i++) {
			swap(arr, depth, i);
			permutation(std, arr, depth + 1, n, r);
			swap(arr, depth, i);
		}
	}

	static void print(int[] arr, int r) {
		for (int i = 0; i < r; i++)
			System.out.print(arr[i] + " ");
		System.out.println();
	}

	static void swap(int[] arr, int depth, int i) {
		int temp = arr[depth];
		arr[depth] = arr[i];
		arr[i] = temp;
	}

	static void comp(int[] std, int[] in) {
		int stdP = 0;
		int inP = 0;
		for (int i = 0; i < 9; i++) {
			if (std[i] > in[i])
				stdP += std[i] + in[i];
			else if (std[i] < in[i]) {
				inP += std[i] + in[i];
			}
		}
		if (stdP > inP)
			lose++;
		if (inP > stdP)
			win++;
	}

}

'Problem Solving > CT-Java' 카테고리의 다른 글

[프로그래머스/문자열] 60065 튜플 - JAVA  (0) 2023.09.16
[프로그래머스/문자열] 60057 문자열압축 - JAVA  (0) 2023.09.16
[SWEA/구현] 무선 충전 [모의 SW 역량테스트] - 자바  (0) 2022.08.27
[백준/BFS] 16236: 아기상어 - 자바  (0) 2022.08.27
[백준/구현] 14499: 주사위 굴리기 - 자바  (0) 2022.08.27
  1. 문제
  2. 풀이
'Problem Solving/CT-Java' 카테고리의 다른 글
  • [프로그래머스/문자열] 60065 튜플 - JAVA
  • [프로그래머스/문자열] 60057 문자열압축 - JAVA
  • [SWEA/구현] 무선 충전 [모의 SW 역량테스트] - 자바
  • [백준/BFS] 16236: 아기상어 - 자바
White Han
White Han
Software Developer
White Han
sudo apt-get happiness
White Han
전체
오늘
어제
  • 분류 전체보기 (195)
    • Language (47)
      • Java (17)
      • Java-Weekly-study (12)
      • Python (18)
    • BackEnd (11)
      • Server (2)
      • Spring (3)
      • Spring Security (0)
      • JDBC (1)
      • NodeJS (2)
      • LINUX (3)
    • DataBase (10)
      • MySQL (5)
      • MongoDB (4)
      • Oracle (1)
    • Infra (4)
      • Docker (4)
    • CS (38)
      • OS (38)
      • 아키텍쳐 (0)
    • Problem Solving (79)
      • Algorithm (8)
      • CT-Java (30)
      • CT-Python (41)
    • IDE (1)
      • eclipse (1)
      • vscode (0)
    • Etc. (3)
      • Git (1)
      • TDD, Refactor, CleanCode (1)
      • Conference (1)
    • 기록 (2)
      • 후기 (1)
      • 프로젝트 회고록 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

  • 방문해 주셔서 감사합니다.

인기 글

태그

  • javascript
  • javascript identifier
  • 자바스크립트
  • OS
  • Java this
  • 자바 super
  • SSAFY
  • java
  • 싸피
  • 프로세서
  • 싸피 후기
  • Java super
  • Java Inheritance
  • 운영체제 구조
  • 24인치 모니터 추천
  • 운영체제 역할
  • 알파스캔 모니터
  • AOC 24B1X
  • 사무용 모니터 추천
  • 자바 this
  • 알파스캔 AOC 24B1X
  • 자바스크립트 식별자
  • 운영체제
  • 프로세스
  • 싸피8기
  • 사무용 모니터
  • 자바 inheritance
  • 싸피 합격
  • 자바스크립트 개념
  • 자바스크립스 식별자 종류

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
White Han
[SWEA/순조부] 6808: 규영이와 인영이의 카드게임 - 자바
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.