Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- programmers
- 동적계획법
- contentToString
- heap
- solution
- Poll
- Main
- Util
- sortedBy
- 2D Array
- booleanarray
- Java
- indices
- intarray
- 프로그래머스
- Developer
- dp
- Recursion
- dynamic programming
- GREEDY
- Kotlin
- PriorityQueue
- lastIndex
- hackerrank
- Queue
- 2020
- 코틀린
- 알고리즘
- foreach
- report
Archives
- Today
- Total
Code in
프로그래머스 탐욕법(Greedy) 조이스틱 with Kotlin 본문
프로그래머스 탐욕법 부분 조이스틱 문제입니다.
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
'알고리즘 스터디_문제풀이' 카테고리의 다른 글
프로그래머스 동적계획법 N으로 표현 with Kotlin (2) | 2020.08.23 |
---|---|
프로그래머스 탐욕법(Greedy) 섬 연결하기 with Kotlin (2) | 2020.08.18 |
프로그래머스 탐욕법(Greedy) 큰 수 만들기 with Kotlin, 테스트 케이스 추가 (1) | 2020.08.16 |
프로그래머스 탐욕법(Greedy) 체육복 with Kotlin (0) | 2020.08.15 |
프로그래머스 완전탐색 카펫 with Kotlin (1) | 2020.08.14 |
Comments