![[Java] 혼자서 하는 틱택토 - Lv2 프로그래머스](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGdcXj%2Fbtr3iIa1l1C%2F8Sv2ewA1x5PFG0Za8k9bk0%2Fimg.png)
[Java] 혼자서 하는 틱택토 - Lv2 프로그래머스코딩테스트/프로그래머스2023. 3. 12. 09:49
Table of Contents
728x90
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/160585
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
테스트케이스 53, 54에서 좀 막혔던 문제이다.
53, 54케이스의 경우, O와 X모두 정답일 때를 고려한 케이스인 것 같으니 참고하자.
오답일 경우의 수를 생각해봤다.
1. 승자가 없을 때 : o와 x 수 비교 - o는 x보다 2개 이상 많으면 안되고, x는 o보다 1개 이상 많으면 안된다.
2. o가 승리 시 : o는 x보다 무조건 1개 많아야한다.
3. x가 승리 시 : x는 o의 개수와 같아야 한다.
4. o와 x 모두 승리 시 : 말이 안된다고 생각하여 걸러주었다.
class Solution {
public int solution(String[] board) {
int o = 0;
int x = 0;
int oWin = 0;
int xWin = 0;
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(board[i].charAt(j) == 'O') {
o++;
}
else if(board[i].charAt(j) == 'X') {
x++;
}
}
}
if(o-x>1 || o-x<0) {//승자 체크 전 걸러내기
return 0;
}
//승리자 체크
if(o>=3) {
oWin = winnerCheck(board, 'O');
}
if(x>=3) {
xWin = winnerCheck(board, 'X');
}
//둘다 승리했을 경우 = 말이되나?
if(oWin == 1 && xWin == 1) {
return 0;
}
//O 승리 시
if(oWin == 1) {
if(o-x == 1) {
return 1;
}
else {
return 0;
}
}
//X 승리 시
if(xWin == 1) {
if(x == o) {
return 1;
}
else {
return 0;
}
}
//나머지 상황 : 승자없고 승자없을 때 실패상황 걸러냈기때문에 1리턴
return 1;
}
public int winnerCheck(String[] board, char ox) {
boolean bl = true;
//1. 가로체크
for(int i=0; i<3; i++) {
bl = true;
for(int j=0; j<3; j++) {
if(board[i].charAt(j) != ox) {
bl = false;
}
}
if(bl) {
return 1;
}
}
//2. 세로체크
for(int i=0; i<3; i++) {
bl = true;
for(int j=0; j<3; j++) {
if(board[j].charAt(i) != ox) {
bl = false;
}
}
if(bl) {
return 1;
}
}
//3. 대각선체크
if(board[0].charAt(0) == ox && board[1].charAt(1) == ox && board[2].charAt(2) == ox) {
return 1;
}
if(board[0].charAt(2) == ox && board[1].charAt(1) == ox && board[2].charAt(0) == ox) {
return 1;
}
return 0;
}
}
처음에는 winnerCheck메서드 호출 후 바로 조건을 달아서 answer를 리턴했는데 53,54 케이스를 걸러내지 못했다.
그렇기에 위의 코드로 수정해서 최종 정답을 도출했다.
if(o>=3) {
if(winnerCheck(board, 'O') == 1){
if(o-x == 1){
return 1;
}
else return 0;
}
}
728x90
300x250
@mag1c :: 꾸준히 재밌게
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!