728x90
프로그래머스, 숫자짝궁
https://school.programmers.co.kr/learn/courses/30/lessons/131128
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
분류
accepted
문제
- 테스트 케이스 3,5,8,10 불통
- 테스트 케이스 11~15 시간초과 오류
풀이
예시 문제가 다 통과되서 다음 풀이가 맞는줄 알았다.
X="5525"
Y="1255"
nums_dict = {x:0 for x in range(10)}
for y in Y:
if y in set(list(X)):
nums_dict[int(y)] += 1
result=""
for i in range(9, -1, -1):
while nums_dict[i] > 0:
result += str(i)
nums_dict[i] -= 1
if result == "":
print("-1")
elif int(result) == 0:
print("0")
else:
print(result)
아무래도 테스트 케이스 3,4,8,10이 불통인걸 보아, 문제를 잘못 접근한 듯했다.
다른 블로그를 찾아보니 다들 min함수를 써서 x문자열의 각 digit의 count 갯수와 y 문자열의 digit의 count갯수 중 작은 작은 수를 사용했다.
x_nums_dict = {str(x):0 for x in range(10)}
y_nums_dict = {str(x):0 for x in range(10)}
for x in X:
x_nums_dict[x] += 1
for y in Y:
y_nums_dict[y] += 1
위 코드는 파이선 내장함수를 이용해 간단하게 다음과 같이 쓸수 있다.
x_nums_dict = {str(x):X.count(str(x)) for x in range(10)}
y_nums_dict = {str(x):Y.count(str(x)) for x in range(10)}
반복되는 횟수만큼 문자열에 이어 붙이기 위해서는 다음 코드를 참고했다.
result = ''.join([result, str(i) * 반복되는 횟수])
하지만, 이렇게 해도 시간초과는 계속 발생.. ChatGPT와 대화 시도!
if int(result) == 0:
print("0")
if len(result) == result.count('0'):
print("0")
문자열이 길어질 수록 문자열을 정수형으로 변환하는데 시간이 많이 소요된다고 한다.
그래서 0으로만 이루어진 경우를 다음과 같이 count내장함수를 이용해 형변환 없이 찾을 수 있도록 코드를 변경하니 시간초과가 발생하지 않고 통과!
제출 코드
def solution(X, Y):
x_nums_dict = {str(x):0 for x in range(10)}
y_nums_dict = {str(x):0 for x in range(10)}
for x in X:
x_nums_dict[x] += 1
for y in Y:
y_nums_dict[y] += 1
result = ""
for i in range(9, -1, -1):
iternum = min(x_nums_dict[str(i)], y_nums_dict[str(i)])
result = ''.join([result, str(i) * iternum])
if result == '' :
return '-1'
elif len(result) == result.count('0'):
return '0'
else :
return result
'알고리즘' 카테고리의 다른 글
백준, 최소 비용 구하기 (0) | 2023.09.01 |
---|---|
프로그래머스, 키패드 누르기 (0) | 2023.08.23 |
백준 1303 전쟁- 전투 (0) | 2023.08.11 |
softeer, 장애물 인식 프로그램 (0) | 2023.08.11 |
백준, 이모티콘 (0) | 2023.08.09 |