본문 바로가기

Algorithm/프로그래머스 연습 문제

(53)
프로그래머스 / 코딩 테스트 / 최솟값 만들기 문제 설명 문제 해결 하나의 리스트는 오름차순, 또다른 리스트는 내림차순 정렬하여 누적시켜주면된다. (수학적으로 왜 그런지 증명할 지식이 없다..) def solve(A,B): return sum([i * j for i, j in zip(sorted(A),sorted(B,reverse=True))]) def solution(A,B): answer = solve(A,B) return answer
프로그래머스 / 코딩 테스트 / 이진 변환 반복하기 문제 설명 문제 해결 입력으로 준 문자열이 '1'이 될 때까지 커스텀으로 정의된 이진변환 행위를 반복하는 프로그램을 만들면된다. def bin_str(s): s = s.replace('0','') s = bin(len(s))[2:] return s def solve(s): res = [0,0] while s != '1': res[1] += s.count('0') res[0] += 1 s = bin_str(s) return res def solution(s): answer = solve(s) return answer
프로그래머스 / 코딩 테스트 / 최댓값과 최솟값 문제 설명 문제 해결 min, max 함수를 이용하여 간단하게 풀 수 있다. def solve(s): return str(min([int(i) for i in s.split(" ")])) + " " + str(max([int(i) for i in s.split(" ")])) def solution(s): answer = solve(s) return answer
프로그래머스 / 코딩 테스트 / 기능개발 문제 설명 문제 해결 몇 일간 작업 후에 배포가 가능한지 리스트로 다시 구하고 자기보다 더 많은 작업일이 필요한 기능까지 카운트를 세어 답을 구했다. def solve(progresses, speeds): res = [] days = [((100-p)//s) + (1 if ((100-p)%s) != 0 else 0) for p, s in zip(progresses, speeds)] while len(days) > 0: cnt = 1 a = days.pop(0) days1 = days.copy() for i in range(len(days)): if a >= days[i]: cnt += 1 days1.pop(0) else: break res.append(cnt) days = days1.copy() retu..
프로그래머스 / 코딩 테스트 / 프린터 문제 설명 문제 해결 문서를 중요도 순에 따라서 정렬한 후, 자신의 문서가 몇 번째에 인쇄되는지 알아내는 문제이다. 중요도 값이 다른 문서와 겹치는 경우가 존재해서 문서를 표현하는 정보에 유일값을 추가했다. 중요도 순으로 정렬을 완료한 후, 저장해놨던 유일값을 찾아서 해당 문서의 위치가 어디인지 반환하는 코드이다. from collections import deque def solve(priorities, location): wait = deque([(p,n) for p, n in zip(priorities, list(range(len(priorities))))]) p = deque() n = wait[location][1] while wait: j = wait.popleft() cond = True f..
프로그래머스 / 코딩 테스트 / 괄호 변환 문제 설명 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다. 3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다. 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. 4-3. ')'를 다시 붙입니다. 4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지..
프로그래머스 / 코딩 테스트 / 짝지어 제거하기 문제 설명 문제 해결 이중반복문을 이용하여 해결해볼까 고민했지만 stack의 후입선출 이용하여 문제를 해결할 수 있겠다고 판단했다. 일단 스택에 데이터는 쌓아줘야 하니 비어있을 때 데이터를 쌓을 수 있도록 조건을 정해주고 쌓인 데이터와 이번에 추가하려는 데이터를 비교하여 같다면 같은 글자이니 제거해주고 다르다면 스택에 추가해준다. 반복문을 다돌고나서 스택에 데이터가 남아있다면 작업이 실패했으므로 0 반대의 경우라면 1을 반환해주면된다. def solve(s): stack = [] for i in s: if len(stack) == 0: stack.append(i) elif stack[-1] == i: stack.pop() else: stack.append(i) return 1 if len(stack) =..
프로그래머스 / 코딩 테스트 / 위장 문제 설명 문제 해결 스파이가 옷을 어떻게 조합해서 입을 수 있는지 경우의 수를 구하는 문제이다. 각 부위에서 입지 않은 옷 하나를 선택하여 조합할 수 있다. 일단 규칙을 찾아내기 위해서 다양한 상황을 가정하고 직접 연산을 진행했다. 그 결과 각 부위의 옷의 개수 + 1를 서로 곱한 후, -1해줘야하는 규칙이 있는 것을 알아냈다. 안경1, 안경2, 안경3 안경1 안경2 안경3 res = 3 ----------------------------- 안경1,안경2 바지1,바지2 안경1 안경2 바지1 바지2 안경1, 바지1 안경1, 바지2 안경2, 바지1 안경2, 바지2 res = 8 ------------------------------ 안경1, 안경2 상의1 바지1, 바지2 안경1 안경2 상의1 바지1 바지2..
프로그래머스 / 코딩 테스트 / 주식가격 문제 설명 문제 해결 굳이 스택, 큐를 이용하여 풀 필요는 없다고 생각했고 반복문을 이중으로 돌려 문제를 풀었다. def solve(prices): res = [] for i in range(len(prices)): count = 0 prev = prices[i] for j in range(i+1, len(prices)): if prev
프로그래머스 / 코딩 테스트 / 숫자의 표현 문제 설명 문제 해결 n은 이미 경우의 수에 포함되어 있으니 count를 1로 시작한다. 1부터 n까지 모든 경우의 수를 검사하지 않아도 된다. n / 2까지만 검사해도 해당 문제를 풀 수 있다. def solve(n): count = 1 for i in range(1, (n//2 + 1)): end = i + 1 while True: temp = sum([j for j in range(i, end)]) if temp== n: count +=1 break elif temp > n: break end +=1 return count def solution(n): answer = solve(n) return answer