[Python] 백준 2870번 : 수학숙제

hjeu·2025년 1월 12일

백준

목록 보기
17/48

💡문제

백준 2870번 문제 링크

🍀풀이

파이썬으로 하는 문자열 파싱... 처음이라 좀 찾아봤다.

import re

result.extend(re.findall(r'\d+', i))

정규표현식을 활용해서 문자열 안에 숫자만 추출하기!

틀린코드

import re

n = int(input())
arr = [input() for _ in range(n)]

result = []

for i in arr:
    result.extend(re.findall(r'\d+', i))
    
new_result = []
for i in result:
    if len(i) > 1:
        str = i.replace('0', '')
        if str == '':
            new_result.append('0')
        else:
            new_result.append(str)
    else:
        new_result.append(i)

new_result = sorted(map(int, new_result))

for i in new_result:
    print(i)

그냥 겁나 단순하게 문자열 안에 0을 제거하고 문자열이 비었으면(000 이런 경우) 0을 집어넣고 오름차순 정렬하고 끝! 하고 제출했는데 틀렸습니다가 떴다...

질문게시판에 있는 반례들을 집어넣다가 2302 이런경우에 0도 없어진다는걸 알았다. (바본가봐)

그래서 그냥 앞에서 부터 for문을 돌려 0을 제거하는 방법으로 바꿈!@

정답코드1

import re

n = int(input())
arr = [input() for _ in range(n)]

result = []

for i in arr:
    result.extend(re.findall(r'\d+', i))
    
new_result = []
for i in result:
    if len(i) > 1:
        for j in range(len(i)):
            if i[j] != '0':		# 0이 아닌 숫자를 만났다면
                i = i[j:]		# 해당 위치부터 문자열 슬라이싱
                break
        new_result.append(i)
    else:
        new_result.append(i)

new_result = sorted(map(int, new_result))

for i in new_result:
    print(i)

기존 코드를 변경해서 for문을 돌려서 0이 아닌 숫자를 만나면 그 위치부터 문자열 슬라이싱 해서 바꾸기 해서 성공!

근데 이 코드를 짜고 돌려보고 생각해보니까 000인 경우엔 new_result에 000이 들어가는데 예제3 테스트케이스가 어떻게 통과 했을까? 하면서 디버깅 해보니 new_result = sorted(map(int, result)) 정렬할 때 문자열을 숫자로 바꾸는 작업을 했는데 이때 000, 01, 04 이런게 0, 1, 4 이렇게 바뀌는거였다.

정답코드2

import re

n = int(input())
arr = [input() for _ in range(n)]

result = []

for i in arr:
    result.extend(re.findall(r'\d+', i))

new_result = sorted(map(int, result))

for i in new_result:
    print(i)

그래서 0을 제거하는 코드를 아예 없애고 이렇게 최종코드 완성!@


profile
나는야 개발왕이 될거야! (๑ •̀ω•́)۶

0개의 댓글