100세까지 코딩
[프로그래머스] Lv0.문자열 밀기 본문
문제 설명
풀기 전 생각
- 문자열을 미는 규칙을 찾기 // 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을 반환한다.
나도 천재가 되어보자!!
'코딩테스트 > 자바' 카테고리의 다른 글
[프로그래머스] Lv0.유한소수 판별하기 (0) | 2023.08.18 |
---|---|
[프로그래머스] Lv0.최빈값 구하기 (0) | 2023.08.17 |
[프로그래머스] Lv0.다항식 더하기 (0) | 2023.08.14 |
[프로그래머스] Lv0.안전지대 (0) | 2023.08.13 |
[프로그래머스] Lv0.연속된 수의 합 (0) | 2023.08.13 |