본문 바로가기
Algorithm/- Programmers

[프로그래머스/Python] Level1. 숫자 짝꿍

by 완벽주의탈피 2022. 10. 28.

프로그래머스에서 간만에 새로운 문제가 나와서 풀었다.

 

 

 

문제


 

 

 

 

입출력 예


 

 

 

 

풀이


짝꿍이라는 말 때문에 똑같은 숫자가 있으면 제거하면서 세볼까 생각했는데,

귀찮고 번거로워서 가장 간단한 방법을 생각했다.

 

1. 배열 선언

# 자릿수마다 초기화 (0~9)
Xs = [0] * 10
Ys = [0] * 10

for x in X:
    Xs[int(x)] += 1
for y in Y:
    Ys[int(y)] += 1

 

0~9의 한자리 정수로만 파악하기 때문에 크기 10인 배열을 선언했다.

그리고 X, Y에 대해 개수만큼 더해주었다.

 

 

2. 같은 숫자가 있으면 추가 (짝짓기)

# X, Y 비교하여 짝지을 수 있는 만큼 answer에 추가
for i in range(10):
    if Xs[i] > 0 and Ys[i] > 0:
        for j in range(min(Xs[i], Ys[i])):
            answer.append(i)

 

반복문을 통해 X, Y 모두 숫자가 1개 이상 존재한다면 (0보다 크다면)

X, Y 중 더 작은 숫자만큼 answer 배열에 추가하였다.

더 크다면 짝지을 수 없는 나머지이다.

 

ex)

X에는 '1'이라는 숫자가 3개, Y에는 2개 존재한다면,

숫자 '1'을 둘 중 더 작은 수만큼인 총 2번 answer 배열에 추가한다.

 

 

3. 예외 처리

# 예외 처리
if len(answer) == 0:
	return "-1"
elif answer[-1] == 0:
	return "0"

 

먼저 짝꿍이 없다면 '-1'을,

짝꿍이 0으로만 구성되어 있다면 '0'을 반환한다.

(이때 숫자가 아닌 문자열을 반환하도록 주의)

 

어차피 위에서 순서대로 배열에 추가했기 때문에 answer의 가장 마지막 원소가 0이면 0밖에 없는 것이다.

 

 

4. 정렬

# 가장 큰 정수
answer.sort(reverse = True)
answer = list(map(str, answer))
answer = "".join(answer)

return answer

 

마지막으로 가장 큰 수를 만들기 위해 배열을 내림차순으로 정렬하고,

문자열로 합치기 위해 배열에 있는 숫자를 모두 문자열로 바꾼다.

그 다음 배열을 문자열로 바꾸면 끝!

 

 

전체 코드


def solution(X, Y):
    answer = []
    
    # 자릿수마다 초기화 (0~9)
    Xs = [0] * 10
    Ys = [0] * 10
    
    for x in X:
        Xs[int(x)] += 1
    for y in Y:
        Ys[int(y)] += 1
    
    # X, Y 비교하여 짝지을 수 있는 만큼 answer에 추가
    for i in range(10):
        if Xs[i] > 0 and Ys[i] > 0:
            for j in range(min(Xs[i], Ys[i])):
                answer.append(i)

    # 예외 처리
    if len(answer) == 0:
        return "-1"
    elif answer[-1] == 0:
        return "0"
    
    # 가장 큰 정수
    answer.sort(reverse = True)
    answer = list(map(str, answer))
    answer = "".join(answer)
    
    return answer

 

 

실행 결과


 

너무 효율성이 떨어져서 놀랐지만 일단 정답이니 다른 방법은 나중에 생각해봐야겠다.

댓글