프로그래머스

Python Lv1. k번째 수 외 5문제

s2h15 2024. 10. 2. 17:09
728x90

1. K번째 수

 

문제 설명  

 

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

 

나의 풀이

 

def solution(array, commands):
    li = []
    for c in commands:
        li.append(sorted(array[c[0]-1:c[1]])[c[2]-1])
    return li

 

commands의 값을 for 문을 통해 가져오고, 요구사항대로 array의 특정 범위의 값을 정렬하여 특정 인덱스의 값만 가진 리스트를 출력하도록 하였다.

 

 

다른사람 풀이 + 개선점

 

for i,j,k in commands:
        print(i,j,k)

 

위 처럼 작성하여 굳이 c[0] , c[1]로 구할 필요없이 각각의 숫자를 i,j,k에 할당하여 간결하게 만들 수 있다.

 

2. 행렬의 덧셈

 

문제 설명  

 

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

 

 

나의 풀이

def solution(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr1[0])):
            arr1[i][j] += arr2[i][j]
    return arr1

 

for문을 통해 arr1의 행렬의 값에 arr2의 값을 더하여 return하였다.

 

 

 

 

다른사람 풀이 + 개선점

 

def sumMatrix(A,B):
    answer = [[c + d for c, d in zip(a,b)] for a, b in zip(A,B)]
    return answer

 

zip을 사용하여 간결하게 두 행렬의 값을 for문으로 구할 수 있다.

 

3. 3진법 뒤집기

 

문제 설명  

 

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

 

다른사람 풀이 + 개선점

 

def solution(n):
    result = ''
    while n > 0:
        result += str(n%3)
        n = n//3
    return int(result, 3)

 

3진법으로 while문을통해 변경한다. 이때 순서가 이미 반대로 구해진다.

int( 문자열 , 3)  을 통해 3진법으로 되어있는 result를 10진법으로 출력한다.

 

4. 크기가 작은 부분 문자열

 

문제 설명  

숫자로 이루어진 문자열 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):
    cnt = 0
    for i in range(len(t)-len(p)+1):
        if t[i:i+len(p)] <= p:
            cnt +=1
    return cnt

 

for문을 통해 0부터 t의 길이- p의 길이 만큼까지 순서대로 반환하고, p의 길이만큼의 부분문자열을 구하여 p의 값과 비교하여 작거나 같은 경우에만 cnt에 1을 더하도록 하였다.

 

5. 이상한 문자 만들기

 

문제 설명  

 

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

 

 

나의 풀이

def solution(s):
    a = s.split(' ')
    for i , j in enumerate(a) :
        word = ''
        for k in range(len(j)):
            if k%2 == 0:
                word += a[i][k].upper()
            else:
                word += a[i][k].lower()
        a[i] = word
    return ' '.join(a)

 

우선 s 문자열을 띄어쓰기 단위로 단어로 나누어 a라는 리스트에 넣는다.

a 리스트의 단어들을 하나씩 빼오며 각각 단어의 인덱스에따라 짝수 , 홀수 구분 및 대소문자 반환하여 word라는 문자열로 만들어 a 리스트의 기존 단어를 변경한다.

이러한 새로 생성된 단어들을 가진 a 리스트를 공백을 포함하여 문자열로 합쳐 반환하였다.

 

 

 

 

728x90