티스토리 뷰

PS

[Swift] 백준_좋은 친구(3078)

희철 2023. 1. 10. 06:22

문제

 

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

 

3078번: 좋은 친구

첫째 줄에 N과 K가 주어진다. (3 ≤ N ≤ 300,000, 1 ≤ K ≤ N) 다음 N개 줄에는 상근이네 반 학생의 이름이 성적순으로 주어진다. 이름은 알파벳 대문자로 이루어져 있고, 2글자 ~ 20글자이다.

www.acmicpc.net

 

 

풀이

 

이전에 두 개의 배열로 구현했던 큐와 딕셔너리를 이용해 해결하였다.

 

등수 차이를 큐의 사이즈로 생각하고 append하다가 사이즈를 초과하게되면 등수 차이가 주어진 값보다 큰 것이므로 맨 앞의 원소를 제거하면서 진행하였다.

 

map을 이용해 이름의 길이를 큐에 넣고, 이름의 길이를 key로 갖는 value의 값을 1 더해주었다. 마찬가지로 제거될때는 -1을 해주어 좋은 친구의 수를 구하였따.

다시 말해서, 큐에 들어있는 친구들은 전부 등수차이가 K보다 작은 친구들이므로 이름의 길이만 확인해주면 되는 것이다. 그래서 새로운 원소가 큐에 들어왔을때, 큐에 들어있는 친구들 중에 이름의 길이가 같은 친구가 몇명 있는지 student[이름의 길이]로 확인하고 result에 더해준 것이다.

import Foundation

var input = readLine()!.split(separator: " ").map { Int(String($0))! }
let k = input[1]
var left: [Int] = []
var right: [Int] = []
var student: [Int: Int] = [:]
var result = 0
for _ in 0..<input[0] {
    if left.count + right.count > k {
        if right.isEmpty {
            right = left.reversed()
            left.removeAll()
        }
        student[right.removeLast()]! -= 1
    }
    left.append(readLine()!.map { $0 }.count)
    if student[left.last!] == nil {
        student[left.last!] = 1
    } else {
        student[left.last!]! += 1
    }
    result += student[left.last!]! - 1
}
print(result)

 

_____________________________________________________________________________________________________

 

이 문제와 비슷한 유형의 문제는 딕셔너리를 사용하는걸 생각해보기

'PS' 카테고리의 다른 글

[Swift] 백준_그림(1926)  (0) 2023.01.10
[Swift] 백준_뱀(3190)  (0) 2023.01.10
[Swift] 백준_AC(5430)  (0) 2023.01.09
[Swift] 백준_덱(10866)  (0) 2023.01.08
[Swift] 백준_Router(15828)  (0) 2023.01.08
댓글
최근에 올라온 글
Total
Today
Yesterday