본문 바로가기

알고리즘

프로그래머스, 숫자짝궁

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