BOJ 2142 정돈된 배열 swift

2025. 6. 22. 14:57·알고리즘
문제 링크 : https://www.acmicpc.net/problem/2142

 

 

문제 해설

처음 문제를 풀 땐 제한조건을 보지 않고 브루트포스로 작성을 했다가 시간초과를 맞았습니다.

시간초과 문제를 해결하기 위해선 코드를 최적화할 필요가 있었습니다.

해당 문제는 이미 정돈된 배열을 사용하는 것이기에 인접 배열이 조건을 충족하는지만 확인하면 됐습니다.

  • 정돈 조건 : A[i][j] + A[k][l] <= A[i][l] + A[k][j]

 

코드

더보기
import Foundation

final class FileIO {
    private let buffer:[UInt8]
    private var index: Int = 0

    init(fileHandle: FileHandle = FileHandle.standardInput) {

        buffer = Array(try! fileHandle.readToEnd()!)+[UInt8(0)] // 인덱스 범위 넘어가는 것 방지
    }

    @inline(__always) private func read() -> UInt8 {
        defer { index += 1 }

        return buffer[index]
    }

    @inline(__always) func readInt() -> Int {
        var sum = 0
        var now = read()
        var isPositive = true

        while now == 10
                || now == 32 { now = read() } // 공백과 줄바꿈 무시
        if now == 45 { isPositive.toggle(); now = read() } // 음수 처리
        while now >= 48, now <= 57 {
            sum = sum * 10 + Int(now-48)
            now = read()
        }

        return sum * (isPositive ? 1:-1)
    }

    @inline(__always) func readString() -> String {
        var now = read()

        while now == 10 || now == 32 { now = read() } // 공백과 줄바꿈 무시

        let beginIndex = index-1

        while now != 10,
              now != 32,
              now != 0 { now = read() }

        return String(bytes: Array(buffer[beginIndex..<(index-1)]), encoding: .ascii)!
    }

    @inline(__always) func readByteSequenceWithoutSpaceAndLineFeed() -> [UInt8] {
        var now = read()

        while now == 10 || now == 32 { now = read() } // 공백과 줄바꿈 무시

        let beginIndex = index-1

        while now != 10,
              now != 32,
              now != 0 { now = read() }

        return Array(buffer[beginIndex..<(index-1)])
    }
}

let fIO = FileIO()


let t = fIO.readInt()

for _ in 0..<t {
    let n = fIO.readInt()
    let m = fIO.readInt()

    var arr = [[Int]](repeating: [Int](repeating: 0, count: m), count: n)
    for i in 0..<n {
        for j in 0..<m {
            arr[i][j] = fIO.readInt()
        }
    }

    var isSorted = true

    outerLoop: for i in 0..<n-1 {
        for j in 0..<m-1 {
            // (i,j), (i,j+1), (i+1,j), (i+1,j+1) 확인
            if arr[i][j] + arr[i+1][j+1] > arr[i][j+1] + arr[i+1][j] {
                isSorted = false
                break outerLoop
            }
        }
    }

    print(isSorted ? "YES" : "NO")
}

 

'알고리즘' 카테고리의 다른 글
  • BOJ 1222 홍준 프로그래밍 대회 swift
  • BOJ 3190 뱀 swift
  • BOJ 2449 전구 swift
  • BOJ 1799 비숍
GwanSon
GwanSon
버그는 도전, 코드는 해결. 열정있는 개발을 하자.
  • GwanSon
    관슨의 개발일지
    GwanSon
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • iOS (3)
      • swift (15)
      • UIKit (0)
      • swiftUI (2)
      • 알고리즘 (8)
      • CS (8)
      • 면접 (11)
      • Flutter (4)
      • 회고 (2)
      • 잡담 (3)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    tuist
    2025 토스 Next
    토스
    부스트캠프 10기
    챌린지
    네이버 부스트캠프 후기
    백준
    모듈화
    부스트캠프
    ios
    boj
    네이버 부스트캠프
    후기
    Swift
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
GwanSon
BOJ 2142 정돈된 배열 swift
상단으로

티스토리툴바