# 99클럽 코테 스터디 13일차 TIL - 단어 정렬 (백준 1181)

피터·2025년 4월 16일
0

오늘의 문제: 1181

알파벳 소문자로 이루어진 N개의 단어를 받아, 길이가 짧은 것부터, 길이가 같으면 사전 순으로 정렬하여 출력하는 문제이다. 단, 중복된 단어는 하나만 남기고 제거해야 한다.


🤔 문제 분석 및 초기 접근

문제의 요구사항은 명확했다:
1. 단어 중복 제거
2. 길이 오름차순 정렬
3. 길이가 같을 경우 사전 순 정렬

Swift의 Set 자료구조를 사용하면 중복 제거를 쉽게 처리할 수 있다고 생각했다. 정렬은 sorted 메서드에 커스텀 클로저를 전달하여 길이와 사전 순 조건을 구현하기로 했다.

// 초기 접근 코드 (Set 활용 및 정렬 로직)
var container = Set<String>()

let count = Int(readLine()!)!
for _ in 0..<count {
    let value = readLine()!
    container.insert(value)
}

let result = container.sorted {
    // 길이가 다르면 길이 오름차순
    if $0.count != $1.count {
        return $0.count < $1.count
    } else {
        // 길이가 같으면 사전 순 오름차순
        return $0 < $1
    }
}

// 초기에는 결과 배열을 직접 출력하려고 시도함 (예: print(result))

💡 핵심 아이디어 및 구현

핵심 아이디어는 Set을 이용한 중복 제거와 sorted 메서드의 비교 클로저를 올바르게 구현하는 것이었다.

// 최종 제출 코드 (정렬 및 출력 부분)
import Foundation // readLine() 사용을 위해 필요

var wordSet = Set<String>()

let n = Int(readLine()!)!
for _ in 0..<n {
    wordSet.insert(readLine()!)
}

let sortedWords = wordSet.sorted {
    if $0.count != $1.count {
        return $0.count < $1.count // 길이 비교
    } else {
        return $0 < $1 // 사전 순 비교
    }
}

// 각 단어를 개행 문자로 구분하여 출력
print(sortedWords.joined(separator: "\\n"))

🔄 코드 최적화 및 개선 (선택 사항)

현재 코드는 문제의 요구사항을 충족하며 충분히 간결하다. 추가적인 최적화보다는 출력 형식을 맞추는 것이 중요했다.


✅ 결과 및 회고

초기 코드는 로직 자체에는 큰 문제가 없었으나, 백준 문제의 특성상 출력 형식을 정확히 맞춰야 했다.
여러 번의 시도 끝에(틀림, n번 시도 틀림) 각 단어를 개행 문자로(\n) 구분하여 하나의 문자열로 만들어 출력해야 한다는 것을 깨달았다.
result 배열을 그대로 출력하는 대신 .joined(separator: "\n") 메서드를 사용하여 출력 형식을 맞추니 정답 처리가 되었다.

알고리즘 문제 풀이에서는 로직 구현만큼이나 입출력 형식을 정확히 지키는 것이 중요하다는 것을 다시 한번 느꼈다.


✨ 오늘 배운 점 정리

  • Set을 활용한 효율적인 중복 제거 방법
  • sorted 메서드와 사용자 정의 클로저를 이용한 다중 조건 정렬 (길이 우선, 사전 순 차선)
  • 알고리즘 문제 풀이 시 정확한 출력 형식 준수의 중요성 (.joined(separator: "\n") 활용)

profile
iOS 개발자입니다.

0개의 댓글