본문 바로가기

코테

[구현 + 시뮬레이션] 백준 2578번: 빙고

https://www.acmicpc.net/problem/2578

 

2578번: 빙고

첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로

www.acmicpc.net

난이도

실버 4

사용언어

Swift

카테고리

구현 + 시뮬레이션

풀이과정

이중 Int 배열의 빙고판을 만들고,

행, 열, 왼쪽 대각, 오른쪽 대각의 주어진 수를 카운팅 할 수 있는 변수를 만들어 준다.

입력된 수를 빙고판을 통해 좌표를 얻고, 해당 좌표를 통해 행과 열의 변수에 카운팅 한다.

만약, 좌표의 x, y 값이 같거나 둘의 합이 4인 경우 대각의 위치한 수이기 때문에 대각 변수에 추가로 카운팅 한다.

변수가 값이 5가 되는 변수가 3개 이상이 되었을 때 종료하면 끝.

var bingoBoard: [[Int]] = []
var visitedY: [Int] = Array(repeating: 0, count: 5)
var visitedX: [Int] = Array(repeating: 0, count: 5)
var visitedD1 = 0
var visitedD2 = 0
for _ in 0..<5 {
  let y = readLine()!.split(separator: " ").map { Int($0)! }
  bingoBoard.append(y)
}

var count = 0
var result = 0

for _ in 0..<5 {
  let numbers = readLine()!.split(separator: " ").map { Int($0)! }
  for number in numbers {
    if count >= 3 { break }
    result += 1
    let y = bingoBoard.firstIndex { $0.contains(number) }!
    let x = bingoBoard[y].firstIndex(of: number)!
    visitedY[y] += 1
    if visitedY[y] == 5 { count += 1 }
    visitedX[x] += 1
    if visitedX[x] == 5 { count += 1 }
    if y == x {
      visitedD1 += 1
      if visitedD1 == 5 { count += 1 }
    }
    if y + x == 4 {
      visitedD2 += 1
      if visitedD2 == 5 { count += 1 }
    }
  }
  if count >= 3 { break }
}
print(result)