[BOJ/Swift] Silver4 - 빙고

·2024년 7월 1일
0

알고리즘

목록 보기
6/6

요구사항 분석

구현 목표

  • 빙고게임 만들기

입력값

  • 빙고판 board : Int형 2차원 배열 5x5 사이즈
  • 사회자가 부르는 수 numList : Int형 2차원 배열 5x5 사이즈

함수 요구 기능

  • 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우를 카운트하여 bingoCount 에 저장한다.
  • 사회자가 부른 숫자를 입력 받아, 숫자의 위치를 보드에 기록하는 bingo(_ num: Int) 메서드를 구현한다.
    • 빙고 기록은 isChecked 라는 Bool 타입의 2차원배열에서 진행된다. board를 순회하며 부른 숫자의 좌표를 찾아 isCheckedtrue로 입력한다.
  • 숫자를 외칠 때마다 board 를 순회하며 빙고 개수를 세는 checkBingo 메서드를 구현한다.
    • 가로 행, 세로 열, 오른쪽/왼쪽 대각선을 검사한다.
    • 각 행, 열 또는 대각선에 있는 요소끼리 Bool 연산을 하여 연산값이 true일 경우, bingoCount를 1증가한다
  • 숫자를 부를 때마다 빙고 개수를 검사한다. bingoCount 가 3이상이 될 경우에, 외친 숫자의 순번을 출력한다.

키워드

  • readLine

전체코드

import Foundation

var bingoCount: Int = 0
var answer: Int = 0

var board: [[Int]] = [[Int]](repeating: [Int](repeating: 0, count: 5), count: 5)
var isChecked: [[Bool]] = [[Bool]](repeating: [Bool](repeating: false, count: 5), count: 5)

// 부른 숫자 O처리
func bingo(_ num: Int) {
    for i in 0..<board.count {
        for j in 0..<board[i].count {
            if board[i][j] == num {
                isChecked[i][j] = true
                return
            }
        }
    }
}

// 성공한 빙고가 몇 개인지 검사하는 메서드
func checkBingo() {
    bingoCount = 0
    var isBingo: Bool = true
    
    // 가로 행
    for i in 0..<isChecked.count {
        isBingo = true
        for j in 0..<isChecked[i].count {
            isBingo = isBingo && isChecked[i][j]
        }
        if (isBingo) {
            bingoCount += 1
        }
    }
    
    // 세로 열
    for i in 0..<isChecked.count {
        isBingo = true
        for j in 0..<isChecked[i].count {
            isBingo = isBingo && isChecked[j][i]
        }
        if (isBingo) { 
            bingoCount += 1
        }
    }
    
    // 오른쪽 대각선
    isBingo = true
    for i in 0..<5 {
        for j in 0..<5 where i + j == 4 {
            isBingo = isBingo && isChecked[i][j]
        }
    }
    if (isBingo) {
        bingoCount += 1
    }
    
    // 왼쪽 대각선
    isBingo = true
    for i in 0..<5 {
        for j in 0..<5 where i == j {
            isBingo = isBingo && isChecked[i][j]
        }
        
    }
    if (isBingo) {
        bingoCount += 1
    }
    
    // 기존의 대각선 체크 코드
//    if (isChecked[0][4] && isChecked[1][3] && isChecked[2][2] && isChecked[3][1] && isChecked[4][0]) { bingoCount += 1 }
//    if (isChecked[0][0] && isChecked[1][1] && isChecked[2][2] && isChecked[3][3] && isChecked[4][4]) { bingoCount += 1 }
}

func main() {

    var numList: [[Int]] = [[Int]](repeating: [Int](repeating: 0, count: 5), count: 5)
    
    // 빙고판 초기화
    for index in 0..<board.count {
        board[index] = readLine()!.components(separatedBy: " ").map {
            Int(String($0))!
        }
    }
    
    // 부른 숫자 배열 초기화
    for index in 0..<numList.count {
        numList[index] = readLine()!.components(separatedBy: " ").map {
            Int(String($0))!
        }
    }
    
    // 부른 숫자를 순회하면서 성공한 빙고의 개수가 3개를 넘어갔을 경우 break
    // 숫자를 부를 때마다 빙고여부를 확인
    for num in numList {
        if (bingoCount >= 3) { break };
        for n in num {
            answer += 1
            bingo(n)
            checkBingo()
            if (bingoCount >= 3) { break };
        }
    }
    
    print(answer)
}

main()
profile
SOOP

0개의 댓글