21. 하샤드 수
문제 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 함. 예를 들어 18의 자릿수 합은 1+8=9, 18은 9로 나누어 떨어지므로 18은 하샤드 수. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성
제한조건
x는 1 이상, 10000 이하인 정수
def solution(x):
i = sum(int(i) for i in str(x))
if x % i == 0:
answer = True
else:
answer = False
return answer
1) 문자열 변환 후, 각 자릿수를 합친 i 필요
i = sum(int(i) for i in str(x)) 로 시작
2) answer = True / False 필요
3) return answer의 들여쓰기 중요
23. 콜라츠 추측
문제 1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같음.
- 입력된 수가 짝수라면 2로 나눕니다.
- 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
- 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환
제한
입력된 수 num은 1 이상 8,000,000 미만인 정수
def solution(num):
answer = 0
while num != 1:
if answer >= 500:
return -1
if num % 2 == 0:
num = num / 2
else:
num = num * 3 + 1
answer += 1
return answer
1) answer = 횟수로 잡고 0으로 시작
2) 계속 순회해야 하므로 while 조건 필요 (num이 1이 아닌 경우로)
3) if / if / else를 다 수행한 후 같은 들여쓰기 구간에 answer += 1. 그래야 if/else 조건 살펴보고 나면 횟수도 필수로 하나씩 추가함
4) return answer의 들여쓰기 중요
5) num이 1이 되는 경우, return answer로 바로 가므로 answer = 0이 됨
24. 서울에서 김서방 찾기
문제 String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없음
제한
seoul은 길이 1이상, 1000이하인 배열
seoul의 원소는 길이 1이상, 20 이하인 문자열
"Kim"은 반드시 seoul안에 포함되어 있음
def solution(seoul):
x = seoul.index("Kim")
answer = f"김서방은 {x}에 있다"
return answer
1) 리스트 위치 찾는 방법 .index("찾는값")
2) f"블라블라 { } 블라."
3) return answer 필수
25. 나누어 떨어지는 숫자 배열
문제 array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환
제한사항
arr은 자연수를 담은 배열
정수 i, j에 대해 i i ≠ j 이면 arr[i] ≠ arr[j]
divisor은 자연수
array는 길이 1 이상인 배열
def solution(arr, divisor):
answer = []
for i in arr:
if i % divisor == 0 :
answer.append(i)
if len(answer) == 0 :
return [-1]
answer.sort()
return answer
1) .append로 리스트에 값 1개 추가
- insert(값, 위치) / extend(여러개)
2) 나누어 떨어지는 element가 하나도 없다면 = answer 리스트가 비었다면 = len(answer) == 0으로 표현
3) 이때 주의사항은 빈 리스트 if 가 for i in arr 의 들여쓰기와 동일해야 한다는 것. 이제는 i랑 더 이상 연관이 없으므로!!!
4) 오름차순으로 정렬한 배열을 반환하라고 했으므로 .sort( ) 필요! 내림차순이라면 reverse = True를 해야 했겠지만
26. 음양 더하기
문제 어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성
제한
absolutes의 길이는 1 이상 1,000 이하
- absolutes의 모든 수는 각각 1 이상 1,000 이하
signs의 길이는 absolutes의 길이와 같음
- signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미
def solution(absolutes, signs):
return sum(absolutes if signs else -absolutes for absolutes, signs in zip(absolutes, signs))
1) zip(absolutes, signs)는 생각했으나 for absolutes, signs 앞부분은 확신이 없었음
2) if true = if signs로 표현하고 true니까 앞에 absolutes 추출, else 는 -absolutes임 (근데 if문+else문+for문 순서)
3) sum ( ) 추가
def solution(absolutes, signs):
answer = 0
for i in range(len(absolutes)):
if signs[i]:
answer += absolutes[i]
else:
answer -= absolutes[i]
return answer
1) range(len(absolutes))임 그래야 [i]로 인덱싱 가능
2) 인덱싱 [i] 활용
3) 들여쓰기 중요
27. 핸드폰 번호 가리기
문제 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성
제한
phone_number는 길이 4 이상, 20 이하인 문자열
def solution(phone_number):
return '*' * (len(phone_number) - 4) + phone_number[-4:]
def solution(phone_number):
return str("*"*len(phone_number[0:-4]))+(phone_number[-4:])
중요
1) 주어진 phone_number의 값들을 변환/추출하는 것이므로 굳이 for/while 문 필요 없음
2) *로 대체하고자 하는 경우, '*' 곱하기 n개로 출력하는 것임
3) 뒤에서 4자리만 가져오라는 것은 phone_number[-4: ] 임
4) 뒤에서 4자리 빼고 나머지 가져오는거니까 전체길이 len(phone+number)에서 그냥 4를 뺀 값으로 해도 됨
28. 없는 숫자 더하기
문제 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성
제한
1 <= numbers의 길이 <= 9
0 <= numbers의 모든 원소 <= 9
numbers의 모든 원소는 서로 다름
풀이1
def solution(numbers):
answer = 0
for i in range(0, 10):
if i not in numbers:
answer += i
return answer
1) i != numbers는 안 되는 이유: 각각의 숫자 i가 numbers 전체 리스트와 같은지 비교하는 코드임 근데 i가 numbers안에 포함되어 있는지 여부를 원하는 것이므로 not in을 써야 함
풀이1 한 문장 쓰기
def solution(numbers):
return sum(i if i not in numbers else 0 for i in range(0, 10))
풀이2
def solution(numbers):
return 45 - sum(numbers)
어차피 0~9까지 더하면 항상 45니까(기준), 45에서 numbers안에 숫자들 합친거 제외하면 됨
29. 제일 작은 수 제거하기
문제 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴
제한
arr은 길이 1이상인 배열
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j]
풀이1
def solution(arr):
if len(arr) > 1:
arr.remove(min(arr))
return arr
else:
return [-1]
1) 중요 remove()함수의 반환값은 항상 NONE, 따라서 return에 바로 arr.remove(min(arr))을 넣는게 아니라 (그럼 none나옴) return arr 을 해줘야 함!
arr = [4, 3, 2, 1] result = arr.remove(min(arr)) # result에는 None이 들어감 print(arr) # [4, 3, 2] print(result) # None |
풀이2
def solution(arr):
return [x for i,x in enumerate(arr) if i != arr.index(min(arr))] if len(arr) > 1 else [-1]
if len(arr) > 1 else [-1] | 배열의 길이가 1보다 크면 앞의 리스트 컴프리헨션 실행, 아니면 [-1] 반환 |
arr.index(min(arr)) | arr에서 최소값의 인덱스를 구함 |
x for i, x in enumerate(arr) if i != arr.index(min(arr)) | enumerate(arr)는 각 요소와 인덱스를 튜플로 제공 따라서 arr.index(min(arr))이 아닌 것들만 enumerate로 찾아서 반환 |
30. 가운데 글자 가져오기
문제 단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.
제한
s는 길이가 1이상, 100 이하인 스트링
풀이1
def solution(s):
if len(s) % 2:
mid = len(s) // 2
return s[mid]
else:
mid = len(s) // 2
return s[mid-1 : mid+1]
풀이2
def solution(s):
return s[(len(s)-1)//2 : len(s)//2+1]
'┤오답노트├ > PYTHON_1차' 카테고리의 다른 글
[LV 2.] 문제 31~40. (2) | 2025.06.23 |
---|---|
[LV 1.] 문제 11~20. (0) | 2025.06.03 |
[LV 1.] 문제 1~10. (0) | 2025.06.01 |