58청춘 2024. 9. 6. 20:50
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/160585

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이

이번 문제는 조건만 잘 찾아내면 간단한 구현 문제이다.

 

이 문제에서 답이 1이 나오는 경우는 다음과 같다.

O의 개수가 X의 수 보다 1 크며 O 빙고가 X 빙고 보다 많을 때, O의 개수가 X 개수와 같고 X 빙고가 더 많을 때, O 빙고와 X 빙고의 수가 0이고 O의 수가 X 보다 1클 때 이다.

 

중의해야할 점은 직선 뿐만 아니라 대각선으로도 빙고가 완성될 수 있으며, 틱택토 게임은 이기는 순서에 두개의 빙고를 완성해 이길 수 있다는 점을 명시하자(두 번째 조건을 생각못해 1차 풀이에서는 틀렸다).

 

코드

function solution(board) {
  let cnt = 0;
  let oT = 0;
  let xT = 0;
  const center = board[1][1];
    
  board.forEach(el => {
    let oC = 0;
    let xC = 0;
    for (let i = 0; i < 3; i++) {
      if (el[i] === 'O') {
        cnt += 1;
        oC += 1;
      }
      else if (el[i] === 'X') {
        cnt -= 1;
        xC += 1;
      }
    }
    if (oC === 3) oT += 1;
    else if (xC === 3) xT += 1;
  });
    
  for (let i = 0; i < 3; i++) {
    let oC = 0;
    let xC = 0;
    for (let j = 0; j < 3; j++) {
      if (board[j][i] === 'O') oC += 1;
      else if (board[j][i] === 'X') xC += 1;
    }
    if (oC === 3) oT += 1;
    else if (xC === 3) xT += 1;
  }
    
  if (center !== '.' && ((center === board[0][0] && center === board[2][2]) || (center === board[0][2] && center === board[2][0]))) {
    center === 'X' ? xT += 1 : oT += 1;
  }
    
  if (cnt < 0) return 0;
  else if ((oT > xT && cnt === 1) || (oT < xT && cnt === 0) || (oT === 0 && xT === 0 && cnt === 0) || (oT === 0 && xT === 0 && cnt === 1)) {
    return 1;
  }
  else return 0;
}
728x90