TLI/코드카타

2024.05.29 TIL 코트카타 66번(대충만든자판)

jaeseonyoo 2024. 5. 29. 21:00
    fun solution(keymap: Array<String>, targets: Array<String>): IntArray {

        var minPushs = IntArray(26)
        for(minPushsIndex in 0..minPushs.size-1) {
            minPushs[minPushsIndex] = Integer.MAX_VALUE
        }

        for (keySequence in keymap) {
            for(keySequenceIndex in 0..keySequence.length-1) {
                val currentAlphabet = keySequence[keySequenceIndex]
                val minPushsIndex = currentAlphabet.code - 65
                minPushs[minPushsIndex] = minPushs[minPushsIndex].coerceAtMost(keySequenceIndex + 1)
            }
        }

        var answer = IntArray(targets.size)
        for(targetIndex in 0..targets.size-1) {
            val currentTarget = targets[targetIndex]
            for(currentTargetIndex in 0..currentTarget.length-1) {
                val minPush = minPushs[currentTarget[currentTargetIndex].code - 65]
                if(minPush == Integer.MAX_VALUE) {
                    answer[targetIndex] = -1
                    break
                }

                answer[targetIndex] += minPush
            }
        }
        return answer
    }

 

풀이 과정

1. keyMap에서 모든 알파벳에 대해 최소 클릭 횟수를 찾아 배열에 넣는다.

   - 0~25( A~Z ) 인덱스를 가지는 배열(minPushs)을 만들어서 아스키코드로 인덱스에 접근해 최솟값을 계속해서 갱신한다.

   - keyMap을 다 탐색한 후에도 처음 초기화했던 Integer.MAX_VALUE 값으로 유지되고 있으면 해당 알파벳은 입력이 불가한 것이다.

 

2. targets에 있는 문자열을 이미 구한 최소 클릭횟수 배열에서 알파벳을 아스키코드로  접근해 최소 클릭횟수를 찾는다.

   - Integer.MAX_VALUE를 가지는 알파벳이 하나라도 있으면 입력이 불가하므로 더이상 탐색하지 않는다.

 

포인트

- 아스키코드 값으로 인덱스에 접근하는 배열을 만드는 것