-
[BOJ] 히든 넘버 - 8595ComputerScience/Algorithm 2024. 4. 9. 00:44728x90
문제
성능 요약
메모리: 40192KB, 시간: 2336ms
분류
- 문자열
- 파싱
접근 방법
주어진 단어들 사이에서 조건에 맞는 '숫자'들의 합을 구하는 문제였기 때문에, 문자열에서 숫자와 문자를 구분하는 법부터 알아야 된다고 생각했다. 하다 보니 매우 하드코딩이 된 것 같다.
먼저 주어진 단어를 인덱스 하나씩 탐색하여 문자열의 아스키코드를 이용하는 ord()함수를 사용해서 문자인 것과 아닌 것의 처리를 다르게 할 수 있도록 분기를 나눴다.
인덱스가 늘어나면서 숫자이면 number 문자열에 +연산으로 더하였고, 아니라면(즉 문자라면) 이때까지 더해서 나온 단어를 int()로 숫자화하여 결과값을 출력하기 위한 sum에 더해주었다.
하지만 여기서 예외 케이스들이 몇개 있었다. 예를 들자면 'aaaaa0a009'와 같은 케이스였다.
먼저, int("009")는 올바르게 int화 되지 못한다. 십진수를 기준으로 맨 앞에 0이 나올 수 없기 때문이다.
따라서 주어진 단어를 인덱스 하나씩 찾아나가는 과정 중 "0"을 만났을 때와 아니었을 때를 또 분기로 나누어 처리해줬다.
마지막으로, 'aaaaa0a009'에서 탐색하는 i가 제일 마지막(n-1)이라면 즉 9가 숫자이면서 마지막이므로
바로 sum에 더해서 출력이 될 수 있도록 하였다.
정답
import sys input = sys.stdin.readline n = int(input()) word = input() number = "" sum = 0 for i in range(n): if (ord(word[i]) >= 48) & (ord(word[i]) <= 57): if word[i] == "0": if len(number) > 0: number += word[i] else: number += word[i] if i == n-1: sum += int(number) else: if len(number) != 0: sum += int(number) number = "" print(sum)
후기
좀 더 좋은 코드를 찾아 나섰다.
n = int(input()) arr = input() num = '' val = 0 for i in arr: if '0' <= i and i <= '9': num += i elif num != '': val += int(num) num = '' if num != '': val += int(num) print(val)
문자열 간에 비교연산자가 된다는 것을 몰랐다...
파이썬에서 문자열 간의 비교는 사전순(lexical order)을 기준으로 합니다.
이는 문자열이 알파벳 순서대로 정렬되는 방식과 유사합니다. "0"과 "3"을 비교할 때, 파이썬은 문자열의 각 문자를 유니코드 값으로 변환하여 비교합니다. 유니코드 값은 각 문자에 할당된 고유의 숫자입니다.
문자 "0"의 유니코드 값은 "3"의 유니코드 값보다 작으므로, "0" < "3"의 비교 결과는 True가 됩니다.
문자 "0"의 유니코드 값은 48이고, 문자 "3"의 유니코드 값은 51입니다. 따라서, "0" < "3"의 비교 결과는 True입니다. 이는 "0"이 "3"보다 사전순으로 앞서기 때문입니다.
결국 "0" < "3" 과 같이 비교하면 유니코드 값을 비교하는 것이다.
이 논리까지는 나와 비슷하다. 하지만 '00009'와 같은 문자가 어떻게 처리되는지 보자.
if와 elif를 사용해서 num이 비어있는 문자열이 아니라면 val에 num을 int화 한 값을 더한다.
여기서 중요한 것은 int(00009)는 오류가 발생하지만 int("00009")는 발생하지 않는다는 것이다.
따라서 정상적으로 val에 int(num)한 값이 추가될 수 있다.
처음엔 나도 비슷하게 짰었는데 다른 부분에서 문제가 있었던 것을 int()함수의 오류로 생각하여 분기를 다르게 준 것 같다.
'ComputerScience > Algorithm' 카테고리의 다른 글
[LeetCode] 367. Valid Perfect Score (0) 2024.04.09 [LeetCode] 166. Fraction to Recurring Decimal (0) 2024.04.09 [BOJ] 8진수, 10진수, 16진수 - 11816 (0) 2024.04.06 [BOJ] 숫자의 합 - 11720 (0) 2024.04.05 [BOJ] 소인수분해 - 11653 (0) 2024.04.05