728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/160585
해설
경우의 수를 꼼꼼히 파악하는 것이 중요한 문제입니다.
문제가 생기는 경우는 O, X를 두번 연속 둔 경우와 완료된 게임에서 다음 수를 둔 경우. 크게 두가지로 볼 수 있습니다.
O와 X 둘로 가능성을 나누면 4가지의 문제가 되는 조건이 나옵니다.
1. O를 두번 연속 둔 경우 : O가 선공이기 때문에 O의 개수가 X의 개수보다 2개이상 많다면 -> OC-XC>=2
2. X를 두번 연속 둔 경우 : X는 후공이기 때문에 O의 개수가 X보다 더 적을 수 없다 -> OC<XC
3. O를 마지막에 두었는데, X가 3개를 완료된 경우 : O가 마지막이며 X가 한줄 이상인 경우 -> OC>XC, X가 한줄이상
4. X를 마지막에 두었는데, O가 3개를 완료된 경우 : X가 마지막이며 O가 한줄 이상인 경우 -> OC==XC, O가 한줄이상
선후공이 정해져 있기 때문에 O와 X의 개수를 통해 연속으로 둔 경우와 마지막에 둔 경우를 파악할 수 있습니다.
따라서 몇줄이 완성되었는지 판단하는 함수를 통해 완성된 줄의 여부를 구해 문제를 해결했습니다.
주의점
- O, X를 번갈아가며 두며, O로 시작한다.
- 결과와 상관없이 '가능한가' 여부만 판단한다.
코드
class Solution {
char[][] map;
public int solution(String[] board) {
int answer = -1;
map = new char[3][3];
int OC=0, XC=0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
map[i][j] = board[i].charAt(j);
if(map[i][j]=='O')OC++;
else if(map[i][j]=='X')XC++;
}
}
// 잘못된 경우 1 : 두번 연속 같은 값을 칠한 경우(o가 선공이기 때문에 항상x보다 많으며 차이가 2이상은 나지 않음)
if(OC-XC>=2 || OC < XC) return 0;
// 잘못된 경우 2 : 마지막이 O로 끝났는데, x가 완성된 경우
if(OC>XC && lineCounter('X')>0){
return 0;
}
// 잘못된 경우 3 : 마지막이 x로 끝났는데, o가 완성된 경우
if(OC==XC && lineCounter('O')>0){
return 0;
}
return 1;
}
int lineCounter(char input){
int line=0;
for(int i=0;i<3;i++){
if(map[i][0]==map[i][1] && map[i][1]==map[i][2]){
if(map[i][0]==input) line++;
}
if(map[0][i]==map[1][i] && map[1][i]==map[2][i]){
if(map[0][i]==input) line++;
}
}
if(map[0][0]==map[1][1] && map[1][1]==map[2][2]){
if(map[0][0]==input) line++;
}
if(map[0][2]==map[1][1] && map[1][1]==map[2][0]){
if(map[0][2]==input) line++;
}
return line;
}
}
728x90
'[IT] 코딩테스트 > [문제 및 풀이] 프로그래머스' 카테고리의 다른 글
[프로그래머스] n^2 배열 자르기 / 자바(Java) (0) | 2023.10.29 |
---|---|
[프로그래머스] 숫자 카드 나누기 / 자바(Java) (2) | 2023.10.28 |
[프로그래머스] 디펜스 게임 / 자바(Java) (0) | 2023.10.26 |
[프로그래머스] 과제 진행하기 / 자바(Java) (0) | 2023.10.25 |
[프로그래머스] 리코쳇 로봇 / 자바(Java) (1) | 2023.10.20 |