문제
문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 < A 의 길이 = B 의 길이 < 100
- A, B 는 알파벳 소문자로 이루어져 있습니다.
class Solution {
public int solution(String A, String B) {
int answer = 0;
int lenA = A.length();
while(!A.equals(B)) {
String[] arrA = new String[lenA];
for(int i = 1; i <= lenA; i++) {
arrA[i%lenA] = A.substring(i-1, i);
}
String strA = String.join("", arrA);
A = strA;
// System.out.println(strA);
answer++;
if(strA.equals(B)) {
break;
}
else if(answer == lenA) {
answer = -1;
break;
}
}
// if(lenA/2 < answer) {
// answer = lenA - answer;
// }
return answer;
}
}
문제를 잘못 이해했다.
문자열을 민다고 정의한 게 "오른쪽으로 한 칸씩 민다" 만 적용되는 것이었다. 왼쪽으로 미는 건 포함되지 않는다.
나는 문자열을 민다는 설명을 "오른쪽으로 한 칸씩 민다" 라는 말로 예시를 들어 설명한 줄 알고 왼쪽으로 미는 생각까지 했었다. 거기에 최소 횟수를 구하라고 하다 보니 왼쪽으로 민 경우, 오른쪽으로 민 경우 중 작은 횟수를 구하라고 단단히 오해를 해버렸다. 오로지 "오른쪽으로 한 칸씩 민다" 만 적용되는 문제였다.
오해를 가지고 먼저 오른쪽으로 밀었을 경우를 구현했다. 왼쪽으로 미는 경우는 거의 비슷한 알고리즘을 사용하다 보니 어떻게 해야 할까 고민하던 중, 함수를 만드는 것 말고 좋은 아이디어가 떠올랐다.
오른쪽으로 밀었는데 만약 그 횟수가 "주어진 문자열의 길이의 절반" 보다 크면 그건 무조건 왼쪽으로 미는 방법이 더 횟수가 적다는 의미를 뜻한다. 그래서 "전체 길이 - 오른쪽으로 민 횟수" 를 계산하여 반환하였다. 그러면 왼쪽으로 밀었을 때 횟수가 자연스레 나온다. 하지만 당연히 오른쪽으로 민 횟수만 구하는 문제이니, 다시 주석처리한 후 문제를 해결했다.
출처
https://school.programmers.co.kr/learn/courses/30/lessons/120921