계속 SQL만 사용해서 파이썬 코딩 실력이 정체되어 있는 것 같아 작년 말부터 파이썬 언어로 코딩테스트 공부를 다시 시작했다.
원래는 프로그래머스 코딩테스트 고득점 Kit로 공부를 시작하려 했는데, 그냥 프로그래머스에 있는 모든 문제에서 레벨 1, 2의 문제부터 공부를 시작했다.
오늘은 작년부터 위 문제들 중 레벨 1의 문제들을 풀며 노션에 정리해두었던 것들을 블로그에 정리해보려고 한다.
문제 설명: 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
입출력 예: n이 12면, 28을 return
입출력 예 설명: 12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.
def solution(n):
list = [i for i in range(1, n+1)] #n까지의 숫자 출력해 리스트에 넣음
answer = []
for i in range(len(list)): # 리스트의 요소 반복문
if n % list[i] == 0: #만약 n을 요소로 나눴을 때 나머지가 0이라면(약수라면)
answer.append(list[i]) #answer 리스트에 추가
return sum(set(answer)) # answer 리스트의 합
def solution(n):
return sum([i for i in range(1, n+1) if n%i==0]) #n까지의 숫자 반복문 돌리고, n을 특정 숫자로 나눴을 때 나머지가 0이라면(약수라면) 합을 구함
문제 설명: 정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.
입출력 예: num이 3이면, "Odd"를 return
def solution(num):
return "Even" if num%2==0 else "Odd" #만약 num이 2로 나누어 떨어지면 "Even" 출력, 아니면 "Odd" 출력
문제 설명: 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.
입출력 예: arr가 [1,2,3,4]이면, 2.5 return
def solution(arr):
return sum(arr)/len(arr) #arr 합을 arr 배열 개수로 나눔
문제 설명:자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.예를들어
입출력 예: N이 123이면, answer은 6
입출력 예 설명: N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
def solution(n):
return sum([int(i) for i in str(n)]) #N을 문자열로 변환 후, 반복문을 돌려 각 자리를 정수로 변환해 합을 구함
문제 설명: 자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.
입출력 예: (1) n이 10일 때, result는 3 (2) n이 12일 때, result는 11
입출력 예 설명:
(입출력 예 #1) 10을 3으로 나눈 나머지가 1이고, 3보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 3을 return 해야 합니다.
(입출력 예 #2) 12를 11로 나눈 나머지가 1이고, 11보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 11을 return 해야 합니다.
def solution(n):
list = [i for i in range(1, n)] #1부터 n-1까지 리스트에 담음
for i in list: #리스트 요소 반복문
if n % i == 1: #n이 i로 나눠서 나머지가 1이면 i를 리턴
return i
else: # 아닐 경우 n-1 반환
return n-1
def solution(n):
return [i for i in range(1, n) if n%i==1][0] #1부터 n-1까지 수를 반복문 돌려 n을 수(i)로 나눴을 때 나머지가 1인 것만 리스트에 담음 -> [0]을 이용해 리스트 중 맨 앞 수만 출력
문제 설명: 함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다.
입출력 예:
(1) x=4, n=3면, answer은 [4,8,12]
(2) x=-4, n=2면, answer은 [-4,-8]
def solution(x, n):
answer = [x*i for i in range(1, n+1)] #1부터 n까지 반복문 돌려 x에 i를 곱해 리스트 출력
return answer
문제 설명: 대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
입출력 예: (1) s가 "pPoooyY"이면, answer은 true (2) s가 "Pyy"이면, answer은 false
입출력 예 설명:
(입출력 예 #1)'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.
(입출력 예 #2)'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.
def solution(s):
s = s.lower() #s를 소문자로 변환
if s.count('p') == s.count('y'): #만약 s에서 p의 개수와 y의 개수가 동일하면 True 반환
return True
else: #아니라면 False 반환
return False
def solution(s):
return s.lower().count('p') == s.lower().count('y') #s를 소문자로 변환한 것에서 p의 개수와 s의 개수가 동일하다 -> 맞다면 True 반환, 아니면 False 반환
문제 설명: 임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
입출력 예: (1) n이 121이면, 144 return (2)n이 3이면, -1 return
입출력 예 설명:
(입출력 예#1) 121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
(입출력 예#2) 3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
def solution(n):
import math
return (math.sqrt(n)+1)**2 if math.sqrt(n) % 1 == 0 else -1 #n의 제곱근을 1으로 나눴을 때 나머지가 0이라면 (n의 제곱근+1)의 제곱 반환, 아니라면 -1 반환
def solution(n):
sqrt = n**(1/2) #n의 제곱근을 sqrt라는 변수로 저장
if sqrt % 1 == 0: #n의 제곱근을 1으로 나눴을 때 나머지가 0이라면
return (sqrt+1)**2 #sqrt(n의 제곱근)+1의 제곱을 반환
return -1 #아니면 -1 반환
문제 설명: 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요.
입출력 예: n이 12345면, [5,4,3,2,1]을 return
def solution(n):
list = [int(i) for i in str(n)[::-1]] #n을 문자열로 변환해 순서 뒤집음, 그리고 반복문을 돌려 각 자리를 정수로 변환해 리스트에 넣음
return list
문제 설명: 함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
입출력 예: n이 118372이면, 873211 return
def solution(n):
list = [i for i in str(n)] #n을 문자열로 변환해 각 문자를 리스트에 넣기
list.sort(reverse=True) #요소를 내림차순으로 정렬
return int("".join(list)) #join 활용해 리스트 안의 요소 결합 후 정수 변환
문제 설명: 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
입출력 예: (1) arr가 10이면, true를 반환 (2) arr가 11이면, false를 반환
입출력 예 설명:
(입출력 예 #1) 10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.
(입출력 예 #2) 11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.
def solution(x):
return x % sum([int(i) for i in str(x)]) == 0 #x를 문자열로 변환해 반복문 돌려 각 숫자를 리스트에 담아 합을 구함(18이면 1+8=9), 이후 x가 이 합으로 나눴을 때 나머지가 0이면 true 반환, 아니면 false 반환
문제 설명: 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
입출력 예: (1)a=3, b=5이면 12 반환 (2)a=3, b=3이면 3 반환 (3)a=5, b=3이면 12 반환
def solution(a, b):
return sum(range(a, b+1)) if a<=b else sum(range(b, a+1)) #a가 b보다 작거나 같을 때 a부터 b까지의 합을 구하고, a가 b보다 클 때 b부터 a까지의 합 구함
def adder(a, b):
if a > b: #a가 b보다 크면
a, b = b, a #a는 b, b는 a
return sum(range(a, b+1)) #a부터 b까지의 합 구하기
문제 설명: 1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.
(1-1) 입력된 수가 짝수라면 2로 나눕니다.
(1-2) 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
(2) 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.
입출력 예: (1) n=6이면, 8 반환 (2) n=16이면, 4 반환 (3) n=626331이면, -1 반환
입출력 예 설명:
(입출력 예 #1) 문제의 설명과 같습니다.
(입출력 예 #2) 16 → 8 → 4 → 2 → 1 이 되어 총 4번 만에 1이 됩니다.
(입출력 예 #3) 626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야 합니다.
def solution(num):
answer = 0
while True: #무한 반복
if num != 1: #num이 1이 아니면,
if num % 2 ==0: #num을 2로 나누었을 때 나머지가 0이면(짝수)
num = num / 2 #num은 num을 2로 나눈 값으로 저장
answer += 1 #answer 1 증가
elif num % 2 != 0: #num을 2로 나누었을 때 나머지가 0이 아니면(홀수)
num = num*3 + 1 #num은 num에 3을 곱한 값에 1을 더한 값으로 저장
answer += 1 #answer 1 증가
else: #num이 1이면 반복문 그만
break
return answer if answer < 500 else -1 #만약 answer이 500미만이면 answer 반환, 아니면 -1 반환
문제 설명: String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
입출력 예: seoul= ["Jane", "Kim"]이면, "김서방은 1에 있다"를 반환
def solution(seoul):
return '김서방은 ' + str(seoul.index('Kim')) +'에 있다' #seoul에서 'Kim'이 들어있는 index 찾아 문자열 조합
def findKim(seoul):
return "김서방은 {}에 있다".format(seoul.index('Kim')) #format 함수를 이용해 {}안에 seoul에서 'Kim'이 들어있는 index 넣어줌
def solution(seoul):
answer = ''
return ('김서방은 %d에 있다' %seoul.index('Kim')) #%서식 기호 활용해 d에 seoul에서 'Kim'이 들어있는 index 넣어줌
문제 설명: array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
입출력 예: (1)arr=[5, 9, 7, 10], divisor=5이면, [5,10] 반환 (2)arr=[3,2,6], divisor=10이면, [-1] 반환
입출력 예 설명:
(입출력 예#1) arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.
(입출력 예#2) 3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.
def solution(arr, divisor):
return sorted([n for n in arr if n%divisor == 0]) or [-1] #arr에서 각 요소을 divisor로 나눴을 때 나머지가 0인 요소만 리스트에 담음, 없을 경우 [-1] 반환
문제 설명: 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 기호 '별'로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
입출력 예: phone_number="01033334444"면, "* * * * * * * 4 4 4 4" 반환
def solution(phone_number):
return '*'*len(phone_number[:-4]) + phone_number[-4:] #주어진 phone_number에서 뒤 네 자리 제외한 값을 *로 변환하고 뒤 네 자리 문자열 더해줌
문제 설명: 어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
입출력 예:
(1) absolutes=[4,7,12], sign=[true,false,true], result는 9
(2) absolutes=[1,2,3], sign=[false,false,true], result는 0
입출력 예 설명:
(입출력 예 #1) signs가 [true,false,true] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.따라서 세 수의 합인 9를 return 해야 합니다.
(입출력 예 #2) signs가 [false,false,true] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다. 따라서 세 수의 합인 0을 return 해야 합니다.
def solution(absolutes, signs):
answer = 0 #answer 변수
for i in range(len(absolutes)): #absolutes 배열 수만큼 반복문
if signs[i] == True: #만약 sign[i]이 True 라면
answer += absolutes[i] #answer에 absolutes[i] 더하기
else: #만약 sign[i]이 False 라면
answer -= absolutes[i] #answer에 absolutes[i] 빼기
return answer
def solution(absolutes, signs):
return sum(absolutes if sign else -absolutes for absolutes, sign in zip(absolutes, signs))
#zip 내장 함수 활용해 (absolutes, signs) 자료형 묶어줌
#이후 반복문 돌려 sign이 true면 absolutes 요소 더하고, false면 absolutes 요소를 빼 합을 구함
문제 설명: 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
입출력 예: (1) arr=[4,3,2,1]이면, [4,3,2] 반환 (2) arr=[10]이면, [-1] 반환
def solution(arr):
if len(arr) > 1: #배열 개수가 1보다 크면
arr.remove(min(arr)) #주어진 배열 arr에서 가장 작은 수를 제거
return arr
else: #배열 개수가 1일 경우
return [-1] #[-1] 반환
문제 설명: 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.
입출력 예:
(1) numbers=[1,2,3,4,6,7,8,0]이면, 14 반환
(2) numbers=[5,8,4,0,6,7,9]이면, 6 반환
입출력 예 설명:
(입출력 예 #1) 5, 9가 numbers에 없으므로, 5 + 9 = 14를 return 해야 합니다.
(입출력 예 #2) 1, 2, 3이 numbers에 없으므로, 1 + 2 + 3 = 6을 return 해야 합니다.
def solution(numbers):
list = [i for i in range(0, 10)] #리스트에 0부터 9까지 숫자 담음
new = [] #new라는 배열 선언
for i in list: #리스트 반복문
if i not in numbers: #만약 리스트 원소 i가 numbers에 없으면 new라는 배열에 요소 추가
new.append(i)
return sum(new) #new 배열의 합 구함
def solution(numbers):
return 45 - sum(numbers) #0부터 9까지의 합은 45, 따라서 45에서 numbers 배열의 합을 빼면 답이 나옴