[프로그래머스] 저주의 숫자 3 (Python)

TK·2023년 9월 25일

문제 설명

3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.

10진법3x 마을에서 쓰는 숫자10진법3x 마을에서 쓰는 숫자
1168
22710
34811
45914
571016

정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.

제한사항

1 ≤ n ≤ 100

입출력 예

nresult
1525
4076

입출력 예 설명

  • 입출력 예 #1
    15를 3x 마을의 숫자로 변환하면 25입니다.

  • 입출력 예 #2
    40을 3x 마을의 숫자로 변환하면 76입니다.


내가 푼 답 (테스트7 틀림)

  • 반례 : set은 순서가 없다.
def solution(n):
    origin=[]
    yes_3=[]
    for i in range(1,n*3):
        origin.append(i)
        if i*3 < n*3+1:
            yes_3.append(i*3)
        if '3' in str(i):
            yes_3.append(int(i))
    no_3 = list(set(origin)-set(yes_3))
    return no_3[n-1]

내가 다시 푼 답

  • range(n*2)일 때 테스트 8이 시간초과라고 떠서 range(n*3)으로 고쳤더니 통과됐다. 제한사항이 1 ≤ n ≤ 100이기 때문인 것 같은데 이런 식으로 쓰는 건 비효율적이다.
def solution(n):
    answer = 0
    no_3=[]
    for i in range(n*3):
        if not '3' in str(i) and i % 3 != 0:
            no_3.append(int(i))
    return no_3[n-1]

정답 풀이1 (for+while문)

def solution(n):
    answer = 0
    for _ in range(n):
        answer += 1
        while answer % 3 == 0 or '3' in str(answer):
            answer += 1
    return answer

파이썬에서는 반복을 수행하되, 변수 값이 필요 없을 때 언더바(_)를 사용할 수 있다.
예를 들어, print 문을 반복시킬 때, 아래와 같이 변수 부분에 언더바를 적어주면, 변수 없이 반복문이 실행된다.

for _ in range(5):
	print("Hello World")

결과

Hello World
Hello World
Hello World
Hello World
Hello World

이를 리스트 초기화에도 사용할 수 있다.

# 0으로 초기화
>> array = [ 0 for _ in range(10)]
>> print(array)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

출처: https://rich-developer.tistory.com/148

정답 풀이2 (while문 사용)

def solution(n):
    answer = 0
    i = 1
    while n:
        if i % 3 and '3' not in str(i):
            n -= 1
        i += 1
    answer = i - 1
    return answer
profile
쉬운게 좋은 FE개발자😺

0개의 댓글