Lv. 2 조이스틱

Kim-yujin·2022년 12월 28일

프로그래머스

목록 보기
2/6
post-thumbnail

프로그래머스 Lv. 조이스틱

문제링크

조이스틱으로 알파벳 이름을 완성하시오. 맨 처음은 무조건 A로만 이루어져 있다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA

예시 ( 조이스틱으로 "JAZ"만들기 )

  • 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
  • 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
  • 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
    따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.

경우의 수

  • 1번 케이스
    만들고자 하는 이름 : "BAB"
    결과 : 3
  • 2번 케이스
    만들고자 하는 이름 : "JEROEN"
    결과 : 56
  • 3번 케이스
    만들고자 하는 이름 : "JAN"
    결과 : 23

작성 방법

  1. 탐욕법(Greedy) 문제
  2. 만들 문자 String을 각 각 char 배열로 만든다.
  3. A~Z까지 각각의 이동 횟수를 담은 배열을 만든다. 단, A~Z를 반으로 나누어 A~반 까지는 1~반 / 반~Z 까지는 반~1
  4. 최소경로로 구해야 함

코드

class Solution {
    public int solution(String name) {
        int answer = 0;
        //char형의 배열로 name문자열을 변경
        char[] charArr = name.toCharArray();
        int[] alpaNum={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};
        //foreach구문 활용함 
        for(char c:charArr)
            //c-'A' 문자를 숫자로 변환하기 위해서 사용함  
            answer+=alpaNum[c-'A'];

        //문자열의 길이
        int length=name.length();
        //최소값을 구하기 위해서 min 변수안에 문자열의 길이 -1을 넣어줌 
        int min=length-1;

        //문자열의 길이만큼 반복문 
        for(int i=0;i<length;i++){
            //next변수를 선언한 후 i에 +1을 해줌 
            int n=i+1;
            //n이 문자열의 길이보다 작으면서 A이 있는지 확인하는 것 
            //charAt은 문자열 중에 한 문자만 골라서 char형으로 변환시켜주는 것 
            while(n < length && name.charAt(n)=='A'){
                n++;
            }         

            //i + length - n은 인덱스가 i인 문자의 바로 오른쪽 옆에 오는 A의 개수, Math.min(i, length-n)을 통해
            //왼쪽에서 접근하는 경우와 오른쪽에서 접근하는 경우 중 작은 숫자와 더해 최소값
            int compare = i + length - n + Math.min(i,length-n);
            
            //최소 경로를 구함 
            min = Math.min(min,compare);
        }
        answer += min;

        return answer;
    }
}

코드 해설
1. char[] charArr = name.toCharArray();
//char형의 배열로 name문자열을 변경
2. alpaNum[c-'A'];
문자열을 아스키코드 숫자로 변경하기 위해서 사용함
3. Math.min(min,compare);
최소 경로를 구하는 코드

profile
🐰노력하며 살아가기🐰

0개의 댓글