JAVA/프로그래머스 코딩테스트 입문

[프로그래머스, LV.0] 문자열 밀기

sundori 2024. 12. 14. 18:09

목차

    문제 설명

    문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.


     

    제한사항

    • 0 < A의 길이 = B의 길이 < 100
    • A, B는 알파벳 소문자로 이루어져 있습니다.

     

    A B result
    "hello" "ohell" 1
    "apple" "elppa" -1
    "atat" "tata" 1
    "abc" "abc" 0
    import java.util.Deque;
    import java.util.LinkedList;
    
    class Solution {
        public int solution(String A, String B) {
            Deque<Character> deque = new LinkedList<>();
    
            // A의 각 문자를 Queue에 추가
            for (char ch : A.toCharArray()) {
                deque.add(ch);
            }
    
            // deque를 문자열로 변환하고 B와 비교
            int rotations = 0;
            while (!B.equals(dequeToString(deque)) && rotations < A.length()) {
                deque.addFirst(deque.removeLast()); // 마지막 문자를 맨 앞으로 이동
                rotations++; // 회전 횟수 증가
            }
            if(rotations >= B.length()){
                    return -1;
            }
            return rotations;
        }
    
        // Deque를 문자열로 변환하는 메서드
        private static String dequeToString(Deque<Character> deque) {
            StringBuilder sb = new StringBuilder();
            for (char ch : deque) {
                sb.append(ch);
            }
            return sb.toString();
        }
    }

    코드 해설:

    1. dequeToString 메서드:
      • Deque를 문자열로 변환하기 위해 각 문자를 순회하며 StringBuilder에 추가.
    2. while 조건:
      • B.equals(dequeToString(deque)): Deque의 현재 문자열 표현과 B를 비교.
      • rotations < A.length(): 무한 루프를 방지하기 위해 최대 회전 횟수를 문자열 길이로 제한.
    3. deque.addFirst(deque.removeLast()):
      • 큐의 마지막 요소를 앞쪽으로 이동.
    4. 결과 출력:
      • 최종적으로 Deque를 회전하여 B와 동일해진 경우와 그렇지 않은 경우를 구분하여 출력.
    728x90