프로그래머스/파이썬_입문

저주의 숫자 3

싱싱한복초이 2025. 1. 4. 16:27

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

[문제 설명]

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

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

 

제한사항

  • 1 ≤ n ≤ 100

[나의 풀이]

(틀린 풀이)

def solution(n):
    answer = []
    for i in range(1,101):
        if i % 3 != 0 and '3' not in str(i):
            answer.append(i)
    return answer[n-1]

처음에 이렇게 풀었는데 생각해보니깐 i의 범위를 한정지은 것이 잘못됐다는 생각이 들었다. 문제 풀 때 n의 범위를 i의 범위로 착각한 듯? i의 range를 200까지 늘리면 괜찮지 않을까 생각함

def solution(n):
    answer = []
    for i in range(1,200):
        if i % 3 != 0 and '3' not in str(i):
            answer.append(i)
    return answer[n-1]

 

(올바른 풀이)

def solution(n):
    count = 0
    current = 0
    
    while count < n:
        current += 1
        if current % 3 != 0 and '3' not in str(current):
            count += 1
    
    return current

 

코드 흐름 예시 (n=5)

n=5일 때 current와 count가 어떻게 변하는지 살펴보면,

  1. current = 1: 조건 만족 → count = 1
  2. current = 2: 조건 만족 → count = 2
  3. current = 3: 조건 불만족 → 건너뜀
  4. current = 4: 조건 만족 → count = 3
  5. current = 5: 조건 만족 → count = 4
  6. current = 6: 조건 불만족 → 건너뜀
  7. current = 7: 조건 만족 → count = 5 → while 종료

최종적으로 current = 7일 때 count가 5에 도달했으므로 답은 7이 된다.

 

[다른 풀이]

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

 

Q.왜 if 대신 while을 사용했는가?
A.이 코드에서 while을 사용한 이유는 특정 조건이반복적으로 만족되지 않을 때까지 처리하기 위해서입니다. 조건을 한 번만 확인하고 넘어가는 if문과는 다른 동작을 수행하기 때문입니다.

 

if문으로 작성하게 되면 아래와 같다.

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

'프로그래머스 > 파이썬_입문' 카테고리의 다른 글

💫유한소수 판별하기  (0) 2025.01.06
💫평행  (0) 2025.01.05
외계어 사전  (0) 2025.01.03
💫숨어있는 숫자의 덧셈 (2)  (0) 2024.12.10
💫안전지대 + set()  (0) 2024.12.05