제이슨의 개발이야기
프로그래머스 조이스틱 코틀린 본문
https://programmers.co.kr/learn/courses/30/lessons/42860
안녕하세요!
오늘은 프로그래머스 조이스틱 문제를 풀어봤습니다!
2단계 문제이고 그리디 알고리즘을 활용하는 문제였습니다!
문제 설명
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳 ▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로) ◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서) ▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.
- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다. - 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다. - 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다. 따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
제한 사항
- name은 알파벳 대문자로만 이루어져 있습니다.
- name의 길이는 1 이상 20 이하입니다.
입출력 예
name | return |
"JEROEN" | 56 |
"JAN" | 23 |
이 문제는 가장 최소한으로 조이스틱을 움직여서 문자열을 바꾸는 조작횟수를 찾는 문제입니다
이 문제 접근 방법은
각 문자열 을 하나씩 검토하면서 조이스틱 위로 혹은 아래로 몇번 조작하는지 파악합니다
그와 동시에 만약 다음 문자에 A인 경우 연속적으로 A가 몇번 나오는지 파악 후
해당 문자열길이에 A가 연속으로 나온 갯수를 빼고 나서 i*2 를 더한 값 과 기존 에 움직인 값 중 최소값을 저장합니다!
i*2를 더하는 이유는 왔다 다시 되 돌아가기 때문입니다!
돌아간다는 것은
예를 들면 BBAAABB 일때
두번째 B에서 그냥 왼쪽으로 이동해서 뒤 BB에 접근하는 경우입니다!!
import kotlin.math.min
class Solution {
fun solution(name: String): Int {
var answer = 0
var move = name.length-1 // 하나씩 왼쪽에서 오른쪽으로 이동하는 횟수(기본)
for(i in name.indices){
var next = i + 1
while(next<name.length && name[next] == 'A'){
next++
}
move = min(move,i+name.length-next +i)
// (i+name.length-next+i)이거는 해당 문자 기준에서 다시 뒤로 돌아가는 경우
if(name[i].equals('A').not()){
var temp = name[i].toInt()-65
if(temp>=13){
temp = (26-temp)
}
answer +=temp
}
}
answer +=move
return answer
}
}
'코딩테스트' 카테고리의 다른 글
프로그래머스 구명보트 그리디알고리즘 (0) | 2021.09.28 |
---|---|
프로그래머스 큰 수 만들기 코틀린 (0) | 2021.09.26 |
프로그래머스 카펫 2단계 코틀린 (0) | 2021.09.22 |
프로그래머스 피보나치수열 코틀린 다이나믹 프로그래밍활용 (0) | 2021.09.20 |
프로그래머스 가장 큰 정사각형 찾기 자바 (0) | 2021.09.19 |