알고리즘 문제 풀이
Q9. ABcheck // for문에서 중복되는 조건이 있을 경우 주의사항 **
DvdHan
2022. 11. 29. 23:49
====================== 해답 =======================
public class Solution {
public boolean ABCheck(String str) {
/*
문자열str받음.
1. 'a'로 시작해서 'b'로 끝나는 길이5의 문자열있는지
2. 'b'로 시작해서 'a'로 끝나는 길이5의 문자가 있는지
<주의>
1. 대소문자 구분 x
2. 공백도 한글자로 취급
3. 'a' 'b'는 중복으로 등장 가능
4. boolean으로 리턴.
<풀이>
1. str > char 배열로 변경.
길이 5이상인지
=> 1.에서 만든 char배열에서 A 혹은 B 로 시작하는게 있는지 찾고 해당 인덱스로부터 길이5의 새로운 char배열 복사함.
복사한 새로운 char배열의 마지막 요소가 B 혹은 A인지 확인 맞으면 true, 아니면 false;
2. 대소문자 구분x
=> str => char[] 바꿀때 모두 대문자로 바꿈.
*/
< str을 cha[] 배열로 모두 대문자로 바꾸고 변경함 >
char[] cha = str.toUpperCase().toCharArray();
< cha 배열에서 A or B로 시작하는게 있다면 해당 cha, 해당 인덱스로부터 +5 길이로 복사할 cha 배열 2개 생성 >
char[] chaA = new char[]{};
char[] chaB = new char[]{};
< return 이 boolean이므로 return 할 변수 생성 >
boolean answer = true;
cha[] 변수에서 A 혹은 B를 찾으면 해당 인덱스를 할당할 변수 2개 생성.
int numOfA = 0;
int numOfB = 0;
// str이 빈 문자열일 경우 false 리턴.
if (str.length() == 0) {
answer = false;
}
// cha의 요소중 'A'를 가진게 있으면 해당 인덱스부터 +5만큼 복사한다.
for (int i = 0; i < cha.length; i++) {
if (cha[i] == 'A') {
numOfA = i;
chaA = Arrays.copyOfRange(cha, numOfA, numOfA+5);
if ( chaA.length == 5 && chaA[chaA.length-1] == 'B'){
answer = true; 막혔던 포인트
return answer;
}else {
answer = false;
}
}
// cha의 요소중 'A'를 가진게 있으면 해당 인덱스부터 +5만큼 복사한다.
if (cha[i] == 'B') {
numOfB = i;
chaB = Arrays.copyOfRange(cha, numOfB, numOfB+5);
if (chaB.length == 5 & chaB[chaB.length-1]=='A'){
answer = true; 막혔던 포인트
return answer;
}else {
answer = false;
}
}
// cha의 요소중 'A'나 'B' 가진게 없으면 false 리턴.
else if (cha[i] != 'A' || cha[i] !='B') {
answer = false;
}
}
return answer;
}
}
==========================막혔던 포인트=========================
1. for문에서 중복되는 경우가 있을 때 조건에 해당하는 부분이 최초 발견되면 따로 뺴두거나 즉시 반환하지않고 있으면,
다음 차례의 반복문이 실행될때 찾았던 내용의 답이 전혀 다른 내용의 답으로 바뀐다.
for문에서 중복이 되는 경우가 있을 경우에는 즉시 return을 하거나 다른 변수에 카운팅을 하는게 중요하다.
==========답안 2================
if(str.length() == 0) {
return false;
}
str = str.toLowerCase();
for(int i = 0; i < str.length()-4; i++) {
if((str.charAt(i) == 'a' && str.charAt(i + 4) == 'b') || (str.charAt(i) == 'b' && str.charAt(i + 4) == 'a')) {
return true;
}
}
return false;
}
}