[JS|구현 알고리즘] 백준 2615번. 오목

2024. 4. 13. 01:46·💾 자료구조 & 알고리즘/문제 풀이

 


 

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

 

입력과 출력

  • 입력
    • 19 X 19 의 바둑판
  • 출력
    • 승부가 났다면, 이긴 바둑알의 숫자(검: 1, 흰: 2)와 성공한 5목 중 가장 왼/위쪽에 있는 바둑알의 좌표
    • 승부가 나지 않았다면, 0

 

문제 풀이 로직

  • 5목 완성할 수 있는 8방향 중 4방향만 선택하여 함수로 구현

 

  • 이유) 출력할 때 5목 중 가장 왼쪽이나 위쪽에 있는 위치를 출력해야 하기에, 시작점을 출력값을 잡을 때 가로/세로/오른쪽 상향/오른쪽 하향으로 비교 가능. 단, 6목을 확인할 때 양 쪽 끝 양방향 모두 확인하여 6목 방지.
  • Search2 : 세로 방향으로 5목 완성인지 확인
// 세로
function Search2(i, j) {
	// 6목 방지 위
  if (i !== 0 && Arr[i - 1][j] === Arr[i][j]) return false
	// 6목 방지 아래
  if (i !== 14 && Arr[i + 5][j] === Arr[i][j]) return false

  for (let k = 1; k < 5; k++) {
    if (Arr[i][j] !== Arr[i + k][j]) return false
  }
  return true
}
  • Search3 : 오른쪽 상향대각선으로 5목 완성인지 확인
// 상향 대각선
function Search3(i, j) {
	// 6목 방지 아래
  if (j !== 0 && i !== 18 && Arr[i + 1][j - 1] === Arr[i][j]) return false
	// 6목 방지 위
  if (j !== 14 && i !== 4 && Arr[i - 5][j + 5] === Arr[i][j]) return false

  for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i - k][j + k]) return false
  return true
}
  • Search4 : 오른쪽 하향대각선으로 5목 완성인지 확인
// 하향 대각선
function Search4(i, j) {
	// 6목 방지 위
  if (i !== 0 && j !== 0 && Arr[i - 1][j - 1] === Arr[i][j]) return false
	// 6목 방지 아래
  if (i !== 14 && j !== 14 && Arr[i + 5][j + 5] === Arr[i][j]) return false

  for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i + k][j + k]) return false
  return true
}

 

 

 

  • 오목 확인 함수 4가지를 실행하는 i와 j의 범위 지정하기
    • Search1 : 가로 5목 ( j < 15 )
      if (j < 15 && Search1(i, j)) {
        console.log(Arr[i][j])
        console.log(i + 1, j + 1)
        return
      }
      
    • Search2 : 세로 5목 ( i < 15 )
      if (i < 15 && Search2(i, j)) {
        console.log(Arr[i][j])
        console.log(i + 1, j + 1)
        return
      }
      
    • Search3 : 오른쪽 상향대각선 ( i > 3 && j < 15 )
      if (i > 3 && j < 15 && Search3(i, j)) {
        console.log(Arr[i][j])
        console.log(i + 1, j + 1)
        return
      }
      
    • Search4 : 오른쪽 하향대각선( i < 15 && j < 15 )
      if (i < 15 && j < 15 && Search4(i, j)) {
        console.log(Arr[i][j])
        console.log(i + 1, j + 1)
        return
      }

전체 코드

const fs = require('fs')
const path = process.platform === 'linux' ? '/dev/stdin' : 'input.txt'
Arr = fs
  .readFileSync(path)
  .toString()
  .trim()
  .split('\\n')
  .map((v) => v.split(' '))
let result = false

// 가로
function Search1(i, j) {
  if (j !== 0 && Arr[i][j - 1] === Arr[i][j]) return false
  if (j !== 14 && Arr[i][j + 5] === Arr[i][j]) return false
  for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i][j + k]) return false
  return true
}

// 세로
function Search2(i, j) {
  if (i !== 0 && Arr[i - 1][j] === Arr[i][j]) return false
  if (i !== 14 && Arr[i + 5][j] === Arr[i][j]) return false

  for (let k = 1; k < 5; k++) {
    if (Arr[i][j] !== Arr[i + k][j]) return false
  }
  return true
}

// 상향 대각선
function Search3(i, j) {
  if (j !== 0 && i !== 18 && Arr[i + 1][j - 1] === Arr[i][j]) return false
  if (j !== 14 && i !== 4 && Arr[i - 5][j + 5] === Arr[i][j]) return false

  for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i - k][j + k]) return false
  return true
}

// 하향 대각선
function Search4(i, j) {
  if (i !== 0 && j !== 0 && Arr[i - 1][j - 1] === Arr[i][j]) return false
  if (i !== 14 && j !== 14 && Arr[i + 5][j + 5] === Arr[i][j]) return false

  for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i + k][j + k]) return false
  return true
}

for (let i = 0; i < Arr.length; i++) {
  for (let j = 0; j < Arr.length; j++) {
    if (Arr[i][j] === '0') continue

    if (j < 15 && Search1(i, j)) {
      console.log(Arr[i][j])
      console.log(i + 1, j + 1)
      return
    }
    if (i < 15 && Search2(i, j)) {
      console.log(Arr[i][j])
      console.log(i + 1, j + 1)
      return
    }
    if (i > 3 && j < 15 && Search3(i, j)) {
      console.log(Arr[i][j])
      console.log(i + 1, j + 1)
      return
    }
    if (i < 15 && j < 15 && Search4(i, j)) {
      console.log(Arr[i][j])
      console.log(i + 1, j + 1)
      return
    }
  }
}
console.log('0')

'💾 자료구조 & 알고리즘/문제 풀이' 카테고리의 다른 글
  • [JS|구현 알고리즘] 백준 14719번. 빗물
  • [JS|구현 알고리즘] 백준 20055번. 컨베이어 벨트 위의 로봇
  • [JS|구현 알고리즘] 백준 17413번. 단어 뒤집기 2
  • [JS|구현 알고리즘] 백준 1244번. 스위치 켜고 끄기
상심한 개발자
상심한 개발자
  • 상심한 개발자
    상심한 개발자
    상심한 개발자
  • 전체
    오늘
    어제
    • 상심한 개발자 (36)
      • 📝 공부 기록 (4)
        • Javascript (3)
        • CS (1)
        • NodeJS (0)
      • 💻 개발 기록 (1)
        • Sring, 스터디 모집 및 관리 기능 통합 서비.. (1)
      • 💾 자료구조 & 알고리즘 (26)
        • 이론 정리 (13)
        • 문제 풀이 (13)
      • 📝 후기 및 회고록 (4)
      • etc. (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    array
    블로그
    배열
    자료구조
    삽질기록
    JavaScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상심한 개발자
[JS|구현 알고리즘] 백준 2615번. 오목
상단으로

티스토리툴바