import java.util.Scanner;
public class Main {
public String solution(String str){
str=str.toUpperCase();
char[] strCh = str.toCharArray();
int lt=0,rt=str.length()-1;
while(lt<rt){
if (strCh[lt]!=strCh[rt]) {
return "NO";
}
lt++;
rt--;
}
return "YES";
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
String str = kb.next();
System.out.println(T.solution(str));
}
}
해당 문제는 앞으로 읽으나 뒤로 읽으나 같은 문자인지를 판별하는 문제였다.
예를 들어 이거다. "기러기"는 앞으로 읽어도 "기러기" 뒤로 읽어도 "기리기"
따라서 앞과 문자를 문자의 중심에 맞춰 비교하면 되는거다. 좌우 대칭을 생각하면 쉽다.
예를 들어 이렇다. 5개의 문자가 있다면
1,2,3,4,5
1과 5를 비교하고 2와 4를 비교
"3은 중심값이기때문에 비교할 필요도 없고 비교할 이유도 없다.
만약 4개라면
1,2,3,4,
마찬가지로 1과 4를 비교 2와4를 비교 짝수로 딱 반으로 나뉘기 때문에 더욱 이해하기 편할 것 같다.
이를 구현한 것이 while(lt<rt)이다.
lt는 왼쪽에서 부터 배열을 가지고 오는 것이고 rt는 오른쪽에서 부터 배열을 가지고 오는 것이다.
따라서
이런식으로 lt와 rt를 비교해가며 해당 문자열이 대칭인지를 확인하는 것이다.
이때 lt는 rt보다 작을때만 비교하면 된다. 왜냐하면
이런식으로 교차되버리면 안되기 때문이다. 좌우대칭하는건데 그 범위를 넘어버린것이다.
따라서 lt<rt인 상황일때만 lt와 rt를 비교해야한다.
참고로 위에서 말했던 것처럼 가운데는 무시해도 된다. 우리가 원하는건 좌우 대칭이기 때문이다.
인프런 코드
import java.util.Scanner;
public class Main {
public String solution(String str) {
String answer = "NO";
String tmp = new StringBuilder(str).reverse().toString();
if(str.equalsIgnoreCase(tmp)) answer="YES";
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
String str = kb.next();
System.out.println(T.solution(str));
}
}
인프런 강의에서는 StringBulider를 사용했다. StringBuilder에 대해 공부하는 것도 좋은 것 같다.
입력받은 문자열을 StringBulider에넣어 생성하고 이후 .reverse()로 뒤집는다. 이후 입력받은 문자열이 들어있는
StringBulider를 toString하여 tmp에 담는다. 이후 대소문자를 무시하고 비교해주는 equalsIgnoreCase를 통해 비교하여
같으면 Yes를 보내준다.
//인프런 코드2
package 회전문자열_7;
import java.util.Scanner;
public class Main {
public String solution(String str){
String answer="YES";
str.toUpperCase();
int len = str.length();
for(int i=0;i<len/2; i++){
if(str.charAt(i)!=str.charAt(len-1-i)){
return "NO";
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
String str = kb.next();
System.out.println(T.solution(str));
}
}
해당 코드를 보며 for문은 꼭 비교를 위해 모두 돌릴 필요는 없다는 것을 알게 되어 좋았다.
우리가 원하는 문자열은 회전문자열 -> 즉 좌우대칭인 문자열이다.
따라서
1과 4가 같아야하고
2와 3이 같아야한다.
이를 위해 for을 4번째 배열까지 돌릴 필요가 없다는것이다.
일단 먼저 for을 모두 돌리면 이렇게 된다.
1과 4를비교
2와 3을 비교
3과 2를 비교
4와 1을 비교
[1과 4를비교, 4와 1을 비교]와 [2와 3을 비교, 3과 2를 비교]를 보면 굳이 똑같은 비교를 2번하는 것을 알 수 있다.
따라서 우리는 좌우대칭인 문자열인지를 알고 싶은 것이기때문에
1과4
2와3만 비교하면 된다.
따라서 즉 전체 길이의 전발 횟수만 for문을 돌려도 된다는거다.
예를들어
전체 길이가 4인 배열을 비교할때
i는 0
str[0]과 str[4(배열길이)-1-0]을 비교 하면되고
i는 1
str[1]과 str[4(배열길이)-1-1]을 비교 하면 끝이라는거다.
자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의
자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성
www.inflearn.com
'2022 > 코딩테스트' 카테고리의 다른 글
[인프런] 자바 알고리즘 문제풀이 멘토링_12 (0) | 2022.08.31 |
---|---|
인프런 코딩테스트 강의 메모 - 유효한 팰린드롬 (0) | 2022.07.20 |
인프런 코딩테스트 강의 메모 - 단어뒤집기 (0) | 2022.07.08 |
인프런 코딩테스트 강의 메모 - 대소문자변환 (0) | 2022.07.07 |