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 ?? ""
}
}
'ALGORITHM' 카테고리의 다른 글
[Swift] Codewars: Persistent Bugger (0) | 2022.11.08 |
---|---|
[Swift] 프로그래머스 Lv3. 표 편집 (구현) (0) | 2022.05.03 |
[Swift] LeetCode: Search Insert Position (lower bound) (0) | 2022.03.24 |
[Swift] 베스트앨범 (dictionary, 정렬) (0) | 2022.03.23 |
[Swift] LeetCode: Remove Duplicates from Sorted Array (inout) (0) | 2022.03.21 |