본문 바로가기
Xcode/Swift - Algorithm

Swift) LeetCode(Easy) - Word-Pattern (Hash&String)

by 후르륵짭짭 2020. 8. 20.
728x90
반응형

leetcode.com/problems/word-pattern/

 

Word Pattern - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

안녕하세요 후르륵짭짭 입니다!

이번 문제는 쪼끔,,,, 난감했는데요... 문제를 잘 이해하기 못 했습니다... ㅠㅠ

일단 문제 설명이랑 저의 코드 부터 가겠습니다.

 

** 문제 설명 ** 

문제가 일단 패턴과 문자열을 줍니다.

그리고 이 문자열을 띄어쓰기를 기준으로 나눴을 때, 패턴과 문자열이 1 : 1 대칭 ( bijection ) 이 되는지 물어보는 거였습니다.

그러니깐 ,  패턴 = abea 이고 문자열은 dog cat fish dog 라고 한다면 서로 문자가 같은 것을 확인 할 수 있습니다.

왜냐하면 문자열을  a b e a 로 바꾼다면 패턴과 동일하기 때문입니다.

 

** 저의 풀이 ** 

class Solution {
    
    func wordPattern(_ pattern: String, _ str: String) -> Bool {
                
        var patterDict : [Character : String] = [:]
        var patterBet : Character = "a"
        var arrayPattern = pattern.map { (char) -> String in
            
            if let exist = patterDict[char] {
                return exist
            }
            else{
                patterDict[char] = String(patterBet)
                patterBet = Character( UnicodeScalar(patterBet.asciiValue! + 1) )
            }
            
            return String(patterDict[char]!)
        }

        
        var arrayStr = str.components(separatedBy: " ")
        var strDict : [String : String] = [:]
        var strBet : Character = "a"
        
        for (index , element) in arrayStr.enumerated() {

            if let exist =  strDict[element] {
                arrayStr[index] = exist
            }
            else{
                strDict[element] = String(strBet)
                arrayStr[index] = String(strBet)
                strBet = Character( UnicodeScalar(strBet.asciiValue! + 1) )
            }
        }
            
        return arrayPattern.joined() == arrayStr.joined() ? true : false
    }
    
}

저는 패턴과 문자열을 모두 Dictionary를 이용해서 abc 알파벳 순서로 바꿔줬습니다.

( 참고로 아스키 코드 값으로 변경 하기 위해서는 Character 타입에서 asciiValue 를 통해 Int8 값으로 변경 할 수 있습니다.

그리고 아스키 코드 값을 Character로 변경하기 위해서는 Character( UnicodeScalar( 숫자 ) ) 를 넣어주시면 됩니다. )

그리고 두 문자가 동일하다면 true를 아니면 false를 출력해줬습니다.

 

** 다른 사람의 코드 **

queeniepeng

func wordPattern(_ pattern: String, _ str: String) -> Bool {
        
        let words = str.split(separator: " ")
        let patterns = Array(pattern)
        
        if patterns.count != words.count || Set(patterns).count != Set(words).count { return false }
        
        var patternDict = [Character:Int]()
        for i in 0..<patterns.count {
            if let index = patternDict[patterns[i]] {
                if words[i] != words[index] { 
					return false 
				}
            } else {
                patternDict[patterns[i]] = i 
            }
        }
        return true
    }

이 분의 코드는 

패턴 = abea 이고 문자열은 dog cat fish dog 라고 한다면 

Dictionary를 이용해서 현재 문자와 배열 위치를 저장해줍니다.

그리고 패턴에서 동일 한 패턴이 나온다면 위치 값을 문자열 Index에 넣고 현재 Index 위치에서의 문자열 값과 비교해줍니다

항상 알고리즘은 좋은 코드를 봐야하는 것 같습니다 ㅎㅎㅎ

728x90
반응형

댓글