-
[Python] BOJ 8595 히든넘버코딩테스트/백준 2025. 2. 3. 19:22
https://www.acmicpc.net/problem/8595
요구사항
- 시간 제한 1초
- 공간 제한 256MB
- 히든 넘버의 합을 구할 것.
- 문자는 알파벳 대소문자와 숫자(0-9)로 이루어져 있음.
- 두 히든 넘버 사이에는 글자가 적어도 한 개 있다.
- 연속된 숫자는 한 히든 넘버이다.
결론: 단어의 길이가 5,000,000이므로 O(N**2) 안 쪽으로 구현해야 한다.
설계
- ord() 메서드를 사용한다. 알파벳 대소문자는 65-122 사이 존재
- print(ord('a')) 를 통해 확인 가능
- 그 이유는 문자열을 for문으로 순회하면서 확인
- 65-122 범위 밖이라면 num_list에 넣는다.
- 그 외 범위라면 num_list 에 저장된 하나 하나의 문자를 합치고 기존과 더한다.
- 예를 들어 num_list = ['1', '2'] 들어가 있다면 sum += int(''.join(num_list))
위 논리대로 구현 but 실패
import sys input = lambda: sys.stdin.readline().rstrip() # 단어의 길이 how_many_nums = int(input()) num_list = [] # 단어 입력 sentence = input() # 총합 sum = 0 for find_num in sentence: if 65<= ord(find_num) <= 122: sum += int(''.join(num_list)) num_list.clear() # 더한 숫자는 더 이상 필요 없다. # else로 한 이유 단어는 알파벳 대/소문자와 숫자로 이루어져 있음. 특수 문자는 없다. else: num_list.append(find_num) print(sum)
- 디버깅해본 결과 ValueError 발생 원인은 num_list =[] 비어있을 때.
for find_num in sentence: print("find_num : ", find_num) if (65<= ord(find_num) <= 122) and (num_list): print("num_list : ",num_list) sum += int(''.join(num_list)) print("sum : ", sum) num_list.clear() # else로 한 이유 단어는 알파벳 대/소문자와 숫자로 이루어져 있음. 특수 문자는 없다. else: num_list.append(find_num)
- 위와 같이 했더니 아직도 오류가 있다. 예를 들어 a1b 문자열을 입력했을 때, a도 num_list에 들어가기 때문이다.
for find_num in sentence: print("find_num : ", find_num) if 65<= ord(find_num) <= 122: print("num_list : ",num_list) if(num_list): sum += int(''.join(num_list)) print("sum : ", sum) num_list.clear() # else로 한 이유 단어는 알파벳 대/소문자와 숫자로 이루어져 있음. 특수 문자는 없다. else: num_list.append(find_num) print("num_list2: ", num_list)
- and num_list를 아래로 빼주어 해결
- 하지만 여전히 a1b12 로 했을 때, 원하는 출력값이 나오지 않음. 출력결과 1이 나옴. 왤까?
- 현재 더하는 로직은 알파벳이 나왔을 때만 한다. 따라서 마지막에 한 번 더 더하는 로직을 처리해주면 어떨까?
- 두 히든 넘버 사이에는 적어도 하나의 글자가 존재함. 1a1 이렇듯 마지막에 숫자가 존재할 수 있음.
구현
# 대문자 A는 65 소문자 a 는 97 z는 122 # 65~122 사이의 수는 알파벳 대소문자이다. # for문을 돌면서 문자를 담아두고 만약 65 -122 사이의 숫자가 나오면 리스트를 정수로 바꾸고 더하자 # print(ord('a')) import sys input = lambda: sys.stdin.readline().rstrip() # 단어의 길이 how_many_nums = int(input()) num_list = [] # print(int(''.join(num_list)) + 1) # 단어 입력 sentence = input() #print("sentence : ",sentence) # 총합 sum = 0 for find_num in sentence: #print("find_num : ", find_num) if 65<= ord(find_num) <= 122: #print("num_list : ",num_list) if(num_list): sum += int(''.join(num_list)) #print("sum : ", sum) num_list.clear() # else로 한 이유 단어는 알파벳 대/소문자와 숫자로 이루어져 있음. 특수 문자는 없다. else: num_list.append(find_num) #print("num_list2: ", num_list) if num_list: sum += int(''.join(num_list)) print(sum)
헷갈렸던 부분 정리
join() 은 리스트나 튜플 같은 반복 가능한(iterable) 객체의 요소들을 하나의 문자열로 합칠 때 사용
separator.join(iterable)
리스트 지우기 num_list.clear() 이건 사실상 쓸 일이 거의 없어서 몰랐다.
회고
문제,디버깅 그리고 블로그 작성하는 데 총 48분걸렸다. 분발하자. (아래 제외)
그 동안 백준 허브가 작동을 안했다니..
Chat gpt 풀이 1
import sys import re # 입력 받기 input_string = sys.stdin.readline().strip() # 정규 표현식으로 숫자 추출 numbers = re.findall(r'\d+', input_string) # 정수 변환 후 합 계산 result = sum(map(int, numbers)) # 결과 출력 print(result)
Chat gpt 가 알려준 isdigit() + 내가 조금 수정
import sys # 입력 받기 input_string = sys.stdin.read().strip() total_sum = 0 # 숫자의 합을 저장할 변수 current_number = "" # 연속된 숫자를 저장할 변수 for char in input_string: if char.isdigit(): current_number += char # 숫자라면 문자열에 추가 else: if current_number: # 연속된 숫자가 있다면 정수로 변환 후 합산 total_sum += int(current_number) current_number = "" # 초기화 # 마지막 숫자가 있을 경우 처리 if current_number: total_sum += int(current_number) print(total_sum)
- 사실상이건 ord() 하는 것과 별 다를 게 없다.
- 하지만 좀 더 쉽게 문자열안에 숫자를 판변하기엔 쉬워보인다. 그 외 활용
'코딩테스트 > 백준' 카테고리의 다른 글
[Python] BOJ 11728 배열 합치기 (0) 2025.02.06 [Python] BOJ 1269 대칭차집합 (0) 2025.02.06 [Python] BOJ 28278 스택 2 (0) 2025.02.02 [Python] BOJ 7562: 나이트의 이동 (1) 2024.11.27 [Python] BOJ 9935: 문자열 폭발 (1) 2024.11.20