3442. Maximum Difference Between Even and Odd Frequency I
문제 설명
- 일반 문자열이 주어진다.
- 각각의 char의 빈도수를 파악해서 홀수 빈도수 - 짝수 빈도수의 가장 큰 값을 구하라
문제 풀이
class Solution {
func maxDifference(_ s: String) -> Int {
var dict = [Character: Int]()
for item in s {
dict[item, default: 0] += 1
}
var answer = (even: 0, odd: 0)
for item in dict {
let cnt = item.value
if cnt % 2 == 0 && cnt > answer.even {
answer.even = cnt
}
else if cnt % 2 == 1 && cnt > answer.odd {
answer.odd = cnt
}
}
return answer.odd - answer.even
}
}
최대차이라고 써있었는데, 분명히
maximum difference
라고 .. 근데 이게 03 < -1 이니 -1이 나오게 하라는 소리였다.
이렇게 되려면 결국 odd는 빈도수가 가장 크게, even은 가장 적게 유도를 해줘야한다.
이를 바탕으로 개선하면...
1차 개선 코드
class Solution {
func maxDifference(_ s: String) -> Int {
var dict = [Character: Int]()
for item in s {
dict[item, default: 0] += 1
}
var answer = (even: 100, odd: 0)
for item in dict {
let cnt = item.value
if cnt % 2 == 0 && cnt < answer.even {
answer.even = cnt
}
else if cnt % 2 == 1 && cnt > answer.odd {
answer.odd = cnt
}
}
return answer.odd - answer.even
}
}
이렇게 되긴했는데, 이게 보니까 굳이 알파벳으로 찾을 이유는 없기 때문에,
for item in dict
로 하지말고 for item in dict.values
로 수정해주면 더 빠르게 수행될 것 같았다.
최종 제출 코드
class Solution {
func maxDifference(_ s: String) -> Int {
var dict = [Character: Int]()
for item in s {
dict[item, default: 0] += 1
}
var answer = (even: 100, odd: 0)
for cnt in dict.values {
if cnt % 2 == 0 && cnt < answer.even {
answer.even = cnt
}
else if cnt % 2 == 1 && cnt > answer.odd {
answer.odd = cnt
}
}
return answer.odd - answer.even
}
}
타인의 코드
class Solution {
func maxDifference(_ s: String) -> Int {
var counts: [Character: Int] = [:]
var maxEven = 0
var maxOdd = 0
var minEven = 0
var minOdd = 0
for c in s {
counts[c, default: 0] += 1
}
for (_, n) in counts {
if n % 2 == 0 {
if minEven == 0 {
minEven = n
}
if n < minEven {
minEven = n
}
} else if n > maxOdd {
maxOdd = n
}
}
return maxOdd - minEven
}
}
사실상 로직은 동일한 것으로 보이고, 차이가 있다면 초기값일 때는 따로 계산을 안해주고 바로 갱신시켜줬다는점?
if minEven == 0 { minEven = n }
그리고 튜플이 아니라 각각의 변수로 접근해준게 살짝의 차이를 만들어낸 코드라고 알 수 있었다.