본문 바로가기
코딩 테스트/백준

[백준] (Swift) 1157번: 단어 공부

by Dev.Andy 2023. 3. 22.

📌 문제

1157번: 단어 공부

 

 

📌 풀이 1: [Character: Int] 형태의 딕셔너리

딕셔너리를 이용해 주어진 문자열의 인덱스를 지날 때마다, 해당 값의 알파벳을 딕셔너리의 값에서 1을 더하는 식으로 문제를 풀었다.

 

 

📌 코드

// 입력 받은 문자열을 input에 할당
let input = readLine()!

// 함수에 input을 대입하여 출력
print(findWordOfMaxFrequency(input))

// 주어진 단어에서 가장 많이 사용된 알파벳을 대문자로 출력하는 함수 정의
func findWordOfMaxFrequency(_ word: String) -> Character {
    var charFrequency: [Character: Int] = [:]
    var maxCharFrequency: Int = 0
    var maxChar: Character = " "
    var flag: Int = 0
    var result: Character = " "

    // 입력된 단어를 모두 대문자로 바꿔 각 단어의 빈도수를 딕셔너리에 업데이트
    for alpha in word.uppercased() {
        if charFrequency[alpha] == nil {
            charFrequency[alpha] = 1 // 단어가 처음일 경우 빈도수를 1로 할당
        }
        else {
            // Optional<Int>을 강제로 해제
            charFrequency[alpha]! += 1  // 단어가 처음이 아니면 1 증가 후 대입
        }
    }

    // 앞서 업데이트한 단어와 빈도수의 딕셔너리에서 빈도수의 최댓값 찾기
    for (char, frequency) in charFrequency {
        // 최댓값이 바뀔 경우 가장 많이 사용된 단어와 그 빈도수를 업데이트
        if frequency > maxCharFrequency {
            maxChar = char
            maxCharFrequency = frequency
            flag = 0
        } else if frequency == maxCharFrequency && frequency != 0 {
            flag += 1 // 최댓값이 중복일 경우 flag 증가
        }
    }

    if flag == 0 {
        result = maxChar // flag가 0일 경우 가장 많이 사용된 단어 출력ㅌ
    } else {
        result = "?" // flag가 0이 아니면 중복되었으니 "?" 출력
    }

    // 결괏값을 반환
    return result
}

 

 

📌 풀이 2: 아스키 코드를 인덱스로 이용한 배열

이번에는 딕셔너리가 아닌 알파벳에 해당하는 아스키 코드를 배열의 인덱스로 사용하여 문제를 풀었다.

 

아래 영상을 통해 아이디어를 구했는데 풀이 1보다 더 쉽게 풀 수 있었다.

단어 공부 (1157, 브론즈 1, 문자열) - 자바 Java 백준 문제 풀이 - YouTube | 개발자로 취직하기

 

📌 코드 2: 아스키 코드를 인덱스로 이용한 배열

(업데이트 예정)

 

댓글