1일1알고/Java Algorithm

23/01/31 [Inf_0108_유효한 팰린드롬]

kim chan jin 2023. 1. 31. 20:43

설명

앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.

문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 작성하세요.

단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다.

알파벳 이외의 문자들의 무시합니다.

 

입력

첫 줄에 길이 100을 넘지 않는 공백이 없는 문자열이 주어집니다.

 

출력

첫 번째 줄에 팰린드롬인지의 결과를 YES 또는 NO로 출력합니다.

 

예시 입력 1 

found7, time: study; Yduts; emit, 7Dnuof

 

예시 출력 1

YES

 

코드

기억할 것 

정규식 어떤 식으로 구성하는지 연습하기

https://heannim-world.tistory.com/14

https://blog.hexabrain.net/205

https://zzang9ha.tistory.com/322

https://hbase.tistory.com/160

https://coding-factory.tistory.com/529

String 문자열.replaceAll(문자열 또는 정규식, 대체할 문자열)

StringBuilder 스트링빌더.reverse()

String 스트링빌더.reverse().toString()

package algorithm;

import java.util.Scanner;

public class Inf_0108_replaceAll {
    // replaceAll로 특수문자 제거
    public String solution(String str){
        str = str.replaceAll("[^a-zA-Z]", "").toUpperCase();
        // [] 요소 맨 앞에 ^ 넣어서 반대로 만들기, not영어소대문자는 특수문자를 의미
        String tmp = new StringBuilder(str).reverse().toString();
        if(str.equals(tmp)) return "YES";
        return "NO";
    }

    public static void main(String[] args) {
        Inf_0108_replaceAll m = new Inf_0108_replaceAll();
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(m.solution(str));
    }
}

 

정규표현식 연습

헷갈리는 개념

\w: 알파벳, 한글, 숫자, 언더바

\w를 표현하기 위해선 실제로는 \\w이렇게 써야함

정규 표현식 역슬래시(\)는 확장문자

역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미

표현 문법
\ 확장 문자의 시작
\b 단어의 경계
\B 단어가 아닌 것의 경계
\A 입력의 시작부분
\G 이전 매치의 끝
\z 입력의 끝
\Z 입력의 끝이지만 종결자가 있는 경우
\s 공백문자
\S 공백문자를 제외한 문자
\w 알파벳, 숫자, 한글, 언더바 문자
\W 알파벳, 숫자, 한글, 언더바를 제외한 문자
\d 숫자, 즉 [0-9]와 동일
\D 숫자를 제외한 문자
^ 문자열의 시작
$ 문자열의 끝
. 임의의 한 문자
* 앞 문자가 0번 이상 발생
+ 앞 문자가 1번 이상 발생
? 앞 문자가 0번 또는 1번 발생
[] 문자의 집합 또는 범위를 나타냄
[0-9]: 0부터 9까지 범위 중 하나의 문자
[a-z]: a부터 z까지 범위 중 하나의 문자

[^0-9]: 0부터 9까지 범위를 제외한 하나의 문자
[^a-z]: a부터 z까지 범위를 제외한 하나의 문자
{} 횟수 또는 범위를 의미
{3}: 문자 3번 등장
{2,3}: 문자 2번 또는 3번 등장
() 소괄호 안의 문자를 하나의 문자로 인식
| or 조건
?: 콜론(:) 우측 문자 이외의 것은 제외함
   
   

 

정규 표현식 설명
^[0-9]*$ 숫자 (0부터 9까지의 범위에서 0번 이상의 문자들)

^: 문자열 시작

[]: 문자의 집합 또는 범위
0-9: 0부터 9까지 범위 중 하나의 문자
*: 문자가 0번 이상 발생

$: 문자열 끝
^[a-zA-Z]*$ 영문자 (a부터 z까지, A부터 Z까지의 범위에서 0번 이상의 문자들)

^: 문자열 시작

[]: 문자의 집합 또는 범위
a-zA-Z: a부터 z까지, A부터 Z까지 범위 중 하나의 문자
*: 문자가 0번 이상 발생

$: 문자열 끝
^[가-힣]*$ 한글 (가부터 힣까지 범위에서 0번 이상의 문자들)

^: 문자열 시작

[]: 문자의 집합 또는 범위
가-힣: 가부터 힣까지 범위 중 하나의 문자
*: 문자가 0번 이상 발생

$: 문자열 끝
\\w+@\\w+\\.\\w+(\\.\\w+)? E-Mail (e.g. java@naver.com)

\: 확장문자 시작
\w+: 알파벳, 숫자, 한글, 언더바가 1번 이상 발생 (e.g. java)

@: @ (e.g. @)

\: 확장문자 시작
\w+: 알파벳, 숫자, 한글, 언더바가 1번 이상 발생 (e.g. naver)

\\.: . (문자열이 아니므로 \\.(확장문자+이스케이프 문자 사용)) (e.g. .)

\: 확장문자 시작
\w+: 알파벳, 숫자, 한글, 언더바가 1번 이상 발생 (e.g. com)

(): 소괄호 속 문자들을 하나의 문자로 취급
?: 문자가 0번 또는 1번 발생
(\\.\\w+)?: 소괄호 속 문자들을 한 문자로 취급하되 그 문자가 최소 1번 발생
(이메일 형식을 강제하기 위함!)

^\d{2,3}-\d{3,4}-\d{4}$ 전화번호 (e.g. 02-910-1234, 010-1234-5678)

^: 문자열 시작

\d: 숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{2,3}: 문자의 갯수가 2개 또는 3개 등장(e.g. 02, 010)

-: - (문자열이므로 그냥 -(하이픈) 사용) (e.g. -, -)

\d: 숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{3,4}: 문자의 갯수가 2개 또는 3개 등장 (e.g. 910, 1234)


\d: 숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{4}: 문자의 갯수가 4개 등장 (e.g. 1234, 5678)

$: 문자열 끝
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ 휴대전화번호 (e.g. 010-1234-5678, 018-999-8888)

^: 문자열 시작

01: 01
(): 소괄호 속 문자들을 하나의 문자로 취급
?: 콜론(:) 우측 문자 이외의 것은 제외함
0|1|[6-9]: 0 또는 1 또는 6,7,8,9 중 하나의 문자 (e.g. 010, 018)

-: - (문자열이므로 그냥 -(하이픈) 사용) (e.g. -, -)

(): 소괄호 속 문자들을 하나의 문자로 취급
?: 콜론(:) 우측 문자 이외의 것은 제외함
\d: 숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{3}: 문자가 3번 등장
|: 또는
\d:숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{3}: 문자가 4번 등장
(e.g. 1234, 999)

-: - (문자열이므로 그냥 -(하이픈) 사용) (e.g. -, -)

\d: 숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{4}: 문자가 4번 등장
(e.g. 5678, 8765)


$: 문자열 끝

\d{6} \- [1-4]\d{6} 주민등록번호 (e.g. 971111-1234567)

\d: 숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{6}: 문자가 6번 등장 (e.g. 971111)

\-: - (문자열이 아니므로  \-(이스케이프 문자) 사용) (e.g. -)

[1-4]: 1부터 4까지의 범위 중 하나의 문자
\d: 숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{6}: 문자가 6번 등장
(e.g. 1234567)
^\d{3}-\d{2}$ 우편번호 (e.g. 123-45)

^: 문자열 시작

\d: 숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{3}: 문자가 3번 등장 (e.g. 123)


-: - (문자열이므로 그냥 -(하이픈) 사용) (e.g. -)

\d: 숫자, 즉 [0-9]와 동일, 0부터 9까지의 범위 중 하나의 문자
{2}: 문자가 2번 등장 (e.g. 45)


$: 문자열 끝