[Python] 알고리즘 연습 16 (프로그래머스)

Lake·2024년 5월 27일

Python 문제

목록 보기
16/22
post-thumbnail

JadenCase 문자열 만들기 (연습문제)

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

    • 제한사항
      • s는 길이 1 이상 200 이하인 문자열입니다.
      • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
        • 숫자는 단어의 첫 문자로만 나옵니다.
        • 숫자로만 이루어진 단어는 없습니다.
        • 공백문자가 연속해서 나올 수 있습니다.

제출한 코드 :

def solution(s):
    words = s.split(' ')
    jaden_case_words = []
    
    for word in words:
        if word:
            # 첫 문자가 알파벳이면 대문자로 변환, 나머지는 소문자로 변환
            jaden_case_words.append(word[0].upper() + word[1:].lower())
        else:
            # 공백인 경우 그대로 추가
            jaden_case_words.append('')
    
    return ' '.join(jaden_case_words)

이진 변환 반복하기 (월간 코드 챌린지 시즌1)

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

    1. x의 모든 0을 제거합니다.
    2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

    예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

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

    • 제한사항
      • s의 길이는 1 이상 150,000 이하입니다.
      • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

제출한 코드 :

def solution(s):
    answer = [0, 0]  # [이진 변환 횟수, 제거된 0의 개수]

    # s가 "1"이 될 때까지 반복
    while s != "1":
        answer[0] += 1  # 이진 변환 횟수 증가
        answer[1] += s.count('0')  # 0의 개수를 세어 제거된 0의 개수에 추가
        s = bin(s.count('1'))[2:]  # s에 이진 변환을 적용하여 다음 문자열로 업데이트

    return answer

피보나치 수 (연습문제)

  • 피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.

    예를들어

    - F(2) = F(0) + F(1) = 0 + 1 = 1
    - F(3) = F(1) + F(2) = 1 + 1 = 2
    - F(4) = F(2) + F(3) = 1 + 2 = 3
    - F(5) = F(3) + F(4) = 2 + 3 = 5

    와 같이 이어집니다.

    2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.

    • 제한사항
      • n은 2 이상 100,000 이하인 자연수입니다.

제출한 코드 :

def solution(n):
    fibo = [0, 1]  # 초기 피보나치 수열
    MOD = 1234567  # 나머지

    # n까지 피보나치 수열 계산
    for i in range(2, n + 1):
        fibo.append((fibo[-1] + fibo[-2]) % MOD)

    return fibo[n]

카펫 (제출 내역)

  • Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

    Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

    Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

    • 제한사항
      • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
      • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
      • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

제출한 코드 :

def solution(brown, yellow):
    for i in range(1, yellow + 1):
        if yellow % i == 0:
            # yellow를 가로와 세로의 길이로 나눔
            if 2 * (i + yellow // i) + 4 == brown:
                # 갈색 격자 수와 일치하는 경우 가로와 세로의 길이 반환
                return [max(i, yellow // i) + 2, min(i, yellow // i) + 2]

예상 대진표 (2017 팁스타운)

  • △△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다.

    이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.

    • 제한사항
      • N : 21 이상 220 이하인 자연수 (2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.)
      • A, B : N 이하인 자연수 (단, A ≠ B 입니다.)

제출한 코드 :

def solution(n, a, b):
    answer = 0

    # 대진이 이루어지는 참가자 번호의 범위를 정하고, 두 참가자가 만날 때까지 반복
    while a != b:
        answer += 1
        a = (a + 1) // 2  # 다음 라운드에서의 참가자 번호 계산
        b = (b + 1) // 2

    return answer

0개의 댓글