아마존 본사 입사 문제였습니다.
tic-tac-toe는 두 명의 플레이어가 턴을 돌아가면서 1부터 9까지 포지션을 선택하는 게임 입니다. 선택된 포지션은 X나 0로 표시가 되며, 선택된 포지션은 다시 선택할 수가 없습니다. 게임 그리드는 3*3으로 다음과 같습니다.
* *
1 * 2 * 3
* *
* *
4 * 5 * 6
* *
* *
7 * 8 * 9
* *
가로 세로 대각선으로 먼저 세 줄을 연속으로 만드는 플레이어가 우승하게 되며 무승부인 경우도 생깁니다. (매 턴마다 포지션을 입력해야 하지만, 출력은 게임이 끝이 났을 때만 하셔도 됩니다)
입력의 예:
Player 1 - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9):
출력의 예:
* *
X * X * 0
* *
* *
X * 0 * 6
* *
* *
X * 8 * 9
* *
Win playear is: player 1
자바로 풀어봤습니다.
import java.util.Scanner;
public class RealTest {
// 판단
public static int whoIsWinner(int count, String check, int winner) {
if(count==3&check.equals("X")) {
winner = 1;
}else if(count==3&check.equals("O")) {
winner = 2;
}
return winner;
}
// 이긴 사람이 있는가?
public static int answerResult(String[][] ticTacToe, int player) {
int winner = 0;
String[] checkList = {"X", "O"};
// 행 판단
for(String check : checkList) {
for(int i=0; i<3; i++) {
int count = 0;
for(int j=0; j<3; j++) {
if(ticTacToe[i][j].equals(check)){
count++;
}
}
winner = whoIsWinner(count, check, winner);
}
}
// 열 판단
for(String check : checkList) {
for(int j=0; j<3; j++) {
int count = 0;
for(int i=0; i<3; i++) {
if(ticTacToe[i][j].equals(check)){
count++;
}
}
winner = whoIsWinner(count, check, winner);
}
}
// 대각선 판단
for(String check : checkList) {
int countLeft = 0, countRight = 0;
for(int i=0; i<3; i++) {
if(ticTacToe[i][i].equals(check)) {
countLeft++;
}
if(ticTacToe[i][2-i].equals(check)) {
countRight++;
}
}
winner = whoIsWinner(countLeft, check, winner);
winner = whoIsWinner(countRight, check, winner);
}
return winner;
}
// 해당 원소가 들어있는가? & 있으면 표시
public static boolean checkContain(String[][] ticTacToe, String selectedElement, int player) {
boolean result = false;
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(ticTacToe[i][j].equals(selectedElement)) {
result = true;
if(player==1) {
ticTacToe[i][j] = "X";
}else {
ticTacToe[i][j] = "O";
}
}
}
}
return result;
}
// 남은 원소 출력
public static void printRemaining (String[][] ticTacToe, int player) {
String remaining = "";
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if((ticTacToe[i][j].equals("X")==false)&(ticTacToe[i][j].equals("O")==false)) {
remaining += " "+ticTacToe[i][j]+",";
}
}
}
remaining = remaining.substring(0, remaining.length()-1);
System.out.printf("Player %d's turn\n", player);
System.out.printf("please type a position (available position(s) are %s):", remaining);
}
// 결과 출력
public static void painting(String[][] ticTacToe) {
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(j!=2) {
System.out.print(" *");
}else {
System.out.print(" ");
}
}
System.out.println();
for(int j=0; j<3; j++) {
if(j!=2) {
System.out.printf(" %s *",ticTacToe[i][j]);
}else {
System.out.printf(" %s ",ticTacToe[i][j]);
}
}
System.out.println();
for(int j=0; j<3; j++) {
if(j!=2) {
System.out.print(" *");
}else {
System.out.print(" ");
}
}
System.out.println();
}
System.out.println();
}
// 메인
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 게임 시작 전 세팅
String[][] ticTacToe = {{"1", "2", "3"}, {"4", "5", "6"}, {"7" ,"8" ,"9"}};
System.out.println("Game Start!");
painting(ticTacToe);
// 시작
int player = 1;
for(int i=1; i<=9; i++) {
while(true) {
printRemaining(ticTacToe, player);
String selectedElement = scan.next();
boolean isContain = checkContain(ticTacToe, selectedElement, player);
if(isContain==false) {
System.out.println("The element does not exist. Please re-enter.\n");
continue;
}else {
break;
}
}
System.out.println();
painting(ticTacToe);
int winner = answerResult(ticTacToe, player);
if(winner!=0) {
System.out.printf("Game over! Winner is player %d\n", winner);
break;
}else if(i==9&&winner==0) {
System.out.println("Game over! draw! \n");
}
// 플레이어 차례 선정
if(player==1) {
player=2;
}else {
player=1;
}
}
}
}
2022年06月15日 19:51
Java 로 풀어봤습니다.
n * n 가능하도록 만들어봤습니다. 랜덤입력 방식으로 처리됩니다.
n : board 크기 range : board 인덱스 범위 pickedSize : 랜덤입력 값 추출 변수
public class TicTacToeGame_Refactoring {
public static void main(String[] args) {
final int n = 3;
final int range = 3;
final int pickedSize = 2;
char board[][] = new char[n][n];
List<Integer> picked = new ArrayList<Integer>();
List<TwoDimensions> randomInput = new ArrayList<TwoDimensions>();
// 1. init (random input)
createInput(picked, pickedSize, range, randomInput);
Collections.shuffle(randomInput);
// 2. input data (board)
char mark = 'O';
for (TwoDimensions in : randomInput)
{
board[in.x][in.y] = mark;
if (isDecideWinner(board, in.x, in.y, mark))
{
print(board);
System.out.println("Winner is : " + mark);
return;
}
if (mark == 'O') mark = 'X';
else mark = 'O';
}
// 3. Draw
print(board);
System.out.println("draw");
}
public static void print(char board[][]) {
int boardSize = board.length;
for (int i = 0 ; i < boardSize; i++) {
for (int j = 0 ; j < boardSize; j++)
System.out.print(board[i][j] + "\t");
System.out.println();
}
}
public static boolean isDecideWinner(char board[][], int x, int y, char mark) {
int boardSize = board.length;
// width
for (int i = 0 ; i < boardSize; i++)
{
if (board[x][i] != mark)
break;
else if (i == boardSize -1)
return true;
}
// height
for (int i = 0 ; i < boardSize; i++)
{
if (board[i][y] != mark)
break;
else if (i == boardSize -1)
return true;
}
// diagonal
if ( x == y || Math.abs(x-y) == boardSize)
{
for (int i = 0 ; i < boardSize ; i++)
{
if (board[i][i] != mark)
break;
else if ( i == boardSize -1)
return true;
}
for (int i = 0 ; i < boardSize ; i++)
{
if (board[i][boardSize-1] != mark)
break;
else if ( i == boardSize - 1)
return true;
}
}
return false;
}
public static void createInput(List<Integer> picked, int pickedSize, int range, List<TwoDimensions> storage)
{
if(picked.size() == pickedSize)
{
TwoDimensions dimensions = new TwoDimensions();
dimensions.x = picked.get(0); dimensions.y = picked.get(1);
storage.add(dimensions);
return ;
}
for(int next = 0 ; next < range ; next++)
{
picked.add(next);
createInput(picked, pickedSize, range, storage);
picked.remove(picked.size() -1);
}
}
}
class TwoDimensions
{
int x; int y;
}
풀이 작성