문제 소개
숫자 n이 주어졌을 때, 1부터 n까지의 숫자로 이루어진 리스트를 만드는 것이 목표입니다. 단, 3의 배수이거나 숫자 안에 3, 6, 9가 하나라도 포함된 경우에는 해당 숫자를 문자열 "clap"으로 대체해야 합니다. 이는 한국에서 즐기는 전통 놀이인 '369 게임'을 프로그래밍으로 옮긴 대표적인 연습 문제로, 조건문과 반복문 학습에 적합합니다.
예를 들어 입력이 20이라면 출력은 다음과 같습니다.
['1', '2', 'clap', '4', '5', 'clap', '7', '8', 'clap', '10', '11', 'clap', 'clap', '14', 'clap', 'clap', '17', 'clap', 'clap', '20']
13은 숫자에 3이 포함되어 있고, 15는 3의 배수이므로 "clap"으로 바뀐 것을 확인할 수 있습니다.
해결 절차
- 대체에 사용할 문자열을 정의합니다. (여기서는 "clap")
- 1부터 n까지의 숫자를 문자열 형태로 변환한 리스트를 생성합니다.
- 리스트의 각 요소를 순회하며 아래 조건을 차례로 검사합니다.
- 숫자가 3으로 나누어 떨어지면 "clap"으로 변경
- 그렇지 않고 '3'이 포함되어 있으면 "clap"으로 변경
- '6'이 포함되어 있으면 "clap"으로 변경
- '9'가 포함되어 있으면 "clap"으로 변경
- 모든 검사가 끝난 리스트를 반환합니다.
파이썬 구현 예제
class Solution:
def solve(self, n):
string = "clap"
ls = [str(i) for i in range(1, n + 1)]
for i in range(len(ls)):
if int(ls[i]) % 3 == 0:
ls[i] = string
elif '3' in ls[i]:
ls[i] = string
elif '6' in ls[i]:
ls[i] = string
elif '9' in ls[i]:
ls[i] = string
return ls
ob = Solution()
print(ob.solve(20))
실행 결과
입력:
20
출력:
['1', '2', 'clap', '4', '5', 'clap', '7', '8', 'clap', '10', '11', 'clap', 'clap', '14', 'clap', 'clap', '17', 'clap', 'clap', '20']
코드 설명과 개선 아이디어
위 구현은 문제의 조건을 그대로 옮긴 직관적인 방식입니다. 다만 네 개의 분기문이 모두 동일한 값("clap")을 대입하고 있어 다소 장황합니다. 파이썬의 any() 함수와 리스트 컴프리헨션을 활용하면 훨씬 간결하게 표현할 수 있습니다.
class Solution:
def solve(self, n):
return [
"clap" if int(i) % 3 == 0 or any(d in i for d in "369") else i
for i in map(str, range(1, n + 1))
]
ob = Solution()
print(ob.solve(20))
조건 판단 로직을 한 줄로 압축했을 뿐 실행 결과는 동일합니다. 이처럼 반복되는 조건문은 논리 연산자(or)와 내장 함수(any)를 조합해 정리하면 가독성과 유지보수성이 크게 향상됩니다.