BOJ 1222 홍준 프로그래밍 대회 swift

2025. 6. 20. 12:31·알고리즘
문제 링크 : https://www.acmicpc.net/problem/1222

 

문제 해설

이 문제는 에라토스테네스의 체 방식을 활용한 최적화 문제입니다.

  • 팀원 수를 T라고 하면, 각 학교의 학생 수가 T로 나누어떨어져야 합니다.
  • 즉, T는 참가하는 학교들의 학생 수의 공약수여야 합니다.
  • 본선 참가자 수 = T * (참가 학교 수)를 최대화해야 합니다.
  • 최소 2개 학교가 참가해야 하므로, 각 팀원 수에 대해 참가 가능한 학교가 2개 이상인지 확인합니다.

코드

더보기
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 n = fIO.readInt()
var students = [Int]()
for _ in 0..<n {
    students.append(fIO.readInt())
}

let maxVal = students.max()!
var count = Array(repeating: 0, count: maxVal + 1)

// 각 학생 수의 빈도 계산
for student in students {
    count[student] += 1
}

var maxGroup = 0

// 에라토스테네스의 체 방식으로 배수 확인
for teamSize in 1...maxVal {
    var participatingSchools = 0

    // teamSize의 배수인 학생 수들을 모두 확인
    var multiple = teamSize
    while multiple <= maxVal {
        participatingSchools += count[multiple]
        multiple += teamSize
    }

    if participatingSchools >= 2 {
        maxGroup = max(maxGroup, teamSize * participatingSchools)
    }
}

print(maxGroup)

'알고리즘' 카테고리의 다른 글
  • BOJ 2142 정돈된 배열 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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
GwanSon
BOJ 1222 홍준 프로그래밍 대회 swift
상단으로

티스토리툴바