사용 알고리즘: 굳이 쓴다면 bfs나 dfs를 써야겠지만, 3*3으로 크기가 정해져 있기 때문에 쓸 필요가 없다
사용 언어: java
틀린 코드
class Solution {
static int[] dx = {1,-1,0,0}; //상하 좌우 -> 대각선
static int[] dy = {0,0,1,-1};
public int solution(String[] board) {
int Ocnt = 0; //선공 개수
int Xcnt = 0; //후공 개수
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(board[i].charAt(j) == 'O') Ocnt++;
if(board[i].charAt(j) == 'X') Xcnt++;
}
}
// System.out.println(Ocnt+" "+Xcnt);
if(Ocnt < Xcnt) return 0; //선공의 개수가 더 적으면 비정상
if(Ocnt >= Xcnt+2) return 0; //두 말의 개수가 2이상 차이 나면 비정상
if(Ocnt==0 && Xcnt==0) return 1; //더 빠른 답 제출ㅎㅎ
boolean Otick = ticktackto(board, 'O');
boolean Xtick = ticktackto(board, 'X');
if(Otick && Xtick) return 0;
return 1;
}
static boolean ticktackto(String[] board, char target) {
//가로
for(int i=0; i<3; i++) {
//3개가 모여야 하니까 시작점이 타겟과 맞을 때만 확인
if(board[i].charAt(0) == target) {
if(board[i].charAt(1)==target && board[i].charAt(2)==target) return true;
}
}
//세로
for(int j=0; j<3; j++) {
if(board[0].charAt(j) == target) {
if(board[1].charAt(j)==target && board[2].charAt(j)==target) return true;
}
}
//대각선 -- 1,1이 target이어야 성립
if(board[1].charAt(1) == target) {
if(board[0].charAt(0)==target && board[2].charAt(2)==target ||
board[0].charAt(2)==target && board[2].charAt(0)==target) return true;
}
return false;
}
}
3줄이 완성된 게 있으면, 다시 한 번 수를 따져야 함
class Solution {
static int[] dx = {1,-1,0,0}; //상하 좌우 -> 대각선
static int[] dy = {0,0,1,-1};
public int solution(String[] board) {
int Ocnt = 0; //선공 개수
int Xcnt = 0; //후공 개수
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(board[i].charAt(j) == 'O') Ocnt++;
if(board[i].charAt(j) == 'X') Xcnt++;
}
}
// System.out.println(Ocnt+" "+Xcnt);
if(Ocnt < Xcnt) return 0; //선공의 개수가 더 적으면 비정상
if(Ocnt >= Xcnt+2) return 0; //두 말의 개수가 2이상 차이 나면 비정상
if(Ocnt==0 && Xcnt==0) return 1; //더 빠른 답 제출ㅎㅎ
boolean Otick = ticktackto(board, 'O');
boolean Xtick = ticktackto(board, 'X');
// if(Otick && Xtick) return 0;
//선공이 이길 경우 => 후공의 개수 + 1 == 선공의 개수
if(Otick && Ocnt != Xcnt+1) return 0;
//후공이 이길 경우 => 후공의 개수 == 선공의 개수
if(Xtick && Ocnt != Xcnt) return 0;
return 1;
}
static boolean ticktackto(String[] board, char target) {
//가로
for(int i=0; i<3; i++) {
//3개가 모여야 하니까 시작점이 타겟과 맞을 때만 확인
if(board[i].charAt(0) == target) {
if(board[i].charAt(1)==target && board[i].charAt(2)==target) return true;
}
}
//세로
for(int j=0; j<3; j++) {
if(board[0].charAt(j) == target) {
if(board[1].charAt(j)==target && board[2].charAt(j)==target) return true;
}
}
//대각선 -- 1,1이 target이어야 성립
if(board[1].charAt(1) == target) {
if(board[0].charAt(0)==target && board[2].charAt(2)==target ||
board[0].charAt(2)==target && board[2].charAt(0)==target) return true;
}
return false;
}
}
// if(Otick && Xtick) return 0;
//선공이 이길 경우 => 후공의 개수 + 1 == 선공의 개수
if(Otick && Ocnt != Xcnt+1) return 0;
//후공이 이길 경우 => 후공의 개수 == 선공의 개수
if(Xtick && Ocnt != Xcnt) return 0;
이 부분을 추가해야 한다.
if(Otick && Xtick)을 주석 처리한 이유 => 어짜피 아래에서 걸리게 되기 때문!
하지만 이 코드를 추가하면 아주 약간이나마 빨라질 순 있을 거 같다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
호텔 대실 (0) | 2024.08.19 |
---|---|
억억단을 외우자 ****** (0) | 2024.07.31 |
숫자 변환하기 (0) | 2024.07.25 |
석유 시추 (0) | 2024.07.18 |
순위검색 ** (다시 풂) (0) | 2024.07.15 |