[kotlin] 코테 숫자 문자열 분리

Leechaeyeon·2023년 8월 5일

https://www.acmicpc.net/problem/1541

백준 문제 1541 잃어버린 괄호에서 입력이 문자와 숫자가 아래와 같이 있을 때

55-50+40

처음에는 chuncked를 사용하여 1로 나누는 생각을 했는데

var br = BufferedReader(InputStreamReader(System.`in`))
    var input = br.readLine()
    println(input.chunked(1))

입력 ➡ 55-50+40
출력 ➡ [5, 5, -, 5, 0, +, 4, 0]

숫자 하나하나 따로 불리되길래 검색을 해보니 아래와 같은 방식으로 할 수 있었다.

fun main(){
    var br = BufferedReader(InputStreamReader(System.`in`))
    var input = br.readLine()
    var number = input.replace("[^0-9]".toRegex()," ")
    number = number.split(" ").toString()
    var str = input.replace("[0-9]".toRegex(),"")
    str = str.chunked(1).toString()

    println(number)
    println(str)
}

그전에 정규표현식에 대해서 알아야 한다.

정규표현식 ( Regular Expressions; Regex )

  • 정규식이라고도 불리는 정규표현식은 특정한 규칙의 문자열의 집합을 표현하는 식
  • 불특정 문자열이 특정 조건에 만족하는 지 판별할 때 주로 사용

메타(Meta)문자

  • 정규표현식에서 사용하는 연산 기호
  • 이 메타문자들과 숫자, 단어의 조합으로 하나의 문자열 패턴을 완성할 수 있음

정규표현식 문법

^ : 문자열의 시작을 의미.
$ : 문자열의 끝을 의미.
. : 문자 한 개를 의미. '.'이 위치한 곳에 어떤 문자든지 1개의 문자가 들어감.
[ ] : 대괄호에 있는 문자 중 한 개를 의미. [abc]는 a, b, c 중 하나를 선택.
[^] : not의 의미로, 대괄호에서 쓴다면 [^abc] : a, b, c 제외하고 나머지를 의미.
| : or을 의미. a|b : a 또는 b.
() : 공통되는 부분을 묶을 때, 서브 패턴을 지정할 때 사용. abc|abd -> ab(c|d)로 바꿀 수 있음.
? : 문자가 0회 또는 1회 등장. a? b는 a가 나올 수도, 없을 수도 있음. ab, b.

  • : 문자가 0회 이상 등장. a*b : b, ab, aaab, aaab..
  • : 문자가 1회 이상 등장. a+b : ab, aab, aaab..
    {n} : 문자가 n개 나옴. a {2} b : aab
    {n,} : 문자가 n개 이상 나옴. a {2,} b : aab, aaab, aaaab..
    {n, m} : 문자가 n개 이상 m개 이하로 나옴. a {1,3 } b : ab, aab, aaab
    \s : 공백 제거
    \t : 탭
    \d : 숫자, [0-9]와 동일
    \b : 단어의 경계, 문자 사이의 공백
    \w : 알파벳이나 숫자, [a-zA-Z0-9_]와 동일
    위의 \s, \t, \d, \b, \w는 대문자로 바꾸면 반대 의미가 됩니다.

출처

var number = input.replace("[^0-9]".toRegex()," ")

처음 문자 55-50+40 를 문자열로 받았지만 ^0-9 숫자 허용이므로 숫자가 아닌 것은 공백으로 변경한다.

var str = input.replace("[0-9]".toRegex(),"")

처음 문자에서 0-9를 ""로 변경하고

chunked

를 통해서 하나씩 분리한다.

결과를 아래와 같다.

입력 ➡ 55-50+40
출력
➡ [55, 50, 40]
➡ [-, +]

1개의 댓글

comment-user-thumbnail
2023년 8월 5일

개발자로서 배울 점이 많은 글이었습니다. 감사합니다.

답글 달기