1) 문제
2) 코드
('좋아요' 수 제일 많은 풀이)
2) 코드 설명
① bonus = {'S' : 1, 'D' : 2, 'T' : 3} option = {'' : 1, '*' : 2, '#' : -1}
- bonus 변수에 딕셔너리로 'S'는 1제곱 이므로 1, 'D'는 2제곱 이므로 2, 'T'는 3제곱 이므로 3을 넣는다.
- option 변수에 딕셔너리로 ' ' 즉, 아무것도 없을땐 1, '*' 일때 2(두배), '#' 일때 -1(마이너스) 넣는다.
② p = re.compile('(\d+)([SDT])([*#]?)')
- re 모듈은 정규표현식을 사용할때 쓰는 모듈이다.
- 정규표현식(정규식)이란 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어이다.
복잡한 문자열의 검색과 치환을 위해 사용되며, 문자열을 처리하는 모든 곳에서 사용된다.
- 정규표현식을 사용하기 위해 re 모듈을 import 한다.
- 다양한 정규 표현식이 있지만 이 문제에 사용할 기본 표현식만 살펴보자.
- 참고로 Wd는 \d와 같은 표현이다.
- 그럼 다트 게임 문제의 정규표현식을 보자.
- p = re.compile('검색할문자열') 를 통해서 정규표현식을 컴파일하고, 컴파일된 패턴 객체(p)를 이용하여
이 객체가 가지고 있는 메서드를 통해 작업을 수행할 수 있다.
- re.compile('(\d+)([SDT])([*#]?)') 에서 ( ) 을 사용하면 그룹이 지어진다.
③ dart = p.findall(dartResult)
- findall() 은 정규식과 매치되는 모든 문자열을 리스트형식으로 리턴한다.
- p.findall(dartResult) 로 dartResult 안에 있는 정규식과 매치되는 문자열을 찾아서 dart 변수에 넣는다.
- dartResult = "1S2D*3T" 와 dartResult = "1D2T#10S" 을 사용해서 dart를 출력해보면 이렇게 된다.
- (숫자)([SDT])([*#]?) 이렇게 배열이 되어야 하니 "1S2D*3T" 순서대로 출력하면
- [('1', 'S', ' '), ('2', 'D', '*'), ('3', 'T', ' ')] 한줄씩 리스트의 요소로 해서 출력된다.
- 1과 S 다음에 *, # 없이 바로 숫자 2가 나오므로 그 자리는 공백으로 둔다.
- 마찬가지로 "1D2T#10S" 출력해보면 다음과 같이 된다.
- [('1', 'D', ' '), ('2', 'T', '#'), ('10', 'S', ' ')] 출력 되는데 마지막 요소 ('10', 'S', ' ') 가 1, 0 이 아닌 10으로 출력 되는
이유는 \d 는 0 - 9 까지의 숫자인데 뒤에 +가 붙어서 하나 이상의 연결된 숫자이므로 10이 된다.
갑자기 궁금해졌다.
- ([*#]?) 에서 ? 없이 출력을 하면 어떻게 될까?
- dartResult에 [SDT]가 아닌 다른 문자가 포함되어 있다면 어떻게 출력될까?
- dartResult 값 앞의 두자리 즉, "1D2T#10S" 의 앞에 두자리를 바꿔서 "D12T#10S" 출력하면 어떻게 될까?
- 대문자 대신 소문자를 사용하면 즉, "1D2T#10S" 를 "1d2T#10S" 로 바꾸면 어떻게 출력이 될까?
▼ 궁금하다면 클릭
(1) ([*#]?) 에서 ? 없이 출력을 하면 어떻게 될까?

- 보는 바와 같이 ([*#]?) 에서 ? 없이 출력을 하면 '#' 포함되어 있는 요소만 출력된다.
- ? 는 정규식 표현으로 '있거나 없거나' 이기 때문에