• 문제

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

 

  • 답안
def solution(s):
    answer = ''
    word_list = s.split(' ')
    word_jc = []
    for word in word_list:
        if word:
            word_jc.append(word[0].upper() + word[1:].lower())
        else:
            word_jc.append(word)
    answer = " ".join(word_jc)
    return answer

 

 

  • 이 문제의 키워드
    • 숫자가 들어가 있는 문자열도 upper(), lower() 실행 시, 알아서 숫자를 걸러주고 문자만 변환한다
    • 공백이 문자에 존재하는 경우, s.split(" ") 으로 공백 기준 스플릿 시 주의해야한다.
    • if word: 로 공백이 아닐 때의 처리, 공백일 때의 처리를 나눠준다.
  • 문제

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

 

  • 답안
from itertools import product

def solution(word):
    vowels = ['A','E','I','O','U']
    dict_list = []
    for i in range(1,6):
        dict_list.extend(map(''.join,list(product(vowels, repeat = i))))
    dict_list.sort()
    return dict_list.index(word) + 1

 

 

  • 이 문제의 키워드
    • 모음사전을 만들 때, 모음 중에서 중복으로 뽑아서 조합할 수 있다 -> 중복순열
    • 그렇게 중복순열로 모음 조합을 만들면, 현재 알아보려는 word의 인덱스 + 1로 순서 판단
  • 문제

정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.

 

  • 답안
def solution(numbers):
    stack = []
    answer = [-1] * len(numbers)

    for i in range(len(numbers)):
            while stack and numbers[stack[-1]] < numbers[i]:
                answer[stack.pop()] = numbers[i]
            stack.append(i)
    
    return answer

 

 

  • 이 문제의 키워드
    • stack에 길이 만큼 -1을 넣어놓고, default로 뒤 큰 수가 없다고 가정하고 시작한다.
    • 뒤 순서의 수와 현재 수를 비교하여 큰 수 일 경우 stack.pop()을 하고, 현재 index를 넣어준다.
    • stack에 꼭 값만 들어갈 필요는 없다. 인덱스를 넣거나 빼내어 비교하고 싶을 때 index를 가지고 stack 구성 가능
  • 문제

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한 사항
작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
작업 진도는 100 미만의 자연수입니다.
작업 속도는 100 이하의 자연수입니다.
배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

 

  • 답안
import math

def solution(progresses, speeds):
    answer = []
    days = [math.ceil((100 - x) / y) for x, y in zip(progresses, speeds)]
    count = 0
    for i in days:
        if i > count:
            answer.append(1)
            count = i
        else:
            answer[-1] += 1

 

 

  • 이 문제의 키워드
    • 진행정도를 하루 노동력으로 나누면 남은 일자가 된다. -> 먼저 남은 일자로 변경시켜놓기
    • 먼저 순서의 남은 일자가 뒤 순서의 남은일자보다 크면 하루에 끝나는 작업에 포함
    • 먼저 순서의 남은 일자가 뒤 순서의 남은 일자보다 작으면 새로 일자 추가
  • 문제

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

  • 답안
def solution(s):
    answer = []
    count_0 = 0
    count_rep = 0
    while True:
        if s == '1':
            break
        count_0 += s.count('0')
        s = s.replace('0', '')
        s = bin(len(s))[2:]
        count_rep += 1
            
    return [count_rep, count_0]

 

 

  • 이 문제의 키워드
    • 문제에서 원하는 조건이 달성될 때까지 반복 -> while 문 사용
    • 10진수를 2진수로 바꾸기 bin() 
    • 그러나, bin()을 쓰면 문자열로 반환하면서 맨 앞에 '0b' 라는 이진수 판단 문자가 붙음
    • bin(s)[2:] 로 이진수 표현 변환
  • 문제

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

 

  • 답안
def right_str(s_copy):
    s_copy = s_copy.replace('[]', '')
    s_copy = s_copy.replace('()', '')
    s_copy = s_copy.replace('{}', '')
    return s_copy

def solution(s):
    answer = 0
    for rotation in range(len(s)):
        rotated_s = s[rotation:] + s[:rotation]
        rotated_copy = rotated_s
        for _ in range(len(s)//2): # 한 바퀴 회전할 때마다 s의 길이의 절반이 지나면 더 이상 변화가 없다.
            rotated_copy = right_str(rotated_copy)
            if not rotated_copy:
                answer += 1
                break
    return answer
  • 이 문제의 키워드
    • 문자열의 앞, 뒤를 바꾸려면 리스트처럼 s[-1], s[0] = s[0], s[-1] 은 안먹힌다.
    • s[i:] + s[:i] -> i번째 부터 끝까지와 처음부터 i 까지를 합치는게 회전이 된다.
    • s 길이의 절반만 for문 돌기 -> range(len(s)//2)
  • 문제

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

 

  • 답안
def solution(numbers):
    result = []
    for i in range(len(numbers)):
        for j in range(i+1, len(numbers)):
            new_num = numbers[i] + numbers[j]
            if new_num not in result:
                result.append(new_num)
    
    result.sort()
    
    return result

 

  • 이 문제의 키워드
    • 주어진 배열에서 조합해서 조건을 맞추는데, 시간복잡도가 초과하지 않기때문에 이중 for문을 사용하여 처리
    • 마지막 답안 제출 정렬 확인하기
  • 문제

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

 

 

  • 답안
def solution(arr, divisor):
    answer = []
    
    for i in arr:
        if i % divisor == 0:
            answer.append(i)
    if not answer:
        answer.append(-1)
        
    answer.sort()
    return answer

 

 

  • 이 문제의 키워드
    • 나머지 처리 하는 법
    • 문제 마지막에 값을 정렬하거나, 아무것도 없다면 -1을 출력하는 등의 요구를 잘 확인할 것
  • 문제

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

 

  • 답안
def solution(t, p):
    answer = 0
    
    for i in range(len(t)-(len(p)-1)):
        if int(t[i:i+len(p)]) <= int(p):
            answer += 1
            
    return answer

 

 

  • 이 문제의 키워드
    • 문자열을 int()로 숫자로 바꿀 때 선행하는 0은 알아서 사라진다.
    • 인덱싱할 때, 고려할 개수 len(p), 전체 길이 len(t) 를 가지고 for 문을 구성하는 법 생각하기
  • 문제

XYZ 마트는 일정한 금액을 지불하면 10일 동안 회원 자격을 부여합니다. XYZ 마트에서는 회원을 대상으로 매일 한 가지 제품을 할인하는 행사를 합니다. 할인하는 제품은 하루에 하나씩만 구매할 수 있습니다. 알뜰한 정현이는 자신이 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하려 합니다.

예를 들어, 정현이가 원하는 제품이 바나나 3개, 사과 2개, 쌀 2개, 돼지고기 2개, 냄비 1개이며, XYZ 마트에서 14일간 회원을 대상으로 할인하는 제품이 날짜 순서대로 치킨, 사과, 사과, 바나나, 쌀, 사과, 돼지고기, 바나나, 돼지고기, 쌀, 냄비, 바나나, 사과, 바나나인 경우에 대해 알아봅시다. 첫째 날부터 열흘 간에는 냄비가 할인하지 않기 때문에 첫째 날에는 회원가입을 하지 않습니다. 둘째 날부터 열흘 간에는 바나나를 원하는 만큼 할인구매할 수 없기 때문에 둘째 날에도 회원가입을 하지 않습니다. 셋째 날, 넷째 날, 다섯째 날부터 각각 열흘은 원하는 제품과 수량이 일치하기 때문에 셋 중 하루에 회원가입을 하려 합니다.

정현이가 원하는 제품을 나타내는 문자열 배열 want와 정현이가 원하는 제품의 수량을 나타내는 정수 배열 number, XYZ 마트에서 할인하는 제품을 나타내는 문자열 배열 discount가 주어졌을 때, 회원등록시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수를 return 하는 solution 함수를 완성하시오. 가능한 날이 없으면 0을 return 합니다.

 

 

  • 답안(내 풀이)
def solution(want, number, discount):
    answer = 0
    want_dict = {w: n for w, n in zip(want, number)}
    dict_keys = want_dict.keys()
    
    len_dis = len(discount)
    for i in range(len_dis):
        if len_dis - 9 >= i:
            now_dict = want_dict.copy()
            for j in discount[i: i+10]:
                if j in dict_keys:
                    now_dict[j] -= 1
            if all(i <= 0 for i in now_dict.values()):
                answer += 1
    
    return answer

 

  • 답안(더 나은 풀이)
from collections import Counter

def solution(want, number, discount):
    answer = 0
    want_dict = {w: n for w, n in zip(want, number)}

    for i in range(len(discount)-9):
        if want_dict == Counter(discount[i:i+10]): 
            answer += 1

    return answer

 

  • 이 문제의 키워드
    • 10개를 인덱싱할 수 있는 경우만 고려 대상일 때, 이중 for 문으로 고려대상인지를 판단했는데, 하나만으로도 가능
    • Counter는 원소들이 마구 적혀있는 list를 한번에 {key:count} 형태로 바꿔준다. 
    • 무작정 count -= 1로 count를 0을 만들고 비교하려고 하지말고, 그냥 새로 dict를 만들어 '==' 비교하는 방법 고려

+ Recent posts