관리 메뉴

100세까지 코딩

[프로그래머스] Lv0.문자열 밀기 본문

코딩테스트/자바

[프로그래머스] Lv0.문자열 밀기

100세까지 코딩 2023. 8. 16. 17:18
문제 설명

 

풀기 전 생각
  • 문자열을 미는 규칙을 찾기  // 5 문자로 된 string을 오른쪽으로 한 칸씩 밀 때는 arr[(n+1)%5]
  • 즉, 규칙은 arr[(n+밀어야 하는 횟수)% 문자열의 길이]
  • 배열에 밀린 문자열을 넣고 string끼리 비교하기
  • 끝까지 돌아도 같지 않으면 -1, 초기에 A와 B길이가 다르면 -1
class Solution {
    public int solution(String A, String B) {
        int answer = 0;

        if(A.length == B.length){  //string A와 B길이 같으면
            for(int i = 0; i < A.length;i++){
                for(int j = 0; j < A.length; j++){
                    A[i] = A[(j+i)%A.length];  // 오른쪽으로 i만큼 밀어버리는 규칙
                }
                if(A.equals(B)){  // A와 B가 같으면
                    answer = i;  // 해당 i가 밀어버린 횟수
                    return answer;
                }
                if(i==A.length-1){ // 끝까지 돌아도 A와B가 같지 않으면 같아질 수 없다
                    answer = -1;
                    return answer;
                }
            }
        }else{ //A와 B길이가 다르면 애초에 같아질 수 없다
            answer = -1;
            return answer;
        }

    }
}
오류 및 개선
  • string의 길이는 length()를 사용, length는 배열 길이 확인
  • 문자열은 문자 배열과는 다르므로 A[index]로 접근 불가 
  • A [i] = A[(j+i)% A.length]로 하면 기존 A에 덮혀지므로 처음이나 끝자리가 덮여서 의도한 대로 복사 불가
  • toCharArray을 사용하여 문자 배열로 바꿔주기
  • temp라는 빈 배열 만들고 복사해주기
최종
class Solution {
    public int solution(String A, String B) {
        int answer = 0;

        char[] arrA = A.toCharArray(); // A를 문자 배열로 변경
        char[] arrB = B.toCharArray(); // B를 문자 배열로 변경
        char[] temp = new char[arrA.length]; // 빈 문자 배열 생성

        if(arrA.length == arrB.length){  // arrA 와 arrB가 같으면
            for(int i = 0; i < arrA.length;i++){  // 밀어버릴 횟수
                for(int j = 0; j < arrA.length; j++){  // 배열 순차적으로 복사
                    temp[(j+i)%arrA.length] = arrA[j]; // 오른쪽으로 i만큼 밀어버리는 규칙
                }
                A = String.valueOf(temp); // A 문자 배열을 다시 문자열로
                B = String.valueOf(arrB); // B 문자 배열을 다시 문자열로

                if(A.equals(B)){ // A와 B가 같으면
                    answer = i; // 당시 i만큼 밀어버린게 정답
                    return answer;
                }
                if(i==arrA.length-1){ // i가 끝까지 돌아도 A와 B가 같지 않으면
                    answer = -1;
                    return answer;
                }
            }
        }else{  // 초기에 A와 B의 길이가 다르면 같아질 수가 없다
            answer = -1;
            return answer;
        }
        return answer;
    }
}
참고

java에서 문자열을 정수 index로 접근하는 법

python이나 c에서는 문자열을 A [index]와 같은 방식으로 접근 가능!!
그러나, java에서는 A.charAt(index)로 접근
또는 char [] arr = A.toCharArray()로 문자 배열로 바꾼 후 A [index]로 접근

천재들의 풀이법

class Solution {
    public int solution(String A, String B) {
        return (B + B).indexOf(A);
    }
}
1. 밀어버린 문자열을 이어 붙인다 // "hello"를 "ohell"로 한칸씩 밀었다면 "ohellohell"
2. indexOf는 특정 문자문자열앞에서부터 처음 발견되는 인덱스를 반환한다.
   "hello"의 시작 인덱스는 1.    ex)  "ohellohell"
3. 찾지 못하면 -1을 반환한다.
나도 천재가 되어보자!!