프로그래머스

[프로그래머스][Kotlin]대충 만든 자판

끝까지 처음처럼 2023. 2. 26. 00:33
728x90

해당 문제는 코드를 2개를 작성하여 풀어 보았습니다.

처음 코드를 작성하였을 때는 value 값에 정상적인 값이 나올 수 없는 값을 설정하여 구분하였고,

두번째는 map에 문자별로 가장 가까운 값을 저장하여 구하는 방식으로 코드를 작성하였습니다.

 

그리고 작성하면서 첫번째 코드의 경우 머리속에서 정리가 좀 어려웠던 반면, 두번째 코드는 작성하면서 머리속에서 첫번째 코드와 비교 했을때 헷갈리지 않았었습니다.

그리고 두번째의 코드의 경우 추후 비슷한 문제에서 keymap, targets 의 자료의 양이 늘어나더라도 반복문 자체만 따졌을경우 첫번째 코드는 통과하지 못할 확률이 높지만 두번째 코드는 통과 할 확률이 매우 높습니다.

제가 첫번째 코드를 하기처럼 작성했던 까닭은 자료의 양을 생각했을때 3중 for문을 돌려도 시간초과가 나지 않을 양이였기에 그냥 생각나는 대로 작성을 해봤었습니다.

 

하기는 제가 작성한 코드와 코드 별 실행시간 입니다.

 

첫번재 코드(value 값에 정상적인 값이 나올 수 없는 값을 설정하여 구분)

import java.lang.Math.min

class Solution {
    fun solution(keymap: Array<String>, targets: Array<String>): IntArray {
        var answer = IntArray(targets.size){0}

        for(i in 0 .. targets.size-1){
            var arr = targets[i].toCharArray()
            var count = 0
            for(j in 0 .. arr.size-1){ // targets 내 값 조회
                var idx = 101
                var inchk = false
                for(k in 0 .. keymap.size-1){
                    if(keymap[k].contains(arr[j])){
                        idx = min(idx,keymap[k].indexOf(arr[j])+1)
                        inchk = true
                    }
                }
                if(inchk){
                    count += idx
                } else {
                    count += 100000
                }
            }
            if(count >= 100000){
                answer[i] = -1
            } else {
                answer[i] = count
            }
        }
        return answer
    }
}

실행결과

테스트 1 통과 (12.13ms, 60.8MB)
테스트 2 통과 (7.80ms, 62.5MB)
테스트 3 통과 (10.76ms, 60.9MB)
테스트 4 통과 (8.27ms, 60.9MB)
테스트 5 통과 (9.06ms, 61.3MB)
테스트 6 통과 (8.48ms, 62MB)
테스트 7 통과 (10.39ms, 60.7MB)
테스트 8 통과 (7.79ms, 60.7MB)
테스트 9 통과 (9.02ms, 60.7MB)
테스트 10 통과 (10.84ms, 60.1MB)
테스트 11 통과 (7.58ms, 60.9MB)
테스트 12 통과 (7.99ms, 62.1MB)
테스트 13 통과 (7.58ms, 63.4MB)
테스트 14 통과 (28.37ms, 61.2MB)
테스트 15 통과 (40.38ms, 60.9MB)
테스트 16 통과 (31.37ms, 61.5MB)
테스트 17 통과 (32.76ms, 61.2MB)
테스트 18 통과 (28.05ms, 62.3MB)
테스트 19 통과 (32.20ms, 62.2MB)
테스트 20 통과 (24.51ms, 61.8MB)
테스트 21 통과 (40.66ms, 60.8MB)
테스트 22 통과 (30.43ms, 61.8MB)
테스트 23 통과 (29.37ms, 61MB)

 

두번째 코드(map에 문자별로 가장 가까운 값을 저장하여 구하는 방식)

import java.lang.Math.min

class Solution {
    fun solution(keymap: Array<String>, targets: Array<String>): IntArray {
        var answer = IntArray(targets.size){-1}

        var map = mutableMapOf<Char,Int>()

        keymap.forEach {
            val arr = it.toCharArray()
            arr.forEach {
                if(map.containsKey(it)){
                    map[it] = min(map[it]!!,arr.indexOf(it)+1)
                } else { 
                    map[it]= arr.indexOf(it)+1
                }
            }
        }

        for(i in 0 .. targets.size-1){
            val arr = targets[i].toCharArray()
            var count = 0
            var flag = true
            for(j in 0 .. arr.size-1){
                if(map.containsKey(arr[j])){
                    count += map[arr[j]]!!
                } else {
                    flag = false
                    break
                }
            }
            if(flag) answer[i] = count
        }

        return answer
    }
}

실행결과

테스트 1 통과 (16.70ms, 62.7MB)
테스트 2 통과 (14.85ms, 63MB)
테스트 3 통과 (24.36ms, 62.7MB)
테스트 4 통과 (14.13ms, 63.1MB)
테스트 5 통과 (16.17ms, 63.2MB)
테스트 6 통과 (14.32ms, 63.1MB)
테스트 7 통과 (14.11ms, 63.6MB)
테스트 8 통과 (14.48ms, 62.9MB)
테스트 9 통과 (14.20ms, 63MB)
테스트 10 통과 (14.16ms, 62.7MB)
테스트 11 통과 (21.09ms, 63.3MB)
테스트 12 통과 (19.83ms, 63.3MB)
테스트 13 통과 (14.99ms, 61.7MB)
테스트 14 통과 (23.15ms, 63.1MB)
테스트 15 통과 (23.99ms, 64MB)
테스트 16 통과 (20.02ms, 64.5MB)
테스트 17 통과 (21.15ms, 63.4MB)
테스트 18 통과 (22.00ms, 64MB)
테스트 19 통과 (18.02ms, 64.7MB)
테스트 20 통과 (18.43ms, 63.4MB)
테스트 21 통과 (15.95ms, 63.8MB)
테스트 22 통과 (18.11ms, 63.6MB)
테스트 23 통과 (16.34ms, 64.7MB)