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) ([*#]?) 에서 없이 출력을 하면 어떻게 될까?

 

 

- 보는 바와 같이 ([*#]?) 에서 없이 출력을 하면 '#' 포함되어 있는 요소만 출력된다.

- 는 정규식 표현으로 '있거나 없거나' 이기 때문에 가 포함되면 *, # 이 없는 요소도 출력 된다.

 

 

 

(2) dartResult에 [SDT]가 아닌 다른 문자가 포함되어 있다면 어떻게 출력될까?

 

 

- 보는 바와 같이 'A' 라는 문자는 p 즉, [SDT] 에 포함되어 있지 않다.

- 그렇기 때문에 'A' 문자가 포함된 요소(↓표에서 노란색 부분)는 출력되지 않는다.

 

 

 

- 또 다른 예로 숫자가 있어야 할 자리에 'A' 가 포함 되어있다. 그 행은 출력되지 않는다.

 

 

 

 

 

(3) dartResult 값 앞의 두자리 즉, "1D2T#10S" 의 앞에 두자리를 바꿔서 "D12T#10S" 출력하면 어떻게 될까?

 

 

- ↑와 같이 두번째 출력을 보면 (숫자)([SDT])([*#]?) 순이 되어야 하는데 숫자 없이 문자('D') 가 먼저 나와서

  출력되지 않고 그 뒤에 숫자 12부터 순서대로 배열에 맞춰서 출력되었다.

  

 

 

 

 

(4) 대문자 대신 소문자를 사용하면 즉, "1D2T#10S" 를 "1d2T#10S" 로 바꾸면 어떻게 출력이 될까?

 

 

위의 결과 같이 소문자가 포함된 행은 출력되지 않았다. 즉, 소문자, 대문자는 구분해줘야 한다.

 

for i in range(len(dart)):                                                                                                                          if dart[i][2] == '*' and i > 0:                                                                                                                      dart[i-1] *= 2                                                                                                                                 dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]

 

- len(dart) = 3 이고 for i in range(len(dart)) 하면 i 는 0, 1, 2 이다. 

                                                                                      

 

- if dart[i][2] == '*' and i > 0 에서 dart[a][b]는      =>

 

 

 

- dart의 요소를 하나씩 출력해보면 ↓밑에 처럼 나온다.

- dart[0][2]와 dart[2][2]는 ' ' 이므로 아무것도 출력 되지 않는다.

 

 

- 다시 문제로 돌아가서 if dart[i][2] == '*' 즉, dart[0][2], dart[1][2], dart[2][2] 에 '*' 이 있으면서 i > 0 이면      dart[i-1] *= 2 즉, 앞 점수에 2배를 해준다.

  (i가 0보다 커야하는 이유는 '*'이 나오면 해당 점수와 바로 앞 점수를 2배 (dart[i-1] *= 2) 해줘야 하는데

  i가 0이거나 그보다 작으면 마이너스 인덱스가 나오므로 (dart[0-1] = dart[-1]), i가 0보다 커야한다.

 

- dart[i][2] 에 '*' 있으면 2배를 해준 다음에, 없으면 바로 그 다음줄로 넘어가서

  dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]] 실행한다. 

 

- 문제를 그림으로 보자.

- 우선 dartResult = "1S2D*3T" 를 넣고 dart를 프린트 한 결과이다.

 

 

- 나온 결과를 알아보기 쉽게 표로 나타냈다.

 

 

- 위의 결과를 참조하여 코드를 실행해보자.

 

 

- 위의 표에서 보면 dart[1][2] == '*' 이고 i 가 1 즉, i > 0 이므로 바로 앞, dart[0] = 1 이던 값이 2배가 되서

  2가 된것을 확인할 수 있다. (위 표의 초록색 부분)

- 최종 결과는 37이 나온다.

- 다른 예시 

  ▼ 클릭

 

+ Recent posts