프로그래머스에서 간만에 새로운 문제가 나와서 풀었다.
문제
입출력 예
풀이
짝꿍이라는 말 때문에 똑같은 숫자가 있으면 제거하면서 세볼까 생각했는데,
귀찮고 번거로워서 가장 간단한 방법을 생각했다.
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
실행 결과
너무 효율성이 떨어져서 놀랐지만 일단 정답이니 다른 방법은 나중에 생각해봐야겠다.
댓글