[Python] 코딩 도장 - Duplicate Numbers

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: Duplicate Numbers] - Lv.1

일전에 뭐 게임 회사에서 본 간단한 퀴즈 테스트 입니다.

0~9까지의 문자로 된 숫자를 입력 받았을 때,

이 입력 값이 0~9까지의 숫자가 각각 한 번 씩만 사용된 것인지 확인하는 함수를 구하시오.

  • sample inputs: 0123456789 01234 01234567890 6789012345 012322456789

  • sample outputs: true false false true false

출처: https://codingdojang.com/scode/488?answer_mode=hide


[풀이]

def Duplicate_Numbers(x):
    num_dict = {i:0 for i in range(10)}
    
    # 숫자로 입력시 문자열로 변경해서 for문
    for num in str(x):
        num_dict[int(num)] += 1

    if list(num_dict.values()).count(1) == 10:
        return True
    else:
        return False

print(Duplicate_Numbers("0123456789"))
print(Duplicate_Numbers("01234"))
print(Duplicate_Numbers("01234567890"))
print(Duplicate_Numbers("6789012345"))
print(Duplicate_Numbers("012322456789"))

우선 0부터 9의 key를 가지는 dictionary를 생성하였다.

입력받은 문자로 된 숫자의 각 숫자별로 카운트를 dictionary의 values에 저장한다.

만약 0~9까지의 숫자가 각각 한번씩 사용됐다면 values는 모두 1일 것이다.

values를 리스트로 변경하고 1의 갯수가 10이면 True, 아니면 False로 반환하였다.


[추천 풀이]

a = input("0~9 사이의 숫자로 이루어진 문자열 입력 : ")
print('true' if len(a) == len(set(a)) == 10  else 'false')
0~9 사이의 숫자로 이루어진 문자열 입력 : 9871236450
true

정말 간단하게 푸셨다.

입력받은 숫자의 길이와 set()으로 중복을 제거하였을 때 길이가 모두 10이면 True를 반환했다.

중복 제거하면 사실 set()인데 생각을 못한게 아쉽다.

n = "0123456789 01234 01234567890 6789012345 012322456789".split()

for x in n:
    print("true" if ''.join(sorted(x))=="0123456789" else "false")
true
false
false
true
false

또 다른 풀이 중 추천이 많은 풀이이다.

문자로 된 숫자를 sorted()로 정렬한 후 join()으로 다시 붙인다.

이후 문자열 자체가 일치하는지 비교하는 방법이다.

아래는 sorted()를 그동안 안써서 참고로 써보았다.

a = [3457844,1]
print(sorted(a))

b = "3457844"
print(sorted(b))
[1, 3457844]
['3', '4', '4', '4', '5', '7', '8']

Leave a comment