Lewis's Tech Keep
[프로그래머스][JAVA] 혼자서 하는 틱택토 본문
링크
https://school.programmers.co.kr/learn/courses/30/lessons/160585#
설명
알고리즘 체크보다는 엣지 케이스들을 다 체크 해주는 게 중요했다.
이길 수 없는 경우들을 잘 골라내서 return 해준다.
더보기
// 진행 가능 : 0가 1개 더 많거나 O와 X개수가 같다. (이것이 아닌 경우)
/ oCount와 xCount가 2개 이상 차이 나면 안된다.
// X 개수가 더 많을 수 없다.
// 한쪽이 완료됐는데 다른쪽 완료도 있으면 안됨
// O 완료가 1개인데 O와 X의 개수가 같을 수 없음
// X 완료가 1개인데 O의 개수가 더 많을 때
풀이
더보기
class Solution {
public int solution(String[] board) {
int oCount = 0;
int xCount = 0;
String[][] cells = new String[board.length][board[0].length()];
for (int i=0; i<board.length; i++) {
String[] boardLine = board[i].split("");
for (int j=0; j<boardLine.length; j++) {
String cell = boardLine[j];
oCount = cell.equals("O") ? oCount + 1 : oCount;
xCount = cell.equals("X") ? xCount + 1 : xCount;
cells[i][j] = cell;
}
}
// 진행 가능 : 0가 1개 더 많거나 O와 X개수가 같다.
if (!(oCount == xCount + 1 || oCount == xCount)) {
return 0;
}
// oCount와 xCount가 2개 이상 차이 나면 안된다.
if (Math.abs(oCount - xCount) > 1) {
return 0;
}
// X 개수가 더 많을 수 없음
if (oCount < xCount) {
return 0;
}
int oCompleteCount = 0;
int xCompleteCount = 0;
// 행 체크
for (int i=0; i<board.length; i++) {
boolean oRowCheck = true;
boolean xRowCheck = true;
for (int j=0; j<board.length; j++) {
if (!cells[i][j].equals("O")) {
oRowCheck = false;
}
if (!cells[i][j].equals("X")) {
xRowCheck = false;
}
}
if (oRowCheck) {
oCompleteCount++;
}
if (xRowCheck) {
xCompleteCount++;
}
}
// 열 체크
for (int i=0; i<board.length; i++) {
boolean oRowCheck = true;
boolean xRowCheck = true;
for (int j=0; j<board.length; j++) {
if (!cells[j][i].equals("O")) {
oRowCheck = false;
}
if (!cells[j][i].equals("X")) {
xRowCheck = false;
}
}
if (oRowCheck) {
oCompleteCount++;
}
if (xRowCheck) {
xCompleteCount++;
}
}
// 대각선 체크
if (cells[0][0].equals("O") && cells[1][1].equals("O") && cells[2][2].equals("O")) {
oCompleteCount++;
}
if (cells[0][0].equals("X") && cells[1][1].equals("X") && cells[2][2].equals("X")) {
xCompleteCount++;
}
if (cells[0][2].equals("O") && cells[1][1].equals("O") && cells[2][0].equals("O")) {
oCompleteCount++;
}
if (cells[0][2].equals("X") && cells[1][1].equals("X") && cells[2][0].equals("X")) {
xCompleteCount++;
}
// 한쪽이 완료됐는데 다른쪽 완료도 있으면 안됨
if (oCompleteCount > 0 && xCompleteCount > 0) {
return 0;
}
// 완료가 1개인데도 진행했다면 불가
// O 완료가 1개인데 O와 X의 개수가 같을 수 없음
if (oCompleteCount == 1 && xCount >= oCount) {
return 0;
}
// X 완료가 1개인데 O의 개수가 더 많을 때
if (xCompleteCount == 1 && oCount > xCount) {
return 0;
}
return 1;
}
}
'Java > 알고리즘' 카테고리의 다른 글
[프로그래머스][JAVA] 호텔 대실 (0) | 2024.07.30 |
---|---|
[프로그래머스][JAVA] 미로탈출 (0) | 2024.07.29 |
[프로그래머스][JAVA] 당구 연습 (0) | 2024.07.29 |
[프로그래머스][JAVA] 광물 캐기 (0) | 2024.07.26 |
[프로그래머스][JAVA] 연속된 부분 수열의 합 (0) | 2024.07.10 |
Comments