λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
3️⃣ Swift/Problem Solving

[Swift Algorithm] λ°© λ°°μ • BOJ #13300

by seolhee2750 2021. 7. 30.
문제 μ„€λͺ…

정보 μ΄ˆλ“±ν•™κ΅μ—μ„œλŠ” λ‹¨μ²΄λ‘œ 2λ°• 3일 μˆ˜ν•™μ—¬ν–‰μ„ κ°€κΈ°λ‘œ ν–ˆλ‹€. μ—¬λŸ¬ 학년이 같은 μž₯μ†Œλ‘œ μˆ˜ν•™μ—¬ν–‰μ„ κ°€λ €κ³  ν•˜λŠ”λ° 1ν•™λ…„λΆ€ν„° 6ν•™λ…„κΉŒμ§€ 학생듀이 묡을 방을 λ°°μ •ν•΄μ•Ό ν•œλ‹€. 남학생은 남학생끼리, 여학생은 여학생끼리 방을 λ°°μ •ν•΄μ•Ό ν•œλ‹€. λ˜ν•œ ν•œ λ°©μ—λŠ” 같은 ν•™λ…„μ˜ 학생듀을 λ°°μ •ν•΄μ•Ό ν•œλ‹€. λ¬Όλ‘  ν•œ 방에 ν•œ λͺ…λ§Œ λ°°μ •ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

ν•œ 방에 λ°°μ •ν•  수 μžˆλŠ” μ΅œλŒ€ 인원 수 Kκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 쑰건에 맞게 λͺ¨λ“  학생을 λ°°μ •ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 방의 μ΅œμ†Œ 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

예λ₯Ό λ“€μ–΄, μˆ˜ν•™μ—¬ν–‰μ„ κ°€λŠ” 학생이 λ‹€μŒκ³Ό κ°™κ³  K = 2일 λ•Œ 12개의 방이 ν•„μš”ν•˜λ‹€. μ™œλƒν•˜λ©΄ 3ν•™λ…„ 남학생을 λ°°μ •ν•˜κΈ° μœ„ν•΄ λ°© 두 κ°œκ°€ ν•„μš”ν•˜κ³  4ν•™λ…„ μ—¬ν•™μƒμ—λŠ” 방을 λ°°μ •ν•˜μ§€ μ•Šμ•„λ„ 되기 λ•Œλ¬Έμ΄λ‹€.

ν•™λ…„ 여학생 남학생
1ν•™λ…„ 영희 λ™ν˜Έ, 동진
2ν•™λ…„ ν˜œμ§„, 상희 경수
3ν•™λ…„ 경희 λ™μˆ˜, 상철, 칠볡
4ν•™λ…„   λ‹¬ν˜Έ
5ν•™λ…„ μ •μˆ™ ν˜Έλ™, 건우
6ν•™λ…„ μˆ˜μ§€ 동건

 

μž…λ ₯

ν‘œμ€€ μž…λ ₯으둜 λ‹€μŒ 정보가 주어진닀. 첫 번째 μ€„μ—λŠ” μˆ˜ν•™μ—¬ν–‰μ— μ°Έκ°€ν•˜λŠ” 학생 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ N(1 ≤ N ≤ 1,000)κ³Ό ν•œ 방에 λ°°μ •ν•  수 μžˆλŠ” μ΅œλŒ€ 인원 수 K(1 < K ≤ 1,000)κ°€ 곡백으둜 λΆ„λ¦¬λ˜μ–΄ 주어진닀. λ‹€μŒ N 개의 각 μ€„μ—λŠ” ν•™μƒμ˜ 성별 S와 ν•™λ…„ Y(1 ≤ Y ≤ 6)κ°€ 곡백으둜 λΆ„λ¦¬λ˜μ–΄ 주어진닀. 성별 SλŠ” 0, 1쀑 ν•˜λ‚˜λ‘œμ„œ 여학생인 κ²½μš°μ— 0, 남학생인 κ²½μš°μ— 1둜 λ‚˜νƒ€λ‚Έλ‹€.

 

좜λ ₯

ν‘œμ€€ 좜λ ₯으둜 학생듀을 λͺ¨λ‘ λ°°μ •ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ 방의 수λ₯Ό 좜λ ₯ν•œλ‹€.

 

μž…μΆœλ ₯ 예제

μž…λ ₯

16 2
1 1
0 1
1 1
0 2
1 2
0 2
0 3
1 3
1 4
1 3
1 3
0 6
1 5
0 5
1 5
1 6

좜λ ₯

12

 

λ‚΄ 문제 풀이
import Foundation

let info = readLine()!.components(separatedBy: " ").map({Int($0)!})

var stuInfo = Array(repeating: Array(repeating: 0, count: 2), count: 6)
var result = 0

for _ in 0..<info[0] {
    let stu = readLine()!.components(separatedBy: " ").map({Int($0)!})
    stuInfo[stu[1]-1][stu[0]] += 1
}

for i in 0..<stuInfo.count {
    if stuInfo[i][0] % info[1] == 0 { result += stuInfo[i][0] / info[1] }
    else { result += (stuInfo[i][0] / info[1]) + 1 }
    
    if stuInfo[i][1] % info[1] == 0 { result += stuInfo[i][1] / info[1] }
    else { result += (stuInfo[i][1] / info[1]) + 1 }
}

print(result)
  • ν•™λ…„ 별(1...6ν•™λ…„) 남, λ…€ 방의 개수λ₯Ό λ‹΄κΈ° μœ„ν•œ 2차원 λ°°μ—΄ stuinfoλ₯Ό μƒμ„±ν•΄μ£Όμ—ˆλ‹€.
    => [[남, μ—¬], [남, μ—¬], [남, μ—¬], [남, μ—¬], [남, μ—¬], [남, μ—¬]]
    (λ¬Έμ œμ—μ„œ λ‚¨μžλŠ” 0, μ—¬μžλŠ” 1둜 ν‘œν˜„ν–ˆκΈ°μ— μ‰½κ²Œ ν’€μ΄ν•˜κΈ° μœ„ν•΄
    λ‚¨μž 방의 개수λ₯Ό 0번, μ—¬μž 방의 개수λ₯Ό 1번 배열에 μœ„μΉ˜μ‹œμΌ°λ‹€.)
  • 첫 번째 forλ¬Έμ—μ„œλŠ” μž…λ ₯받은 info 배열을 μˆœμ„œλŒ€λ‘œ κ²€μ‚¬ν•˜μ—¬ μ•žμ„œ λ§Œλ“  stuInfo 배열에
    ν•™λ…„, 남녀 방을 λ‚˜λˆ μ„œ 개수λ₯Ό μΆ”κ°€ν•΄μ£Όμ—ˆλ‹€.
  • 두 번째 forλ¬Έμ—μ„œλŠ” λ‚¨μž, μ—¬μžλ°© 각각
    λ‚˜λ¨Έμ§€ 연산을 μ΄μš©ν•˜μ—¬ ν•„μš”ν•œ 방의 개수λ₯Ό κ³„μ‚°ν•΄μ£Όμ—ˆλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • μ‰¬μš΄ λ¬Έμ œμ˜€μ§€λ§Œ, μ’€ 더 κ°„κ²°ν•˜κ²Œ ν’€ 수 μžˆλŠ” 방법이 μžˆμ„ 것 κ°™λ‹€.
    λ‹€μŒμ— ν•œ λ²ˆλ” 풀어보면 쒋을 것 κ°™λ‹€.

 


 

문제

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

 

λŒ“κΈ€