제이슨의 개발이야기

프로그래머스 조이스틱 코틀린 본문

코딩테스트

프로그래머스 조이스틱 코틀린

제이쓰은 2021. 9. 26. 20:26
728x90
반응형

 

 

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

 

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

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

programmers.co.kr

 

안녕하세요! 

오늘은 프로그래머스 조이스틱 문제를 풀어봤습니다!

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
    }
}

 

728x90
반응형