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)
}
그전에 정규표현식에 대해서 알아야 한다.
^ : 문자열의 시작을 의미.
$ : 문자열의 끝을 의미.
. : 문자 한 개를 의미. '.'이 위치한 곳에 어떤 문자든지 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는 대문자로 바꾸면 반대 의미가 됩니다.
처음 문자 55-50+40 를 문자열로 받았지만 ^0-9 숫자 허용이므로 숫자가 아닌 것은 공백으로 변경한다.
처음 문자에서 0-9를 ""로 변경하고
를 통해서 하나씩 분리한다.
결과를 아래와 같다.
입력 ➡ 55-50+40
출력
➡ [55, 50, 40]
➡ [-, +]
개발자로서 배울 점이 많은 글이었습니다. 감사합니다.