Python

[실무]프로그래머스 Python3 코딩 기초 트레이닝(41~80문제)

노력하는 백곰 2024. 7. 25. 22:19

출처

- 코딩테스트 : Python3 / 코딩 기초 트레이닝 / 모든 상태 체크 / 41~80문제

https://school.programmers.co.kr/learn/challenges?order=recent&languages=python3&partIds=44139&page=1&statuses=unsolved%2Csolving%2Csolved%2Csolved_with_unlock

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

 

■ 연습문제

41. 배열 만들기 5

def solution(intStrs, k, s, l):
    answer = []
    for i in intStrs:
        if int(i[s:s+l]) > k:
            answer.append(int(i[s:s+l]))
    return answer

 


42. 부분 문자열 이어 붙여 문자열 만들기

def solution(my_strings, parts):
    answer = []
    for i in range(0, len(my_strings)):
        some_tex = my_strings[i][parts[i][0]:parts[i][1]+1]
        answer.append(some_tex)
    return ''.join(answer)

 


43. 문자열의 뒤의 n글자

def solution(my_string, n):
    answer = my_string[-n:]
    return answer

 


44. 접미사 배열

.sort() 함수 : 기존 리스트를 정렬(내림차순 정렬 'reverse=True')
sorted() 함수 : 새로운 리스트를 정렬

def solution(my_string):
    answer = []
    for i in range(0, len(my_string)):
        answer.append(my_string[i:])
    answer.sort()
    return answer

 


45. 접미사인지 확인하기

def solution(my_string, is_suffix):
    answer = []
    for i in range(0, len(my_string)):
        if my_string[i:] == is_suffix:
            return 1
    return 0

 


46. 문자열의 앞의 n글자

def solution(my_string, n):
    answer = my_string[:n]
    return answer

 


47. 접두사인지 확인하기

def solution(my_string, is_prefix):
    answer = 0
    tmp = []
    for i in range(0, len(my_string)):
        tmp.append(my_string[:i])
    #tmp = [my_string[:i] for i in range(0, len(my_string))]
    for i in tmp:
        if is_prefix == i:
            answer = 1
    return answer

 


48. 문자열 뒤집기

def solution(my_string, s, e):
    #뒤집을 문자 선택
    answer = ''
    need_cha_tex = my_string[s:e+1]
    
    #문자 뒤집기
    chan_tex = ''
    for i in need_cha_tex:
        chan_tex = i + chan_tex
        
    answer = my_string[:s] + chan_tex + my_string[e+1:]
    return answer

 


49. 세로 읽기

def solution(my_string, m, c):
    answer = ''
    
    temp_list = []
    for i in range(0, len(my_string)//m):
        temp_list.append(list(my_string[i*m:i*m+m]))
        
    for i in temp_list:
        answer += i[c-1]
    return answer

 


50. qr code

def solution(q, r, code):
    some_text = ''
    some_list = []
    
    for i in range(0, len(code)): 
        some_text = i % q
        if some_text == r:
            some_list.append(code[i])
    
    answer = ''.join(some_list)
    return answer

 


51. 문자 개수 세기

아스키코드(ASCII)를 활용한 알파벳 리스트 생성 방법

- 예시, '[chr(code) for code in range(95, 123)]'

def solution(my_string):
    answer = [0] * 52
    chars = { "A": 0, "B": 1, "C": 2, "D": 3, "E": 4, "F": 5, "G": 6, "H": 7, "I": 8, "J": 9, 
              "K": 10, "L": 11, "M": 12, "N": 13, "O": 14, "P": 15, "Q": 16, "R": 17, "S": 18, 
              "T": 19, "U": 20, "V": 21, "W": 22, "X": 23, "Y": 24, "Z": 25, "a": 26, "b": 27, 
              "c": 28, "d": 29, "e": 30, "f": 31, "g": 32, "h": 33, "i": 34, "j": 35, "k": 36, 
              "l": 37, "m": 38, "n": 39, "o": 40, "p": 41, "q": 42, "r": 43, "s": 44, "t": 45, 
              "u": 46, "v": 47, "w": 48, "x": 49, "y": 50, "z": 51 }

    for i in my_string:
        cnt = my_string.count(i)
        #알파벳별 인덱스 위치를 활용한 개수 세기
        answer[chars[i]] = cnt   
    
    return answer

 


52. 배열 만들기 1

.sort() 함수 : 기존 리스트를 정렬(내림차순 정렬 'reverse=True')

def solution(n, k):
    answer = []
    for i in range(1, n+1):
        if i % k == 0:
            answer.append(i)
    #answer.sort(reverse=True) #(기존 리스트)내림차순 정렬
    answer.sort()              #(기존 리스트)오름차순 정렬
    
    return answer

 

 

53. 글자 지우기

#my_string에서 특정 인덱스(indices)에 위치한 텍스트를 제외하고 출력
def solution(my_string, indices):
    answer = ''
    
    for i in range(0, len(my_string)):
        if i not in indices:
            answer += my_string[i]
        
    return answer

 


54. 카운트 다운

def solution(start_num, end_num):
    answer = []
    for i in range(start_num, end_num-1, -1): 
        answer.append(i)
    return answer

 


55. 가까운 1 찾기

def solution(arr, idx):
    answer = 0
    temp = []
    
    for i in range(idx, len(arr)):
        if arr[i] == 1:
            temp.append(i)
    
    if len(temp) == 0 :
        answer = -1
    else :
        answer = min(temp)
    
    return answer

 


56. 리스트 자르기

def solution(n, slicer, num_list):
    answer = []
    if n == 1:
        #'b' 인덱스까지 표기해야하고 0부터 시작하는 인덱스 환경을 고려했을 때 '+1' 추가 적용 必
        answer = num_list[0:slicer[1]+1]  
    elif n == 2:
        answer = num_list[slicer[0]:]
    elif n == 3:
        answer = num_list[slicer[0]:slicer[1]+1]
    else: 
        answer = num_list[slicer[0]:slicer[1]+1:slicer[2]]    
    return answer

 


57. 첫 번째로 나오는 음수

def solution(num_list):
    answer = 0
    for i in range(0, len(num_list)):
        if num_list[i] < 0:
            return num_list.index(num_list[i])
    return -1

 


58. 배열 만들기 3

def solution(arr, intervals):
    a1, b1 = intervals[0]
    a2, b2 = intervals[1]
    return arr[a1:b1+1] + arr[a2:b2+1]

 


59. 2의 영역

def solution(arr):
    #배열 내 '2'가 존재하지 않을 경우 '[-1]' 출력
    if 2 not in arr:
        return [-1]
    
    #(배열 내 '2'가 존재하는 경우) 배열 내 마지막 '2' 위치까지 출력
    #배열 내 '2' 마지막 위치는 '전체 배열 길이'에서 '마지막 등장한 2 위치'를 빼면 출력 가능
    return arr[arr.index(2) : len(arr) - arr[::-1].index(2)]

 


60. 배열 조각하기

def solution(arr, query):
    for idx, query in enumerate(query):
        if idx % 2 == 1:        #홀수 인덱스, 앞부분 제거하여 출력
            arr = arr[query:]   
        elif idx % 2 == 0:      #짝수 인덱스, 뒷부분 제거하여 출력
            arr = arr[:query+1] 
    return arr

 


61. n 번째 원소부터

def solution(num_list, n):
    answer = num_list[n-1:]
    return answer

 


62. 순서 바꾸기

def solution(num_list, n):
    # 예시, [1, 6, 2] = [1, 6] + [2]
    answer = num_list[n:] + num_list[:n]
    return answer

 


63. 왼쪽 오른쪽

def solution(str_list):
    answer = []
    for i in range(0, len(str_list)):
        #'l'이 먼저나오면 문자열을 기준으로 왼쪽 문자 출력
        if str_list[i] == 'l':
            return str_list[:i]
        
        #'r'이 먼저나오면 문자열을 기준으로 오른쪽 문자 출력
        elif str_list[i] == 'r':
            return str_list[i+1:]
    return answer

 


64. n 번째 원소까지

def solution(num_list, n):
    answer = num_list[:n]
    return answer

 


65. n개 간격의 원소들

def solution(num_list, n):
    answer = []
    for i in range(0, len(num_list), n):
        answer.append(num_list[i])
    return answer

 


66. 홀수 vs 짝수

def solution(num_list):
    #짝수합의 값과 홀수합의 값 중에서 높은 값을 반환
    answer = max(sum(num_list[0::2]), sum(num_list[1::2]))
    return answer

 


67. 5명씩

def solution(names):    
    return names[::5]

 


68. 할 일 목록

def solution(todo_list, finished):
    answer = []
    
    for i in range(0, len(finished)):
        if finished[i] == True:
            pass
        elif finished[i] == False:
            answer.append(todo_list[i])

    return answer

 


69. n보다 커질 때까지 더하기

def solution(numbers, n):
    answer = 0
    for i in range(0, len(numbers)):
        answer += numbers[i]
        if answer > n:
            return answer

 


70. 수열과 구간 쿼리 1

enumerate() 함수 : 반복문(for 등)에서 순서와 요소 값을 동시에 반환받을 때 사용하는 함수

def solution(arr, queries):    
    for idx, value in enumerate(queries):
        #queries 2차원 배열에서 1개씩 가져와 각각의 인덱스에 해당하는 arr값을 누적'+1' 처리
        for i in range(value[0], value[1]+1):
            arr[i] += 1
    return arr

 


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

def solution(arr):
    answer = []
    for i in range(0, len(arr)):
        if (arr[i] >= 50) and (arr[i]%2 == 0):  #50보다 크거나 같고 짝수 값
            answer.append(arr[i]/2)
        elif (arr[i] < 50) and (arr[i]%2 != 0): #50보다 작고 홀수 값
            answer.append(arr[i]*2) 
        else:                                   #그외 값(50보다 작고 짝수 값 등)
            answer.append(arr[i])
    return answer

 


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

.copy() 함수 : 얕은 수준의 복사 함수로써, 원본 객체의 참조(메모리 주소)만 복사(즉, 원본 객체 값이 변경되면 영향 받음)
.deepcopy() 함수 : 깊은 수준의 복사 함수로써, 원본 객체를 완전히 복사(즉, 원본 객체의 값이 변경되어도 영향 안받음)

def solution(arr):
    count = -1           #반복 횟수 초기값
    raw = arr.copy()     #원본 결과와 변화된 결과를 비교하는 것이므로 얕은 복사함수 활용
    while 1:
        raw = arr.copy()
               
        for i in range(0, len(arr)):
            if (arr[i] >= 50) and (arr[i]%2 == 0): 
                arr[i] = arr[i]//2
            elif (arr[i]<=50) and (arr[i]%2 == 1):
                arr[i] = (arr[i]*2)+1
                
                
        count += 1       #반복 횟수 카운트

        # 이전 배열과 변환 배열의 모든 요소들이 같은지 비교, 
        a = 0
        for j in range(0, len(arr)):   
            if arr[j] == raw[j]:
                a += 1
        if len(arr) == a:
            return count  # 변환횟수 return

 


73. 1로 만들기

def solution(num_list):
    count = 0
    for i in range(0, len(num_list)):
        while num_list[i] != 1:
            if num_list[i]%2 == 0:
                num_list[i] = num_list[i]/2
                count += 1
            elif num_list[i]%2 != 0:
                num_list[i] = (num_list[i]-1)/2
                count += 1
    return count

 


74. 길이에 따른 연산

reduce() 함수 : 리스트 내 요소들을 순차적으로 누적 계산하여 결과를 리턴하는 함수(누적 계산은 따로 함수 정의 必)

from functools import reduce
def func(x, y):
    return x+y

def solution(num_list):
    answer = 0
    if len(num_list) >= 11:
        answer = sum(num_list)
    else:
        answer = reduce(func, num_list)            
    return answer

 


75. 원하는 문자열 찾기

.lower() 함수 : 문자열 내 알파벳을 소문자로 변환하는 함수(즉, 대문자 → 소문자 반환)

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

 


76. 대문자로 바꾸기

.upper() 함수 : 문자열 내 알파벳을 대문자로 변환하는 함수(즉, 소문자 → 대문자 반환)

def solution(myString):
    answer = myString.upper()
    return answer

 


77. 소문자로 바꾸기

.lower() 함수 : 문자열 내 알파벳을 소문자로 변환하는 함수(즉, 대문자 → 소문자 반환)

def solution(myString):
    answer = myString.lower()
    return answer

 


78. 배열에서 문자열 대소문자 변환하기

def solution(strArr):
    answer = []
    for i in range(0, len(strArr)):
        if (i+1) % 2 == 1:   #짝수(인덱스: 0, 2, 4...)
            answer.append(strArr[i].lower())
        elif (i+1) % 2 == 0: #홀수(인덱스: 1, 3, 5...)
            answer.append(strArr[i].upper())
            
    return answer

 


79. A 강조하기

replace() 함수 : 문자열 안에 특정 문자를 선택하여 새로운 문자로 변경하는 함수

def solution(myString):
    answer = myString.lower()
    answer = answer.replace('a', 'A')
    return answer

 


80. 특정한 문자를 대문자로 바꾸기

.upper() 함수 : 문자열 내 알파벳을 대문자로 변환하는 함수(즉, 소문자 → 대문자 반환)

replace() 함수 : 문자열 안에 특정 문자를 선택하여 새로운 문자로 변경하는 함수

def solution(myString, alp):
    alp_upper = alp.upper()
    answer = myString.lower()
    answer = answer.replace(alp, alp_upper)
    return answer