프로그래머스 코딩테스트 입문 문제 풀이
새로운 방법으로 푼 문제만 남길 예정
머쓱이는 학교에서 키 순으로 줄을 설 때 몇 번째로 서야 하는지 궁금해졌습니다. 머쓱이네 반 친구들의 키가 담긴 정수 배열 array와 머쓱이의 키 height가 매개변수로 주어질 때, 머쓱이보다 키 큰 사람 수를 return 하도록 solution 함수를 완성해보세요.
def solution(array, height):
taller = len([x for x in array if x > height])
return taller
배열을 for문으로 써서 돌리고, 그 뒤에 if문을 쓰면 한 줄에 해결이 가능했다.
가독성도 내 기준에는 나쁘지 않으니 한줄 해결도 적당한 듯?
정수가 들어 있는 배열 num_list가 매개변수로 주어집니다. num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.
def solution(num_list):
answer = list(reversed(num_list))
return answer
예전에 reverse() 함수를 사용했던 기억이 있어서 써봤다.
reverse() 함수는 return 값이 없어서, 대신 reversed() 함수를 써야 한다.
그리고 reversed 함수는 반환 자료형이 listreverseiterator 라는 자료형이어서, 다시 배열을 리턴할 수 있도록 list()로 감싸줬다.
정수가 담긴 배열 array와 정수 n이 매개변수로 주어질 때, array에 n이 몇 개 있는 지를 return 하도록 solution 함수를 완성해보세요.
def solution(array, n):
answer = array.count(n)
return answer
원래 answer = len([x for x in array if x == n]) 로 적었다가,
count() 함수를 활용해봤다.
배열명.count(값) 의 형태로 작성하면, 배열 내에서 해당 값의 개수만 세어준다.
문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.
def solution(my_string):
answer = ''.join(reversed(my_string))
return answer
마찬가지로 reversed() 함수를 사용했다.
반환값이 str이 아니므로, ''.join()을 사용해 거꾸로 뒤집힌 문자열을 이어붙여줬다.
머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.
def solution(n):
for i in range(6, n*6 + 1, 6):
if i % n == 0:
answer = i // 6
break
return answer
원래 하려던 문제가 아닌데 클릭 잘못해서 풀어버림..
최소공배수 구하는 문제였는데, 생각보다 어려워서 시간이 좀 걸렸다.
머쓱이네 피자가게는 피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라줍니다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.
def solution(slice, n):
import math
answer = math.ceil(n/slice)
return answer
이전에는 if문을 썼는데, 이번엔 math 패키지의 ceil 함수를 이용해봤다.
훨씬 간단하게 해결!
정수n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요
def solution(n):
answer = sum([int(i) for i in str(n)])
return answer
문자열을 저렇게 반복문에 넣어서 돌리는 식으로 계산이 가능했다니!
두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.
def solution(s1, s2):
answer = len(set(s1) & set(s2))
return answer
두 배열의 교집합을 구하기 위해, 각 배열을 set()으로 집합으로 바꿔주고,
&으로 교집합을 가져온 후, len()으로 길이를 구했다.
중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요.
def solution(array):
import numpy as np
return np.median(array)
numpy 패키지의 median 함수를 이용해서 간단하게 해결
def solution(array):
return sorted(array)[len(array)//2]
패키지를 쓰지 않고 이런 방법도 있다.
단, 이 문제에서는 배열의 개수가 홀수라는 제한 조건이 있었기에 이런 코드도 가능했다.
배열 개수가 짝수가 되면, 짝수인 경우에 계산하는 게 달라져서 위 코드만으로는 불가함
정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.
def solution(n):
answer = [x for x in range(n+1) if x % 2 == 1]
return answer
나는 for와 if를 써서 풀었는데, 다른 사람 풀이를 보니 더 간단한 방법이 있었다.
def solution(n):
answer = [x for x in range(1, n+1, 2)]
return answer
range 를 좀 더 적극적으로 써봐야겠다.
문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string에 들어있는 각 문자를 n만큼 반복한 문자열을 return 하도록 solution 함수를 완성해보세요.
def solution(my_string, n):
answer = ''.join(m * n for m in my_string)
return answer
''.join()을 써보려고 했다.
문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
def solution(my_string):
numbers = [int(m) for m in my_string if m.isdigit()]
return sum(numbers)
isdigit() 함수로 해당 값이 숫자인지 확인 가능
정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.
"w" : n이 1 커집니다.
"s" : n이 1 작아집니다.
"d" : n이 10 커집니다.
"a" : n이 10 작아집니다.
위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.
def solution(n, control):
wsda = {"w": 1, "s": -1, "d": 10, "a": -10}
for c in control:
n = n + wsda[c]
return n
딕셔너리를 활용해보고 싶어서 이렇게 했다.
if 로 케이스를 여러 개 나누지 않고, 간단하게 해결 가능!
def solution(answers):
p1 = [1, 2, 3, 4, 5]
p2 = [2, 1, 2, 3, 2, 4, 2, 5]
p3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
scores = [0, 0, 0]
for i in range(len(answers)):
if p1[i%len(p1)] == answers[i]:
scores[0] += 1
if p2[i%len(p2)] == answers[i]:
scores[1] += 1
if p3[i%len(p3)] == answers[i]:
scores[2] += 1
answer = [idx+1 for idx, s in enumerate(scores) if s == max(scores)]
return answer
결국 검색해서 해설 보고 풀었다.
다른 부분은 다 이해 가는데, remove_cnt 왜 쓰는지 모르겠어서 빼봤더니 인덱스 에러가 발생했다.
리스트에서 원소를 빼면서 리스트 길이가 줄어드는데, 인덱스는 그대로 유지하면 원하는 원소를 제거하지 못하기 때문에,
원소를 제거할 때마다 값을 빼주어서, 인덱스의 변화를 반영하는 거라고 한다.
from itertools import permutations
tries = int(input())
num_list = list(permutations([1,2,3,4,5,6,7,8,9], 3))
for _ in range(tries):
test, strike, ball = map(int, input().split())
test = list(str(test))
remove_cnt = 0
for i in range(len(num_list)):
s_cnt = b_cnt = 0
i -= remove_cnt
for j in range(3):
test[j] = int(test[j])
if test[j] in num_list[i]:
if j == num_list[i].index(test[j]):
s_cnt += 1
else:
b_cnt += 1
if s_cnt != strike or b_cnt != ball:
num_list.remove(num_list[i])
remove_cnt += 1
print(len(num_list))