해결 과정
이 문제의 핵심은 문자열로 주어진 자료를 어떻게 변환할 수 있느냐이다.
처음부터 s가 dictionary의 list로 주어졌으면 차집합 개념으로 바로 풀 수 있는 문제였는데, 문자열로 주어진게 핵심.
다른 풀이를 보니 역시나, 정규표현식을 사용해서 쉽게 풀었다.
나의 풀이
정규표현식을 사용하지 않고 푼 풀이. 문자열 s를 처리하는 코드가 길다.
from curses.ascii import isdigit
def solution(s):
answer = []
changedList = []
# 문자열 s 처리
temp = []
tempStr = ""
for i in s:
if i == "}":
if tempStr:
temp.append(tempStr)
tempStr = ""
if temp:
changedList.append(temp)
temp = []
if i == ",":
if tempStr:
temp.append(tempStr)
tempStr = ""
if isdigit(i):
tempStr += i
changedList.sort(key = lambda x: len(x))
for value in changedList:
# 차집합 후 남은 원소 append
answer += list(set(value) - set(answer))
return list(map(int, answer))
다른 풀이 보고 다시 푼 풀이
import re
from collections import Counter
def solution(s):
counter = Counter(re.findall('\d+', s))
return [int(x) for x in dict(sorted(counter.items(), key=lambda item: item[1], reverse=True))]
다른 풀이
def solution(s):
s = Counter(re.findall('\d+', s))
return list(map(int, [k for k, v in sorted(s.items(), key=lambda x: x[1], reverse=True)]))
import re
from collections import Counter
IDEA
1개의 문자열로 추출
import re
string = 'aaa1234, ^&*2233pp'
numbers = re.sub(r'[^0-9]', '', string)
print(numbers) # 12342233
연속된 숫자 리스트 추출
import re
string = 'aaa1234, ^&*2233pp'
numbers = re.findall(r'\d+', string)
print(numbers) # ['1234', '2233']
숫자 각각 리스트로 추출
import re
string = 'aaa1234, ^&*2233pp'
numbers = re.findall(r'\d', string)
print(numbers) # ['1', '2', '3', '4', '2', '2', '3', '3']
'Coding Test > 문제 풀이' 카테고리의 다른 글
[문제 풀이] 프렌즈4블록 (0) | 2022.03.10 |
---|---|
[문제 풀이] N으로 표현 (0) | 2022.03.07 |
[문제 풀이] 프린터 (0) | 2022.03.03 |
[문제 풀이] 여행경로 (0) | 2022.03.03 |
[문제 풀이] 더 맵게 (0) | 2022.03.02 |