입력 : aa bb cc &&&&&dd dd cc b&&&b aa
출력 : yes
특수문자는 제외시키고 오로지 문자로 비교하여 앞뒤로 읽은 값이 같은 문자인지 확인하기!
💡처음에 생각한 부분
문자를 앞뒤로 확인하고 특수문자를 제외시킨다??
[Java] 특정 조건에 부합되는 문자 뒤집기(알파벳만 위치 바꾸기) (tistory.com)
강사님 강의에서 특수문자를 제외하고 읽는 방법을 배운적이 있다.
바로 Character.isAlphabatic 이것을 이용해서 하면 되겠다! 라는 생각이 들었다.

isAlphabet을 이용하기 위해
일단 스트링을 대문자로 만들어주고
(대소문자 상관없이 비교하기 위하여)
toCharArray() 를 이용하여 char배열에 담아줌
맨 앞글자를 나타내는 lt 인덱스
맨 마지막 글자 나타내는 rt 인덱스
(rt 는 문자 길이 -1을 해줌. 인덱스값이니까)
그리고 그 문자가 알파벳인지 확인하고
알파벳이 아니면 한칸 이동한다.
그러다 둘다 알파벳인 경우
else if(a[lt]!=a[rt])
조건문에 도달하게 되는데
이때 같지 않으면 바로 no 를 반환한다.
같으면 한칸씩 이동해준다!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public String solution(String str) {
String answer = "yes";
int lt=0, rt=str.length()-1;
str = str.toUpperCase();
char[] a= str.toCharArray();
while(lt<rt) {
if(!Character.isAlphabetic(a[lt])) {
lt++;
}else if(!Character.isAlphabetic(a[rt])) {
rt--;
}else if(a[lt]!=a[rt]) {
return "no";
}else {
lt++;
rt--;
}
}
return answer;
}
public static void main(String args[]) throws IOException{
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(T.solution(str));
}
}
💡강사님 강의 replaceAll 부분을 듣고 혼자 해본 코드.
여기서 내가 중요한 부분을 놓친게 있어서 따로 정리하였다.
원시 문자 형태인 char(단어 하나)변수값을 비교할땐 == 으로 비교해도 된다.
하지만! String으로 이루어진 참조변수의 경우에는 == 은 주소값을 비교한다.
따라서 아래와 같이 temp2와 temp3의 주소값은 같을 수가 없다.
내용에 포함되어 있는 데이터 값을 비교하기 위해서는
temp2.equals(temp3)를 사용해야 한다.
한가지 더 중요한 개념!!
replaceAll 을 이용한 정규식 개념!!
^A-Za-z0-9 알파벳 대소문자 숫자가 아닌 경우에는! 이라는 조건은 이렇게 쓰면 될듯?
이 문제는 이미 위 코드에서 문자열 전체를 대문자로 바꿔 줬기 때문에 대문자만 고려한다.
문자열.replaceAll("[^A-Z]"," ");
여기서 ^의 의미는 부정을 의미한다.
즉 A-Z 가 아닌 나머지들은 이라는 의미이고
그 오른쪽 파라미터는 ""으로 대체한다 라는 의미이다.
replaceAll("[^A-Z],""); replaceAll 정규식 쓰려면 반드시 [ ] 안에 넣어줘라.
A-Z 가 아닌 문자 혹은 특수문자는 빈공간으로 대체된다. 즉 없앤다 라는 의미이다.
(띄어쓰기 넣으면 안됨 아예 입력안한 "" 가 맞다)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public String solution(String str) {
String answer="no";
String temp = str.toUpperCase();
String temp2 = temp.replaceAll("[^A-Z]","");
String temp3 = new StringBuilder(temp2).reverse().toString();
// if(temp2==temp3) return "yes";
if(temp2.equals(temp3)) return "yes";
return answer;
}
public static void main(String args[]) throws IOException{
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(T.solution(str));
}
}
💡강사님 코드

코테 관련해서 많이 부담스러웠는데 강의를 통해 푸는 방법들을 배우니 이 시간이 즐겁습니다.
진짜 기능하나하나 다양한 방법으로 잘 가르쳐주십니다.
출처 : 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 대시보드 - 인프런 | 강의 (inflearn.com)
'알고리즘 > Java 코딩 테스트 준비' 카테고리의 다른 글
[Java] 특정 문자와 가장 짧은 거리 배열로 출력하기 (0) | 2023.01.28 |
---|---|
[Java] 문자와 숫자가 섞여있는 문자열 중 숫자만 추출해라 (0) | 2023.01.27 |
[java] 회문(앞에서 뒤에서 읽을 때 같은 문자) 문자열 풀기 (0) | 2023.01.24 |
[Java] 특정 조건에 부합되는 문자 뒤집기(알파벳만 위치 바꾸기) (0) | 2023.01.23 |
[Java] 단어 뒤집기(StringBuilder.reverse()) (0) | 2023.01.22 |
댓글