SKSDUD
[일일코딩] 문자열 내에 조건에 맞는 글자 있는지 여부 반환 본문
1️⃣ 문제
문자열을 입력받아 문자열 내에 아래 중 하나가 존재하는지 여부를 리턴합니다.
1. 'a'로 시작해서 'b'로 끝나는 5길이 문자열
2. 'b'로 시작해서 'a'로 끝나는 5길이 문자열
인자 : String 타입의 알파벳 문자열
출력 : boolean
대소문자를 구분하지 않고, 공백도 하나의 문자열로 취급합니다. 'a'와 'b'는 중복해서 등장할 수 있습니다.
2️⃣ 수도코드
입력 문자열 str 모두 소문자로 변환
문자열을 배열로 만들기
배열에 모두 접근하면서(반복문)
만약 첫 글자가 a이고 다섯 번째 글자가 b 라면
return true
만약 첫글자가 b이고 다섯 번째 글자가 a 라면
return true
위의 조건문에 걸리지 않은 경우
return false
3️⃣ 필요한 문법
.toLowerCase(), .toUpperCase()
문자열 관련 메서드가 정말 많다. 문자열을 모두 소문자로, 모두 대문자로 변환해 주는 메서드
public static void main(String[] args){
String ABC="I LOVE YOU FOREVER!";
String abc=ABC.toLowerCase();
System.out.println(abc);
}
//출력
//i love you forever!
toCharArray( )
Char에서 알 수 있듯이, 문자열을 char 배열로 만들어준다. 문자열을 배열로 만들 때 가장 기초적인 방법
char [] ABCarr = ABC.toCharArray();
System.out.println(Arrays.toString(ABCarr));
//출력
//[I, , L, O, V, E, , Y, O, U, , F, O, R, E, V, E, R, !]
char형 배열을 선언해 주는 것이 point이다.
java.lang.ArrayIndexOutOfBoundsException 오류 발생!
배열의 index를 벗어나는 값을 불러오거나 참조하는 경우 발생. 배열 인덱스는 0부터 n-1까지.
인덱스값이 음수이거나 n이상일 때(참조할 수 없는 인덱스일 때) 해당 오류 발생
<오류가 발생한 이유>
인자로 "aaccccbbbb"이 들어오는 경우
word [i]가 만약 마지막 값을 가리키는 경우참조할 수 없는 word [i+4]를 가리키고 있기 때문에 오류가 발생했다.
else if (word[i]=='b' && word[i+4]=='a'){
return true;
}
4️⃣ 코드
public boolean ABCheck(String str) {
// TODO: 조건
// 'a'로 시작해서 'b'로 끝나는 5길이 문자열 혹은 그 반대
// 대소문자 구분 x, 공백 구분 O
//-----------------------------
// 모두 소문자로 변경
str=str.toLowerCase();
//문자열을 배열로 만들기(char 저장 배열)
char [] word = str.toCharArray();
// 배열에 접근하면서(반복문)
for(int i=0 ; i< word.length ; i++){
//만약 인덱스 i부터 5길이 문자열을 만들 수 없는 경우
if(i+5 > word.length){
return false;
}
// 5길이 문자열을 만들 수 있는 경우
if(word[i]=='a' && word[i+4]=='b' ){
return true;
}
else if (word[i]=='b' && word[i+4]=='a'){
return true;
}
}
return false;
}
java.lang.ArrayIndexOfBoundsException 오류가 발생했다.
<해결방법>
for 문의 맨 처음으로
5길이 문자열을 만들 수 없는 인덱스 값이라면 false return
5길이 문자열을 만들 수 있는 경우만 word [i+4]에 접근하도록 하였다.
if문은 가장 큰 채로 먼저 거른다
차츰차츰 작은 채로 거르는 느낌
🟩 good 코드
if(str.length() == 0) {
return false;
}
str = str.toLowerCase();
for(int i = 4; i < str.length(); i++) {
if((str.charAt(i) == 'a' && str.charAt(i - 4) == 'b') || (str.charAt(i) == 'b' && str.charAt(i - 4) == 'a')) {
return true;
}
}
return false;
}
여기서도 접근할 수 있는 인덱스를 편하게 처리하기 위해 i와 i-4로 접근하였다.
오오...
5️⃣ 느낀 점
- 문법은 자주 보고 자주 쓰면 익숙해지는 거 같다. ⬅ 자꾸 해보고 항상 생각할 것
- return 문에 대한 이해
- 문법 오류를 바라보는 개발자다운 마음가짐을 갖출 것
'프로그래밍 > 일일코딩' 카테고리의 다른 글
[일일코딩] 가장 긴 문자열과 짧은 문자열을 제거한 배열 리턴하기 (0) | 2023.01.31 |
---|---|
[일일코딩] 입력된 문자열에서 연속된 홀수 사이에 '-' 넣어 출력하기/조건문 if (1) | 2023.01.27 |
[일일코딩] 2차원 배열을 입력받아 각 배열을 이용해 만든 HashMap 반환 (0) | 2023.01.24 |
[일일코딩] 각 단어의 첫 글자가 대문자인 문자열 반환 (4) | 2023.01.19 |
[일일코딩] 문자열 뒤집기 (0) | 2023.01.18 |