본문 바로가기

Problem Solving/Programmers

(29)
<Level 1> 수박수박수박수박수박수 with 파이썬 문제 설명 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다. 제한 조건 n은 길이 10,000이하인 자연수입니다. def solution(n): return ''.join(['수' if i % 2 == 0 else '박' for i in range(n)]) - 파이썬의 최대 장점인 리스트 컴프리헨션을 활용해서 풀고자 했다. 리스트 컴프리헨션을 통해 좋은 가독성을 유지하면서 짧은 코드로 문제를 해결할 수 있다. - 프로그래머스 쉬운문제들의 대부분은 파이썬으로는 한줄로 끝낼 수 있었고, 이 문제도 그럴 수 있을거라고 생각했다. 그러나 컴프리헨션에서 조건은 ..
<Level 3> N으로 표현 with 파이썬 문제 설명 아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다. 12 = 5 + 5 + (5 / 5) + (5 / 5) 12 = 55 / 5 + 5 / 5 12 = (55 + 5) / 5 5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다. 이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요. 제한사항 N은 1 이상 9 이하입니다. number는 1 이상 32,000 이하입니다. 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다. 최솟값이 8보다 크면 -1을 return 합니다. def solution(N, number): ..
<Level 3> 구명보트 with 파이썬 문제 설명 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다. 컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오. 제한사항 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다. 각 컴퓨터는 0부터 n-1인 정수로 표현합니다. i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[..
<Level 2> 구명보트 with 파이썬 문제 설명 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다. 구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다. 사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요..
<Level 2> 주식가격 with 파이썬 문제 설명 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,000 이하인 자연수입니다. prices의 길이는 2 이상 100,000 이하입니다. def solution(prices): length = len(prices) answer = [0] # 답을 뒤부터 담기 stack = [(prices[-1], length - 1)] # 비교 대상 (값, 인덱스) 스택 for i in range(length-2,-1,-1): while stack and stack[-1][0] >= prices[i]: stack.pop() if not sta..
<Level 1> 이상한 문자 만들기 with 파이썬 문제 설명 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요. 제한 사항 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다. 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다. def solution(s): answer = '' count = 0 for i in range(len(s)): if s[i] == ' ': answer += ' ' count = 0 else : if count % 2 == 0: answer += s[i].upper() else :..
<Level 1> 약수의 합 with 파이썬 문제 설명 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요. 제한 사항 n은 0 이상 3000이하인 정수입니다. def solution(n): return sum([i for i in range(1, n + 1) if n % i == 0]) - 제한사항이 작아서 한 줄로 처리한 문제이다. - 굳이 블로깅하지 않으려고 했으나, 제한사항이 매우 큰 경우를 생각해보기 위해서 작성하였다. 만약 제한사항이 매우 큰 숫자라면 범위를 n의 제곱근 까지로 설정하여 연산 시간을 엄청나게 단축시킬 수 있다. - 만약 28이라면 1, 2, 4, 7, 14, 28 이므로 제곱근인 5.x 까지 판단하여 (1, 28) (2, 14) (4, 7) 세 쌍을 구하고 합을 내면 된다. 즉 ..
<Level 1> 콜라츠 추측 with 파이썬 문제 설명 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을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요. 제한 사항 입력된 수, num은 1 이상 8000000 미만인 정수입니다. def s..
<Level 1> 하샤드 수 with 파이썬 문제 설명 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요. 제한 조건 x는 1 이상, 10000 이하인 정수입니다. def solution(x): x = str(x) answer = True tmp = 0 for c in x : tmp += int(c) if int(x) % tmp != 0 : answer = False return answer - 문제에서 요구한대로 그대로 구현하였다. 각 자릿수를 더한값인 tmp를 구하였고, 이를 x로 나누어 판별하였다. - 문제를 풀고나서 생..
<Level 1> 행렬의 덧셈 with 파이썬 문제 설명 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요. 제한 조건 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다. def solution(arr1, arr2): answer = [[] for _ in range(len(arr1))] for i in range(len(arr1)): for j in range(len(arr1[0])): answer[i].append(arr1[i][j] + arr2[i][j]) return answer - 예시 덕분에 열의 숫자는 여러 개임을 알 수 있었지만 문제를 제대로 안읽은 탓에 행..