[Swift] [79일차] 3442_LEETCODE

·2025년 2월 25일
0

SwiftAlgorithm

목록 보기
83/105

3442. Maximum Difference Between Even and Odd Frequency I


문제 설명

  1. 일반 문자열이 주어진다.
  2. 각각의 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
}

그리고 튜플이 아니라 각각의 변수로 접근해준게 살짝의 차이를 만들어낸 코드라고 알 수 있었다.

profile
기억보단 기록을

0개의 댓글