본문 바로가기

ALGORITHM

[Swift] LeetCode: Greatest English Letter in Upper and Lower Case (아스키코드)

https://leetcode.com/problems/greatest-english-letter-in-upper-and-lower-case/

 

문제

문자열 s를 주는데 여기서 소문자, 대문자가 모두 나온 문자 중 가장 큰 대문자를 리턴하는 문제입니다.

 

풀이방법

Set 배열하나와 result 배열 하나를 두어서 set 배열에는 s 문자열을 이루는 문자들을 모두 넣어주었습니다.

-> 근데 contains 함수를 사용하면 굳이 set 배열을 만들 필요가 없겠네요..

 

그리고 set 배열을 돌면서 소문자이면 대문자가 있는지, 대문자이면 소문자가 있는지 검사 후에 result 배열에 넣어주었습니다.

-> 소문자인지 대문자인지 구별하는 방법이 Swift5 에서 Character 값에 대해 isLowerCase 를 사용하면 되는 것으로 알고 있는데 릿코드에서 이를 오류로 내더라구요.. 그래서 "a" 값과 "z" 값 사이로 풀이하였습니다.

 

그리고 정렬 후 가장 큰 값을 출력하였습니다.

 

여기서 아스키코드 값을 사용했는데 Swift 에서 아스키코드를 사용하는 방법에 대해서 알아보겠습니다!

 

아스키코드  ➡  String

String(UnicodeScalar(65))

// A

UnicodeScalar(65)!  // 강제언래핑

// A (Scalar 타입)

 

String    아스키코드

Character("A").asciiValue!

// 65 (UInt8 타입)

 

 

class Solution {
    func greatestLetter(_ s: String) -> String {
        
        var set: Set<String> = []
        var result: [String] = []
        
        for char in s {
            set.insert(String(char))
        }
        
        for alpha in set {
            let char = Character(alpha)
            if "a" <= alpha && alpha <= "z"
                && set.contains(String(UnicodeScalar(char.asciiValue! - 32))) {
                result.append(String(UnicodeScalar(char.asciiValue! - 32)))
            } else if "A" <= alpha && alpha <= "Z" 
                && set.contains(String(UnicodeScalar(char.asciiValue! + 32))) {
                result.append(alpha)
            }
        }
        
        if result.isEmpty {
            return ""
        }
        
        result.sort()
        return result.last!
    }
}

 

 

 

오늘도 잘 푸는 외국인들의 풀이를 보면 Set을 사용하여 대문자로 넣은 후 교집합 (intersection) 을 사용하여 푸는 방법도 알 수 있습니다.

intersection() 함수도 기억해두기!

class Solution {
    func greatestLetter(_ s: String) -> String {
        var lowerCased: Set<String> = []
        var upperCased: Set<String> = []

        s.forEach{
            $0.isLowercase ? lowerCased.insert(String($0).uppercased()) : upperCased.insert((String($0)))
        }

        return lowerCased.intersection(upperCased).sorted().last ?? ""
    }
}