Code in

프로그래머스 탐욕법(Greedy) 조이스틱 with Kotlin 본문

알고리즘 스터디_문제풀이

프로그래머스 탐욕법(Greedy) 조이스틱 with Kotlin

heyhmin 2020. 8. 17. 22:22

프로그래머스 탐욕법 부분 조이스틱 문제입니다.

IntelliJ에서의 풀이입니다.

import kotlin.math.abs

val name: String = "BBAABB"

// 'A': 65 ~ 'Z': 90
// A B C D E F G H I J K  L  M  N  O  P  Q  R S T U V W X Y Z
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 12 11 10 9 8 7 6 5 4 3 2 1

fun solution(name: String): Int {
    var answer = 0
    // 알파벳을 바꿀 때 최적화, 이동할 때 최적화 2개로 나누겠습니다.

    // 알파벳 변경 시의 최적화
    var current: Int
    name.forEach {
        current = it.toInt()
        answer += if (abs(current - 65) < abs(current - 90) + 1) abs(current - 65) else abs(current - 90) + 1
    }

    // 이동할 때 최적화
    var name2:CharArray = name.toCharArray() // 이동 될 때마다 A로 바꾸어서 표시할 예정
    name2[0] = 'A' // 이미 Alphabet 변경된 이후 이동 시작
    
    var left: Int = name2.lastIndex // 왼쪽으로 가는 position
    var right: Int = 1 // 오른쪽으로 가는 position
    
    var ld: Int // left position까지의 최단거리
    var rd: Int // right position까지의 최단거리
    
    current = 0 // current position

    for (i in name.indices) { // 모든 글자 수 만큼만 이동하면 끝남
        if (name2.all { it == 'A' }) return answer // 모두 A이면 이동할 필요가 없으니 return
        
        while(name2[left] == 'A'){
            left--
            if (left < 0) left = name2.lastIndex
        } // 가장 가까운 왼쪽으로 left position 이동
        
        while(name2[right] == 'A'){
            right++
            if (name2.lastIndex < right) right = 0
        } // 가장 가까운 오른쪽으로 right position 이동
        
        ld = if (left <= current) current - left else current + name.length - left
        // left position까지의 최단거리
        
        rd = if (current <= right) right - current else right + name.length - current
        // right position까지의 최단거리
        
        if(ld < rd){ // 더 짧은 거리로 이동
            answer += ld
            current = left
            name2[left] = 'A'
        }else{
            answer += rd
            current = right
            name2[right] = 'A'
        }
        
        // current position에 맞추어서 left right position 초기화
        left = current - 1
        right = current + 1
        if (left < 0) left = name2.lastIndex
        if (name2.lastIndex < right) right = 0
    }
    return answer
}


fun main() {
    print(solution(name)) // 8
}

URL: https://programmers.co.kr/learn/courses/30/lessons/42860#qna

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

 

Comments