문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/160585
제한 사항
입출력 예
풀이
class Solution {
public int solution(String[] board) {
int[] count = getCount(board);
boolean[] winner = checkWinner(board);
// 정상 흐름인 경우
if (winner[0] && !winner[1]) {
if (count[0] - count[1] == 1) return 1;
} else if (!winner[0] && winner[1]) {
if (count[0] == count[1]) return 1;
} else if (!winner[0] && !winner[1]) {
if ((count[0] >= count[1]) && (count[0] - count[1] < 2)) return 1;
}
return 0;
}
// O, X 카운트
private int[] getCount(String[] board) {
int[] count = new int[2];
for (String b : board) {
for (Character c : b.toCharArray()) {
if (c == 'O') count[0]++;
else if (c == 'X') count[1]++;
}
}
return count;
}
// 승자 확인
private boolean[] checkWinner(String[] board) {
boolean[] winner = new boolean[2];
String boardStr = board[0] + board[1] + board[2];
int[][] winArr = new int[][] {
{ 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, // 가로
{ 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 8 }, // 세로
{ 0, 4, 8 }, { 2, 4, 6 } // 대각선
};
for (int i = 0; i < winArr.length; i++) {
char[] select = new char[] {
boardStr.charAt(winArr[i][0]),
boardStr.charAt(winArr[i][1]),
boardStr.charAt(winArr[i][2])
};
if (select[0] == select[1] && select[1] == select[2]) {
if (select[0] == 'O') winner[0] = true;
if (select[0] == 'X') winner[1] = true;
}
}
return winner;
}
}
후기
문제가 약간 길어서 잘 읽어야 한다. 이 문제의 관건은 정상적이지 않은 게임의 흐름이 어떤 조건이 있는지 잘 파악하는 것이다. 나는 반대로 정상적인 흐름을 구해서 풀었는데 뭐든 상관 없고 조건만 잘 지정하면 된다. 나도 조건 지정을 잘못해서 몇 번 틀렸다... 힌트 약간 추가하자면, O가 이겼을 때는 X보다 무조건 1개 많아야 하고, X가 이겼을 때는 O과 갯수가 같아야 한다. 그리고 아직 누구도 이기지 못했다면 O가 X보다 같거나 1개 많아야 한다. 둘 다 이기는 경우는 없으므로 생략한다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
[프로그래머스][Java][Lv. 0] 구슬을 나누는 경우의 수 (0) | 2024.07.22 |
---|---|
[프로그래머스][Java][Lv. 2] 무인도 여행 (0) | 2024.07.18 |
[프로그래머스][Java][Lv. 2] 호텔 대실 (0) | 2024.07.12 |
[프로그래머스][Java][Lv. 0] 수열과 구간 쿼리 2 (0) | 2024.03.03 |
[프로그래머스][Java][Lv. 0] 무작위로 K개의 수 뽑기 (0) | 2024.02.22 |