출처: 프로그래머스 코딩 테스트 연습
https://school.programmers.co.kr/learn/courses/30/lessons/160585
나의 풀이
public int solution(string[] board)
{
int count_O = 0;
int count_X = 0;
for(int y = 0; y < 3; ++y)
{
for(int x = 0; x < 3; ++x)
{
if(board[y][x] == 'O') ++count_O;
else if(board[y][x] == 'X') ++count_X;
}
}
// 선공은 2개이상 많을 수 없다.
if(count_O > count_X + 1) return 0;
// 후공은 선공보다 많을 수 없다.
if(count_X > count_O) return 0;
int bingo_O = 0;
int bingo_X = 0;
for(int y = 0; y < 3; ++y) // 가로
{
if(board[y] == "OOO") ++bingo_O;
else if(board[y] == "XXX") ++bingo_X;
}
for(int y = 0; y < 3; ++y) // 세로
{
if(board[0][y] == 'O' && board[1][y] == 'O' && board[2][y] == 'O') ++bingo_O;
else if(board[0][y] == 'X' && board[1][y] == 'X' && board[2][y] == 'X') ++bingo_X;
}
// 대각선
if(board[1][1] == 'O')
{
if((board[0][0] == 'O' && board[2][2] == 'O')) ++bingo_O;
if((board[0][2] == 'O' && board[2][0] == 'O')) ++bingo_O;
}
else if(board[1][1] == 'X')
{
if((board[0][0] == 'X' && board[2][2] == 'X')) ++bingo_X;
if((board[0][2] == 'X' && board[2][0] == 'X')) ++bingo_X;
}
// 둘 다 빙고를 만들 수 없다.
if(bingo_O > 0 && bingo_X > 0) return 0;
// 선공이 이겼는데 표식 갯수가 같으면 오류
if(bingo_O > bingo_X && count_O == count_X) return 0;
// 후공이 이겼는데 선공이 한번 더 진행했다면 오류
if(bingo_X > bingo_O && count_O > count_X) return 0;
return 1;
}
쉬운 문제인 줄 알았으나....
로직은 거의 없다시피하고 극한의 예외처리를 하는 문제이다.
여러 제외 조건들을 통합해서 최소화하는 문제.
크게보면 전체 배치된 표식의 갯수를 비교하고, 누가 이겼는지 여부에 따라 표식 갯수를 한번 더 체크한다.
'🛡️ 코딩테스트 > 🛡️ 코테 : 프로그래머스' 카테고리의 다른 글
C# 두 원 사이의 정수 쌍 - 원 안의 점 / 프로그래머스 [Lv.2] (0) | 2023.04.14 |
---|---|
C# 요격 시스템 - 정렬 / 프로그래머스 [Lv.2] (0) | 2023.04.13 |
C# 광물 캐기 - DFS / 프로그래머스 [Lv.2] (0) | 2023.04.11 |
C# 우박수열 - 정적분 / 프로그래머스 [Lv.2] (0) | 2023.04.09 |
C# 달리기 경주 - Dictionary / 프로그래머스 [Lv.1] (0) | 2023.04.08 |