본문 바로가기
코딩테스트

프로그래머스 기초 Day 15 파이썬

by 피갓자 2025. 4. 16.

프로그래머스
프로그래머스

조건에 맞게 수열 변환하기 1

문제 설명

정수 배열 arr가 주어집니다.

arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱합니다.

그 결과인 정수 배열을 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 1 ≤ arr의 길이 ≤ 1,000,000
    • 1 ≤ arr의 원소의 값 ≤ 100

입출력 예

arr result
[1, 2, 3, 100, 99, 98] [2, 2, 6, 50, 99, 49]

입출력 예 설명

입출력 예 #1

  • 1, 3은 50 미만의 홀수 이므로 2를 곱하고, 100, 98은 50 이상의 짝수이므로 2로 나눕니다.
  • 나머지 값들은 변경 조건에 해당하지 않으므로 바꾸지 않습니다.
  • 따라서 [2, 2, 6, 50, 99, 49]를 return 합니다.

solution.py

def solution(arr):
    answer = []
    
    for i in arr:
        if i >= 50 and i % 2 == 0:
            answer.append(i // 2)
        elif i <50 and i % 2 != 0:
            answer.append(i * 2)
        else:
            answer.append(i)
    
    return answer

조건에 맞게 수열 변환하기 2

문제 설명

정수 배열 arr가 주어집니다.

arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.

이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다.

이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.

단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.

제한사항

  • 1 ≤ arr의 길이 ≤ 1,000,000
    • 1 ≤ arr의 원소의 값 ≤ 100

입출력 예

arr result
[1, 2, 3, 100, 99, 98] 5

입출력 예 설명

입출력 예 #1

  • 위 작업을 반복하면 다음과 같이 arr가 변합니다.
반복 횟수 arr
0 [1, 2, 3, 100, 99, 98]
1 [3, 2, 7, 50, 99, 49]
2 [7, 2, 15, 25, 99, 99]
3 [15, 2, 31, 51, 99, 99]
4 [31, 2, 63, 51, 99, 99]
5 [63, 2, 63, 51, 99, 99]
6 [63, 2, 63, 51, 99, 99]
  • 이후로 arr가 변하지 않으며, arr(5) = arr(6)이므로 5를 return 합니다.

solution.py

def solution(arr):
    answer = 0
    
    while True:
        temp = []
    
        for i in arr:
            if i >= 50 and i % 2 == 0:
                temp.append(i // 2)
            elif i <50 and i % 2 != 0:
                temp.append(i * 2 + 1)
            else:
                temp.append(i)
    
        if arr == temp:
            break
    
        arr = temp
        answer += 1
        
    return answer

1로 만들기

문제 설명

정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 됩니다.

예를 들어 10이 있다면 다음과 같은 과정으로 1이 됩니다.

  • 10 / 2 = 5
  • (5 - 1) / 2 = 2
  • 2 / 2 = 1

위와 같이 3번의 나누기 연산으로 1이 되었습니다.

정수들이 담긴 리스트 num_list가 주어질 때, num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ num_list의 길이 ≤ 15
  • 1 ≤ num_list의 원소 ≤ 30

입출력 예

num_list result
[12, 4, 15, 1, 14] 11

입출력 예 설명

입출력 예 #1

  • 12는 3번, 4는 2번, 15는 3번, 1은 0번, 14는 3번의 연산이 필요하기 때문에 총 11번의 연산이 필요합니다.

solution.py

def solution(num_list):
    answer = 0
    
    for i in num_list:
        while i > 1:
            if i % 2 == 0:
                i = i // 2
            else:
                i = (i - 1) // 2
            answer += 1        
    
    return answer

길이에 다른 연산

문제 설명

정수가 담긴 리스트 num_list가 주어질 때, 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을 10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 2 ≤ num_list의 길이 ≤ 20
  • 1 ≤ num_list의 원소 ≤ 9
  • num_list의 원소를 모두 곱했을 때 2,147,483,647를 넘는 입력은 주어지지 않습니다.

입출력 예

num_list result
[3, 4, 5, 2, 5, 4, 6, 7, 3, 7, 2, 2, 1] 51
[2, 3, 4, 5] 120

입출력 예 설명

입출력 예 #1

  • 리스트의 길이가 13이므로 모든 원소의 합인 51을 return합니다.

입출력 예 #2

  • 리스트의 길이가 4이므로 모든 원소의 곱인 120을 return합니다.

solution.py

def solution(num_list):
    answer = 1
    if len(num_list) >= 11:
        return sum(num_list)
    else:
        for i in num_list:
            answer *= i  
        return answer

원하는 문자열 찾기

문제 설명

알파벳으로 이루어진 문자열 myString과 pat이 주어집니다.

myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0을 return 하는 solution 함수를 완성해 주세요.

단, 알파벳 대문자와 소문자는 구분하지 않습니다.

제한사항

  • 1 ≤ myString의 길이 ≤ 100,000
  • 1 ≤ pat의 길이 ≤ 300
  • myString과 pat은 모두 알파벳으로 이루어진 문자열입니다.

입출력 예

myString pat return
"AbCdEfG" "aBc" 1
"aaAA" "aaaaa" 0

입출력 예 설명

입출력 예 #1

  • "AbCdEfG"의 0~2번 인덱스의 문자열은 "AbC"이며, 이는 pat인 "aBc"와 같습니다. 따라서 1을 return 합니다.

입출력 예 #2

  • myString의 길이가 pat보다 더 짧기 때문에 myString의 부분 문자열 중 pat와 같은 문자열이 있을 수 없습니다. 따라서 0을 return 합니다.

solution.py

def solution(myString, pat):
    myString = myString.lower()
    pat = pat.lower()
    
    if pat in myString:
        return 1
    else:
        return 0