• 문제

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:] 로 이진수 표현 변환

 

CI/CD 란? 

소프트웨어 개발 과정을 자동화하여 개발의 효율성과 신속성을 극대화하는 방법론

 

지속적통합(CI): 개발자들이 코드를 주기적으로 메인 레포지토리에 병합하여(코드 충돌 최소화) 자동으로 빌드 및 테스트하는 과정

지속적배포(CD): CI 과정을 넘어 빌드 및 테스트를 거친 코드 변경사항이 운영환경에 배포하는 과정

 

CI/CD의 중요성

개발주기를 단축하고, 소프트웨어 품질을 향상시키며, 사용자 만족도 증가

코드의 변경사항을 자동으로, 즉각적으로 현재 운영중인 서비스에 반영할 수 있게 함

잠재적인 문제를 조기에 발견하게 함

 

CI/CD를 위한 툴 - Github Actions

Github actions는 Github 리포지토리의 이벤트에 반응하여 워크플로우를 자동으로 실행

코드 푸시 or 풀 리퀘스트 -> 빌드, 테스트, 배포 등 자동 실행

 

코드 버전 관리 툴 github과 긴밀하게 연결되어 있으므로, 간편하게 사용할 수 있음

 

 

  • 문제

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

(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 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 문을 구성하는 법 생각하기

+ Recent posts