본문 바로가기

백준 PS일지/String

[백준/Swift] 1302: 베스트셀러 | PS일지

문제

 

1302번: 베스트셀러

첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고

www.acmicpc.net

간단한 문제 요약

오늘 하루 동안 팔린 책의 제목이 입력으로 들어왔을 때, 가장 많이 팔린 책의 제목을 출력하는 프로그램을 작성하시오.

 

고려해야 할 사항

  • 은 가장(최대) 많이 팔린 책의 이름이 출력되야 하는데, 가장 많이 팔린 책의 개수가 같다면, 사전순(최소)으로 가장 앞서는 제목 출력해야 합니다.

문제 풀이, 새로 배운 개념

팔린 책들 중 이름이 같은 책이 있기에, 배열로 저장하기 보단 딕셔너리로 저장했습니다. 그리고 max함수를 통해, value가 같을 경우에는 key값이 작은 순으로, value가 다르다면 value가 큰 순으로 출력을 하도록 했습니다.

 

var list: [String:Int] = [:]

 

저는 딕셔너리의 key값이 nil일 경우 딕셔너리에 없던 새로운 책이라 판단후 새로운 값을 부여했습니다.

 

_=(0..<Int(readLine()!)!).map{ _ in
  let s=readLine()!
  guard let v = list[s] else {
    list[s] = 1
    return
  }
  list[s] = v+1
}

 

그런데 딕셔너리에는 키가 없을 경우 디폴트 값을 부여하는 subscript가 있었습니다.

https://developer.apple.com/documentation/swift/dictionary/subscript(_:default:)

 

autoclousre 덕분에 list[s,default: {0}] 이렇게 하지 않고 list[s, default: 0] 이렇게 딕셔너리에 일치하는 키가 없다면 값을 0으로 부여할 수 있었습니다.

 

_=(0..<Int(readLine()!)!).map{ _ in list[readLine()!, default: 0] += 1 }

 

 

코드

var list: [String:Int] = [:]
_=(0..<Int(readLine()!)!).map{ _ in list[readLine()!, default: 0] += 1 }
print(list.max { return $0.value==$1.value ? $0.key>$1.key : $0.value<$1.value }!.key)