본문 바로가기

iOS 앱 개발자 프로젝트/알고리즘 코드카타

[Algorithm] 대충 만든 자판 (w/ Swift)

keymap과 targets라는 두 개의 문자열 배열을 입력 받아 결과를 return하는 문제


 

대충 만든 자판 (shortcuts)

 

func solution(_ keymap: [String], _ targets: [String]) -> [Int] {
    var dict = [String: Int]()
    var keymap = keymap.map { $0.map { String($0) } }
    var result = [Int]()
    
    for k in keymap {
        for i in k {
            if dict[i] == nil {
                dict[i] = k.firstIndex(of: i)!
            } else {
                dict[i] = min(dict[i]!, k.firstIndex(of: i)!)
            }
        }
    }
    
    for target in targets {
        var sum = 0
        for t in target.map { String($0) } {
            if dict[t] == nil {
                sum = -1
                break
            } else {
                sum += dict[t]! + 1
            }
        }
        result.append(sum)
    }
    
    return result
}

 

#1

함수 내부에서는 먼저 빈 dict를 생성. 그리고 keymap을 문자열 배열로 변환한 다음, 각 문자열을 한 글자씩 나누어서 다시 문자열로 변환한다.

 

#2

keymap을 순회하면서 각 문자열의 글자들을 처리.

dict 에서 각 글자와 해당 글자가 처음 나타나는 인덱스를 저장한다. 만약 dict에 해당 글자가 없다면, 현재 글자의 인덱스를 저장. 이미 dict에 해당 글자가 존재한다면, 현재 글자의 인덱스와 기존에 저장된 인덱스 중 작은 값을 저장. 이렇게 함으로써 dict에는 각 글자의 가장 작은 인덱스가 저장된다.

 

#3

targets 배열을 순회하면서 각 문자열을 처리.

sum 변수를 0으로 초기화하고 각 문자열을 한 글자씩 나누어서 처리. 만약 현재 글자가 dict에 존재하지 않는다면, sum을 -1로 설정하고 반복문을 종료한다. 그렇지 않은 경우에는 sum에 해당 글자의 인덱스에 1을 더한 값을 더해준다.마지막으로 결과 배열인 result에 sum 값을 추가하고, 모든 처리가 끝나면 result를 반환한다. 끝!

 

 

 

( 주석을 넣은 코드도 추가해 둔다 ▽ )

func solution(_ keymap: [String], _ targets: [String]) -> [Int] {
    var dict = [String: Int]() // 각 문자의 최소 인덱스를 저장하는 딕셔너리
    var keymap = keymap.map { $0.map { String($0) } } // keymap을 문자열 배열로 변환
    var result = [Int]() // 결과를 저장할 배열
    
    // keymap 처리: 각 문자의 최소 인덱스를 딕셔너리에 저장
    for k in keymap {
        for i in k {
            if dict[i] == nil {
                dict[i] = k.firstIndex(of: i)! // 최초 등장한 인덱스 저장
            } else {
                dict[i] = min(dict[i]!, k.firstIndex(of: i)!) // 이미 저장된 인덱스와 비교하여 더 작은 값 저장
            }
        }
    }
    
    // targets 처리: 각 문자열에 대해 최소 인덱스 합산
    for target in targets {
        var sum = 0
        for t in target.map { String($0) } {
            if dict[t] == nil {
                sum = -1 // 딕셔너리에 문자가 없는 경우 -1로 설정
                break
            } else {
                sum += dict[t]! + 1 // 해당 문자의 최소 인덱스에 1을 더하여 합산
            }
        }
        result.append(sum) // 결과 배열에 합산 결과 추가
    }
    
    return result // 결과 배열 반환
}