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