문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

단, 중복된 단어는 하나만 남기고 제거해야 한다.

입력

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

출력

조건에 따라 정렬하여 단어들을 출력한다.

풀이

1. 길이가 같으면 사전순, 다르면 길이수의 오름차순으로 정렬한다

2. 정렬된 대로 출력한다.

 

앞서 11650번 문제의 좌표정렬하기에서 2차원 배열을 sort로 정렬하여 출력했었다.

같은 방법으로 string을 받아 길이 비교 후 사전순으로 정렬을 했는데 시간 초과가 떴다

더이상 시간을 줄일 수 없어서 배열 보다 빠른 Set 을 사용했다

 

Set은 

1. 정렬되지 않은 컬렉션

2. 중복된 요소를 허용하지않는다

3. 해시를 통해 값을 저장

 -> 배열에 비해 검색 속도가 빠르다.

4. 저장되는 자료형은 Hashable 프로토콜 준수

 

이 문제를 풀땐 배열보다 빠르다는 장점만 보고 사용했다

아슬아슬 하게 시간초과는 면했다

 

import Foundation

func test() {
    guard let input = Int(readLine()!) else {return}
    var strSet = Set<String>()
    for i in 0..<input {
        guard let str = readLine() else {return}
        strSet.insert(str)
    }
    var sortedSet = strSet.sorted{ if $0.count == $1.count {
        return $0 < $1
    } else {
        return $0.count < $1.count
    }}
    for i in sortedSet {
        print(i)
    }
}
test()

 

'코딩테스트 > 백준' 카테고리의 다른 글

BOJ-18870 좌표 압축 Swift  (0) 2023.04.06
BOJ-10814 나이순 정렬 Swift  (0) 2023.04.05
BOJ-11650,11651 좌표 정렬하기 Swift  (0) 2023.04.05
BOJ-1427 소트인사이드 Swift  (0) 2023.04.05
BOJ-1436 영화감독 숌 Swift  (0) 2023.04.05

+ Recent posts