본문 바로가기

코딩테스트

[프로그래머스] 숫자 짝꿍

[Lv.1] 정답율 56%

https://school.programmers.co.kr/learn/courses/30/lessons/131128

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[풀이]

- for문에서 pop으로 원소를 삭제하면 index가 실시간으로 달라지기 때문에 해당 리스트 속 모든 원소에 대해 코드를 실행하지 못할 수도 있다

- int()를 쓰면 경우에 따라 시간 초과가 될 수 있으니 주의할 것

 

[오답]

def solution(X, Y):
    answer = []
    X = list(X)
    Y = list(Y)
    for idx_x, x in enumerate(X) :
        for idx_y, y in enumerate(Y) :
            if x == y :
                answer.append(x)
                X.pop(idx_x)
                Y.pop(idx_y)
    
                
    if len(answer) == 0 :
        return '-1'
    else :
        answer.sort(reverse=True)
        answer = int(''.join(answer))
        return str(answer)

 

[통과]

def solution(X, Y):
    answer = []
    
    X_dict = {}
    for x in X :
        if x in X_dict :
            X_dict[x] += 1
        else :
            X_dict[x] = 1
    
    Y_dict = {}
    for y in Y :
        if y in Y_dict :
            Y_dict[y] += 1
        else :
            Y_dict[y] = 1

    for x in list(X_dict.keys()) :
        if x in list(Y_dict.keys()) :
            if X_dict[x] >= Y_dict[x] :
                answer.append(x*Y_dict[x])
            else :
                answer.append(x*X_dict[x])

    if len(answer) == 0 :
        return '-1'
    
    answer.sort(reverse=True)
    answer = ''.join(answer)
    
    if answer[0] == '0' :
        return '0'
    else :
        return str(answer)

 

 

[더 좋다고 생각하는 답]

def solution(X, Y):
    answer = ''

    for i in range(9,-1,-1) :
        answer += (str(i) * min(X.count(str(i)), Y.count(str(i))))

    if answer == '' :
        return '-1'
    elif len(answer) == answer.count('0'):
        return '0'
    else :
        return answer

- dictionary 대신 count를 이용해 X와 Y에서 특정 문자열에 대해 더 적은 갯수만큼 answer에 추가