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 13460 구슬 탈출 2 swift
  • BOJ 2142 정돈된 배열 swift
  • BOJ 3190 뱀 swift
  • BOJ 2449 전구 swift
GwanSon
GwanSon
귀찮음과 불편함을 해결하는 개발자가 되자.
  • GwanSon
    관슨의 개발일지
    GwanSon
  • 전체
    오늘
    어제
    • 분류 전체보기 (61)
      • iOS (4)
      • swift (16)
      • UIKit (0)
      • swiftUI (2)
      • 알고리즘 (9)
      • CS (8)
      • 면접 (11)
      • Flutter (6)
      • 회고 (2)
      • 잡담 (3)
  • 블로그 메뉴

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

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    2025 토스 Next
    FirebaseAuth
    토스
    네이버 부스트캠프 후기
    모듈화
    챌린지
    tuist
    Swift
    부스트캠프
    SDK
    android
    네이버 부스트캠프
    boj
    Firebase
    Flutter
    부스트캠프 10기
    fatal error
    백준
    구슬 탈출2
    ios
    후기
    Provider
    알고리즘
  • 최근 댓글

  • 최근 글

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

티스토리툴바