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

 

9996번: 한국이 그리울 땐 서버에 접속하지

총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.

www.acmicpc.net

 

 

 

문제 풀이

- 패턴은 '*'을 기준으로 앞에와야 하는 문자열 + * + 뒤에와야 하는 문자열을 입력받는다.

- 앞에와야 하는 문자열은 ^으로, 뒤에와야 하는 문자열은 $으로 패턴을 만든다.

- 예시) a*d 일때 ad도 매치된다. 

import re

tc = int(input())
pattern = list(map(str, input().split('*')))
str_pattern = '^' + pattern[0] + '.*' + pattern[1] + '$'
# p = re.compile("^{0}.*{1}$".format(pattern[0], pattern[1]))
p = re.compile(str_pattern)

for _ in range(tc):
    word = input()
    m = p.search(word)
    if m:
        print("DA")
    else:
        print("NE")

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

 

1543번: 문서 검색

세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한

www.acmicpc.net

 

 

문제 풀이

- 문자열과 찾으려고 하는 단어를 입력받는다.

- 문자열에 중복 없이 찾으려고 하는 단어의 개수 구하기

- 정규식 findall 사용 : 정규식과 매치되는 모든 문자열을 리스트로 리턴한다.

 

 

예시

ababababa
aba

##### 정답
2

 

코드 

import re

word = input()
check = input()

p = re.compile(check)
m = p.findall(word)

print(len(m))

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

 

15904번: UCPC는 무엇의 약자일까?

첫 번째 줄에 알파벳 대소문자, 공백으로 구성된 문자열이 주어진다. 문자열의 길이는 최대 1,000자이다. 문자열의 맨 앞과 맨 끝에 공백이 있는 경우는 없고, 공백이 연속해서 2번 이상 주어지는

www.acmicpc.net

 

 

 

문제 풀이

- 문자열을 축약해서 UCPC를 만들 수 있는지 확인하기

- 대소문자 구분

- 문자열 시작부터 U가 오는 것이 아니라 문자열 내부에 UCPC 있는지 확인하기

- .(모든문자) *(0부터 반복) 을 사용해서 문자열에 순서대로 UCPC 확인

import re

word = input()
p = re.compile('.*U.*C.*P.*C.*')
m = p.match(word)

if m:
    print("I love UCPC")
else:
    print("I hate UCPC")

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

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

 

 

문제 풀이

- < > 괄호 안에 단어가 있는 경우 또는 나머지 단어들을 표현하는 패턴 생성

- 괄호가 있는 단어는 그대로 결과 값에 넣어주고

- 괄호가 없는 단어들은 문자열로 만들어주고 뒤집어주기

import re

S = input()
p = re.compile('<[a-z0-9 ]+>|[a-z0-9 ]')
m = p.findall(S)

result = ''
stack = ''
idx = 1

for word in m:
    if word[0] == '<':
        result += stack[::-1]
        result += word
        stack = ''
    else:
        if word == ' ':
            result += stack[::-1] + ' '
            stack = ''
        elif idx == len(m):
            stack += word
            result += stack[::-1]
            stack = ''
        else:
            stack += word
    idx += 1

print(result)

 

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

 

23303번: 이 문제는 D2 입니다.

문자열 안에 $D2$나 $d2$가 들어있다면 D2를 출력한다. 두 글자는 반드시 붙어있어야 하며, $D$/$d$와 $2$ 사이에 공백이 있어도 안 된다. 만약 문자열 안에 해당 문자가 없다면 unrated를 출력한다.

www.acmicpc.net

 

 

백준 풀이

- 문자열 안에 D2나 d2가 있으면 D2출력, 아니면 unrated 출력

- | = or을 사용해서 D2 or d2

import re
p = re.compile('D2|d2')
word = input()
m = p.search(word)

if m:
    print('D2')
else:
    print('unrated')

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

 

23627번: driip

드립이가 생각하기에 주어진 문자열이 귀여우면 "cute", 그렇지 않으면 "not cute"를 출력한다. (따옴표 제외)

www.acmicpc.net

 

 

백준 풀이

- driip 으로 끝나는 문자열 찾기

- 정규 표현식 중에 $는 마지막 문자가 앞의 문자가 와야 매치된다. 

- match와 search의 차이 : match는 첫 번째 부터 시작하고 search 는 전체에서 패턴을 찾는다.

import re
p = re.compile('driip$')
word = input()

m = p.search(word)

if m:
    print('cute')
else:
    print('not cute')

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

 

1264번: 모음의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 영어 대소문자, ',', '.', '!', '?', 공백으로 이루어진 문장이 주어진다. 각 줄은 최대 255글자로 이루어져 있다. 입력의 끝에는 한 줄

www.acmicpc.net

 

 

백준 풀이

- 정규표현식 패턴을 만드는 re 모듈을 사용

- 모음을 확인하는 컴파일 패턴 만들기

- 정규식과 매치되는 모든 문자열을 리스트로 반환해서 

- 리스트의 길이 = 모음의 개수를 구한다.

import re
p = re.compile('[aeiouAEIOU]')

while True:
    sentence = input()
    if sentence == '#':
        break

    m = p.findall(sentence)
    print(len(m))

정규 표현식(regular expression)

- 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어

- regexp, regex

 

 

정규 표현식 메타 문자(meta characters)

- 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자

. ^ $ * + ? { } [ ] \ | ( )

 

문자 클래스(character class) [ ]

- [ ] 사이의 문자들과 매치

ex) [abc] = a, b, c 중에 한 개의 문자와 매치

- 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위가 된다.

ex) [a-c] = [abc], [0-5] = [012345]

- [a-zA-Z] 알파벳 전부

- [0-9] 숫자 

 

 

^ 메타 문자

- not 의미를 갖는다.

ex) [^0-9] = 숫자가 아닌 문자

 

 

자주 사용하는 문자 클래스

메타 문자 매치 같은 의미
\d 숫자 [0-9]
\D 숫자가 아닌 것 [^0-9]
\s whitespace 문자 [ \t\n\r\f\v]
\S whitespace 문자가 아닌 것 [^ \t\n\r\f\v]
\w 문자+숫자 [a-zA-Z0-9_]
\W 문자+숫자 [^a-zA-Z0-9_]

 

Dot(.) 메타문자

- \n 을 제외한 모든 문자와 매치

ex) a.b = a + 모든문자 + b

- aab, a0b는 정규식과 매치된다.

 

 

문자열을 앞이나 뒤에 매치할 때

- 맨 앞 : ^

ex) ^foo = foo + 아무거나

- 맨 뒤 : $ 

- 문자열이 $ 앞에 있는 문자로 끝나면 매치된다.

ex) abc$ = 아무거나 + abc

 

기호 의미
| or
[] [abc] = a, b, c 중에 하나를 포함
[^문자] [^ab] = a, b 제외
^문자열 ^abc = abc로 시작
문자열$ abc$ = abc로 끝남

 

 

반복 (*)

- 반복을 의미하는 메타 문자

- *은 *앞에 있는 문자가 무한대로 반복될 수 있다.

 

 

반복 (+)

- 최소 1번 이상 반복될 떄 사용한다.

 

정규식 문자열 매치
ca+t ct X
ca+t cat O

 

반복 ({m, n}, ?)

- 반복 횟수를 제한할 때 사용

- m부터 n까지 

ex) {3,} = 반복 횟수 3 이상

ex) {,3} = 반복 횟수 3 이하

 

 

? 메타 문자

- {0, 1} 을 의미한다.


정규 표현식을 지원하는 re 모듈

import re
p = re.compile('abc')

 

 

컴파일된 패턴 객체가 제공하는 메서드

method 목적
match() 문자열의 처음부터 정규식과 매치되는지 조사한다.
search() 문자열 전체를 검색해서 정규식과 매치되는지 조사한다.
findall() 정규식과 매치되는 모든 문자열(substring)을 리스트로 리턴한다.
finditer() 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 리턴한다.

 

 

match

- 문자열의 처음부터 정규식과 매치되는지 조사한다.

- 처음부터 끝까지 전부 일치해야 하는경우 -> fullmatch 사용

# 패턴 만들기
import re
p = re.compile('[a-z]+')

# match 매치 확인
m = p.match('3 python')
print(m) # None : 3이 [a-z]+ 에 매치 되지 않는다

# search
m = p.match('3 python')
print(m) # <re.Match object; span=(2, 8), match='python'>
# search는 문자열을 전체를 검색하기 때문에 매치된다.

 

 

findall

result = p.findall("life is too short")
print(result) 
# ['life', 'is', 'too', 'short']
# [a-z]+ 와 매치되는 모든 값을 리스트로 리턴

 

 

finditer

result = p.finditer("life is too short")
print(result)
<callable_iterator object at 0x01F5E390>
for r in result: print(r)
...
<re.Match object; span=(0, 4), match='life'>
<re.Match object; span=(5, 7), match='is'>
<re.Match object; span=(8, 11), match='too'>
<re.Match object; span=(12, 17), match='short'>

match 객체의 메서드

method 목적
group() 매치된 문자열을 리턴한다.
start() 매치된 문자열의 시작 위치를 리턴한다.
end() 매치된 문자열의 끝 위치를 리턴한다.
span() 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 리턴한다.

 

m = p.match("python")
m.group() # 'python'
m.start() # 0
m.end() # 6
m.span() # (0, 6)

 

문제 풀이

https://hhiyeon.tistory.com/245

 

[백준] 1264번 모음의 개수

https://www.acmicpc.net/problem/1264 1264번: 모음의 개수 입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 영어 대소문자, ',', '.', '!', '?', 공백으로 이루어진 문장이 주어진다. 각 줄은 최대

hhiyeon.tistory.com

 

 

https://hhiyeon.tistory.com/246

 

[백준] 23627번 driip

https://www.acmicpc.net/problem/23627 23627번: driip 드립이가 생각하기에 주어진 문자열이 귀여우면 "cute", 그렇지 않으면 "not cute"를 출력한다. (따옴표 제외) www.acmicpc.net 백준 풀이 - driip 으로 끝나는 문자

hhiyeon.tistory.com

 

 

https://hhiyeon.tistory.com/247

 

[백준] 23303번 이 문제는 D2 입니다.

https://www.acmicpc.net/problem/23303 23303번: 이 문제는 D2 입니다. 문자열 안에 $D2$나 $d2$가 들어있다면 D2를 출력한다. 두 글자는 반드시 붙어있어야 하며, $D$/$d$와 $2$ 사이에 공백이 있어도 안 된다. 만약

hhiyeon.tistory.com

 

 

https://hhiyeon.tistory.com/248

 

[백준] 17413번 단어 뒤집기2

https://www.acmicpc.net/problem/17413 17413번: 단어 뒤집기 2 문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('

hhiyeon.tistory.com

 

 

https://hhiyeon.tistory.com/249

 

[백준] 15904번 UCPC는 무엇의 약자일까?

https://www.acmicpc.net/problem/15904 15904번: UCPC는 무엇의 약자일까? 첫 번째 줄에 알파벳 대소문자, 공백으로 구성된 문자열이 주어진다. 문자열의 길이는 최대 1,000자이다. 문자열의 맨 앞과 맨 끝에 공

hhiyeon.tistory.com

 

 

https://hhiyeon.tistory.com/250

 

[백준] 1543번 문서검색

https://www.acmicpc.net/problem/1543 1543번: 문서 검색 세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준

hhiyeon.tistory.com

 

 

 

https://hhiyeon.tistory.com/251

 

[백준] 9996번 한국이 그리울땐 서버에 접속하지

https://www.acmicpc.net/problem/9996 9996번: 한국이 그리울 땐 서버에 접속하지 총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로,

hhiyeon.tistory.com

 

+ Recent posts