알고리즘/백준

[백준/swift] 13300번: 방 배정

녕이 2022. 12. 13. 17:10
728x90

 

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

 

13300번: 방 배정

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 수학여행에 참가하는 학생 수를 나타내는 정수 N(1 ≤ N ≤ 1,000)과 한 방에 배정할 수 있는 최대 인원 수 K(1 < K ≤ 1,000)가 공백으로 분리되어

www.acmicpc.net

 

c++만 하다가 swift로 하려고 하니... 시간이 더 걸렸다...^^

헷갈려~~ 그래도 이제 입력은 익숙해진...ㅎ

 

2차원 배열을 만들어서 성별행, 학년열로 개수 카운팅

k보다 작으면 1 추가, 그 이상이면 딱 나눠지면 상관없지만 나머지 학생이 있을 수 있으므로 남은 애들을 위한 방 추가하기

 

1 ) studenNumber / k

    만약 5명을 3명씩 넣는다면 5 / 3 = 1 인데 나머지 학생은 어디서 자?

    이 공식은 아님

 

2 ) studentNumber / k + 1

     만약 5명을 3명씩 넣는다면 5 / 3 + 1 = 2 인데, 4명을 3명씩 넣는다면 4 / 3 + 1 = 2

     6명을 3명씩 넣는다면 6 / 3 + 1 = 3.. 누굴 위한 방인가

     이 공식도 아님

 

3 ) (studentNumber + 1) / k

     만약 5명을 3명씩 넣는다면 6 / 3 = 2 인데, 4명을 3명씩 넣는다면 5 / 3 = 1 나머지 한명 탈락ㅠ

     이 공식도 아님

 

4) (studentNumber - 1) / k + 1

     만약 5명을 3명씩 넣는다면 4 / 3 + 1 = 2 인데, 4명을 3명씩 넣는다면 3 / 3 + 1 = 2

     6명을 3명씩 넣는다면 5 / 3 + 1 = 2

     드디어!

 

import Foundation

/*
 성별끼리, 같은 학년끼리
 한방에 배정할 수 있는 최대 인원 수 K
 모든 학생을 배정하기 위해 필요한 방의 최소 개수 구하기
 */

var answer = 0
let nk = readLine()!.split(separator: " ").map{Int(String($0))!}
var student = Array(repeating: Array(repeating: 0, count: 7), count: 2)
for _ in 0..<nk[0] {
    let st = readLine()!.split(separator: " ").map{Int(String($0))!}
    student[st[0]][st[1]] += 1
}
for i in 0..<2 {
    for j in 1...6 {
        guard student[i][j] != 0 else { continue }
        answer += student[i][j] < nk[1] ? 1 : (student[i][j] - 1) / nk[1] + 1
    }
}
print(answer)

 

 

728x90