Python

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

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

■ 출처

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

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

 

 

■ 연습문제

81. 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

find() / refind() 함수 : 문자열 내부에서 특정 문자가 어디에 위치하는지 찾는 함수
- find() 왼쪽부터 찾는 함수

- rfind() 오른쪽부터 찾는 함수

def solution(myString, pat):
    end = myString.rfind(pat)    
    return myString[:end + len(pat)]

 


82. 문자열이 몇 번 등장하는지 세기

def solution(myString, pat):    
    start = 0                            #초기 인덱스 위치
    cnt = 0                              #찾는 인덱스가 등장하는 횟수
    
    while True:
        idx = myString.find(pat, start)  #myString 문자열 왼쪽부터 pat문자가 어디 인덱스에 위치하는지 찾아라
        if idx == -1:
            break
        cnt += 1
        start = idx + 1
    return cnt

 


83. ad 제거하기

def solution(strArr):
    answer = []
    for i in range(0, len(strArr)):
        if 'ad' in strArr[i]:
            pass
        else:
            answer.append(strArr[i])
    return answer

 


84. 공백으로 구분하기 1

split() 함수 : 문자열을 특정 문자(구분자)로 나눌때 사용하는 함수

def solution(my_string):
    return my_string.split(' ')

 


85. 공백으로 구분하기 2

split() 함수 : 문자열을 특정 문자(구분자)로 나눌때 사용하는 함수

strip() 함수 : 문자열 양 끝에 있는 공백을 제거해주는 함수

def solution(my_string):
    answer = []
    some_litex01 = my_string.split(' ')
    
    for i in range(0, len(some_litex01)):
        some_litex02 = some_litex01[i].strip()
        if '' == some_litex02:
            pass
        else: 
            answer.append(some_litex02)
    return answer

 

 

86. x 사이의 개수

def solution(myString):
    answer = []
    some_litex = myString.split('x')
    for i in range(0, len(some_litex)):
        if some_litex[i] == '':
            answer.append(0)
        else:
            answer.append(len(some_litex[i]))
    return answer

 

 

87. 문자열 잘라서 정렬하기

sorted() 함수 : arr 배경을 변형하지 않고, 오른차순 정렬된 새로운 배열을 반환

- 예시, [1, 2, 3, 4, 5....]

def solution(myString):
    answer = []
    some_litex = myString.split('x')
    for i in range(0, len(some_litex)):
        if some_litex[i] == '':
            pass
        else:
            answer.append(some_litex[i])
    return sorted(answer)

 

 

88. 간단한 식 계산하기

eval() 함수 : 문자열로 된 수식을 입력받아 그 결과를 반환하는 함수(즉, 문자열 수식을 실행)

def solution(binomial):
    return eval(binomial)

 

 

89. 문자열 바꿔서 찾기

.join() 함수 : 매개변수로 들어온 리스트를 합쳐서 반환해주는 함수

- 예시, ['a', 'b', 'c'] → 'abc'

"""def solution(myString, pat):
    answer = 0
    new_myString = []
    for i in range(0, len(myString)):
        if myString[i] == 'A':
            new_myString.append('B')
        else: 
            new_myString.append('A')
    new_myString = ''.join(new_myString)
    if pat in new_myString:
        return 1
    else:
        return 0"""
        
def solution(myString, pat):
    #myString문자열 내 'A <--> B'를 바꿔주고, 'pat' 문자가 존재하는지 확인
    answer = int(pat in myString.replace('A', 'C').replace('B', 'A').replace('C', 'B'))
    return answer

 

 

90. rny_string

def solution(myString):
    answer = myString.replace('m', 'rn')
    return answer

 

 

91. 세 개의 구분자

return A or B : A연산을 우선 반환하고, 반환이 안될 경우 B를 반환해라

def solution(myStr):
    answer = myStr.replace('a', ' ').replace('b', ' ').replace('c', ' ') 
    return answer.split() or ["EMPTY"]

 

 

92. 배열의 원소만큼 추가하기

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

 

 

93. 빈 배열에 추가, 삭제하기

리스트 슬라이싱 활용 예시: 
- my_list = [1, 2, 3, 4, 5, 6, 7, 8]

- my_list[3:] → [4, 5, 6, 7, 8]
- my_list[:5] → [1, 2, 3, 4, 5]
- my_list[2:6] → [3, 4, 5, 6]

- my_list[:-2] → [1, 2, 3, 4, 5, 6]
- my_list[-4:] → [5, 6, 7, 8]
- my_list[-5:-2] → [4, 5, 6]

def solution(arr, flag):
    answer = []
    for i in range(0, len(flag)):
        if flag[i] == True:
            for j in range(0, arr[i]*2):
                answer.append(arr[i])
        else: 
            answer = answer[:-arr[i]] 
    return answer

 

 

94. 배열 만들기 6

pop() 함수 : 리스트의 맨 마지막 원소를 리턴하고 해당 원소는 삭제시키는 함수

def solution(arr):
    stk = []
    
    for i in range(0, len(arr)):
        #1. stk 배열이 빈 경우, arr[i]를 추가해라
        if len(stk) == 0:
            stk.append(arr[i])
        #2. stk 배경에 원소가 있는 경우, 
        else:
            #2.1. stk의 마지막 원소가 arr[i] 원소와 같으면, stk의 마지막 원소를 제거
            if stk[-1] == arr[i]:
                stk.pop()
                
            #2.2. stk의 마지막 원소가 arr[i] 원소와 드라면, stk의 마지막 원소에 arr[i]를 추가
            elif stk[-1] != arr[i]:
                stk.append(arr[i])
    
    #만약, 빈 배열이면 [-1]을 반환해라
    if len(stk) == 0:
        return [-1]
    
    return stk

 

 

95. 무작위로 K개의 수 뽑기

def solution(arr, k):
    answer = []
    #순차적으로 중복되지 않도록 answer 리스트에 요소 추가(단, k와 길이가 동이해지면 멈춰라)
    for i in arr:
        if i not in answer:
            answer.append(i)
            
        if len(answer) == k:
            break

    #k 보다 answer 길이가 작을 경우, 그 차이만큼 '-1'을 추가해서 반환
    return answer + [-1] * (k - len(answer))

 

 

96. 배열의 길이를 2의 거듭제곱으로 만들기

def solution(arr):
    #2의 거듭제곱: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
    answer = [2**i for i in range(0, 11)]
    
    #arr 길이가 2의 거듭제곱이 되도록 반복문을 계속 돌려숴 맞춰라
    while len(arr) not in answer:
        arr.append(0)
    return arr

 

 

97. 배열 비교하기

def solution(arr1, arr2):
    answer = 0
    if len(arr1) != len(arr2):
        answer = -1 if len(arr2) > len(arr1) else 1
        """if len(arr2) > len(arr1):
            answer = -1
        else:
            answer = 1"""
            
    elif len(arr1) == len(arr2):
        if sum(arr1) == sum(arr2):
            answer = 0
        else:
            answer = 1 if sum(arr1) > sum(arr2) else -1
            """if sum(arr1) > sum(arr2):
                answer = 1
            else:
                answer = -1"""
    return answer

 

 

98. 문자열 묶기

set() 함수 : 집합(set) 타입으로 변경하여 중복된 요소를 제거하는 함수

count() 함수 : 문자열에서 특정 문자가 몇개인지 확인하는 함수

- 예시, 'BlockDMask'.count("k")

def solution(strArr):
    # [1, 2, 3]에 대해 [1, 2, 1, 3, 2]에 각각 몇개씩 있는지 확인하고, 그중 가장 큰 것을 출력해라
    answer = [len(i) for i in strArr]
    answer_cont = []
    for i in set(answer):
        answer_cont.append(answer.count(i))
    return max(answer_cont)

 

 

99. 배열의 길이에 따라 다른 연산하기

def solution(arr, n):
    for idx, val in enumerate(arr):
        if len(arr) % 2 == 0: #arr 길이가 짝수일 경우, 
            if idx % 2 == 1:  #홀수 인덱스 위치에 n을 더해라
                arr[idx] += n
        else:                 #arr 길이가 홀수일 경우, 
            if idx % 2 == 0:  #짝수 인덱스 위치에 n을 더해라
                arr[idx] += n
    return arr

 

 

100. 뒤에서 5등까지

sorted() 함수 : arr 배경을 변형하지 않고, 오른차순 정렬된 새로운 배열을 반환

- 예시, [1, 2, 3, 4, 5....]

def solution(num_list):
    return sorted(num_list)[:5]

 

 

101. 뒤에서 5등 위로

def solution(num_list):
    num_list = sorted(num_list)[5:]
    return num_list

 


102. 전국 대회 선발 고사

lambda 함수 : 간편하게 함수를 정의할 때 사용하는 함수(def 기능은 유사하지만, 더 간결하게 사용)
- 예시, add = lambda x, y: x + y

def solution(rank, attendance):
    answer =0
    rank_stu_num_list = []

    for i in range(0, len(rank)):
        if attendance[i] == True:
            rank_stu_num_list.append([rank[i], i])

    #rank를 기준으로 오른차순 정렬하고, 상위 등수 3명의 학생번호를 활용하여 결과 반환
    rank_stu_num_list.sort(key = lambda v : v[0])
    return (10000 * rank_stu_num_list[0][1]) + (100 * rank_stu_num_list[1][1]) + rank_stu_num_list[2][1]

 

 

103. 정수 부분

def solution(flo):
    return int(flo)

 

 

104. 문자열 정수의 합

map() 함수 : 데이터 집합(iterable)의 각 여서에 대한 함수(function)를 적용한 결과를 반환하는 함수

def solution(num_str):
    #answer = [int(i) for i in list(num_str)]
    answer = (list(map(int, num_str)))
    return sum(answer)

 

 

105. 문자열을 정수로 변환하기

def solution(n_str):
    return int(n_str)

 

 

106. 0 떼기

def solution(n_str):
    return str(int(n_str))

 

 

107. 두 수의 합

def solution(a, b):
    answer = int(a) + int(b)
    return str(answer)

 

 

108. 문자열로 변환

def solution(n):
    return str(n)

 

 

109. 배열의 원소 삭제하기

"""
#arr 요소들 중에서 delete_list 요소들과 동일하지 않는 요소들만 반환해라
def solution(arr, delete_list):
    return [i for i in arr if i not in delete_list]
"""

def solution(arr, delete_list):
    for i in range(0, len(delete_list)):
        if delete_list[i] in arr:
            idx_del = arr.index(delete_list[i])
            del arr[idx_del]
    return arr

 

 

110. 부분 문자열인지 확인하기

def solution(my_string, target):
    return (1 if target in my_string else 0)

 

 

111. 부분 문자열

def solution(str1, str2):
    return (1 if str1 in str2 else 0)

 

 

112. 꼬리 문자열

def solution(str_list, ex):
    new_str_list = []
    
    for i in range(0, len(str_list)):
        if ex not in str_list[i]:
            new_str_list.append(str_list[i])
    
    return ''.join(new_str_list)

 

 

113. 정수 찾기

def solution(num_list, n):
    if n in num_list:
        return 1
    else:
        return 0

 

 

114. 주사위 게임 1

def solution(a, b):
    answer = 0
    if (a%2 == 1) and (b%2 == 1):  #a, b 모두 홀수가 맞음
        answer = a**2 + b**2
    elif (a%2 == 1) or (b%2 == 1): #a, b 둘 중에서 1개만 홀수
        answer = 2 * (a + b)
    else:                          #a, b 모두 홀수가 아님
        answer = abs(a - b)
    return answer

 

 

115. 날짜 비교하기

datetime() 함수 : 날짜/시간 형태 데이터를 생성하는 함수
- datetime 모듈 : 파이썬 내장 모듈(함수, 변수, 클래스를 정의하는 파일) 중 하나로 날짜와 시간을 다루기 위한 클래스와 함수를 제공
- 예시, 
  import datetime
  datetime(2021, 9, 1, 12, 30, 45) → 2021-09-01 12:30:45

from datetime import datetime

def solution(date1, date2):
    new_date1 = datetime(date1[0], date1[1], date1[2])
    new_date2 = datetime(date2[0], date2[1], date2[2])

    #date1이 date2 보다 앞서는 날짜라면 '1'을, 아니면 '0'을 반환
    return 1 if new_date1 < new_date2 else 0

 

 

116. 커피 심부름

ord() 함수 : 하나의 문자를 아스키코드로 반환해주는 함수
- 예시, ord('a') → 97
chr() 함수 : 하나의 아스키코드를 문자로 반환해주는 함수
- 예시, chr(98) → b

def solution(order):
    answer = 0
    for i in range(0, len(order)):
        if 'cafelatte' in order[i]:
            answer += 5000
        else:
            answer += 4500
    return answer

 

 

117. 그림 확대

"""
#picture 내, 요소/요소의 문자 단위들을 k개만큼 늘려서 반환해라
def solution(picture, k):
    answer = []
    for i in range(len(picture)):
        for _ in range(k):
            answer.append(picture[i].replace('.', '.' * k).replace('x', 'x' * k))
    return answer
"""

def solution(picture, k):
    answer01 = []
    answer02 = []
    for i in range(0, len(picture)):
        for j in range(0, len(picture[i])):
            answer01.append(picture[i][j]*k)
        answer01 = ''.join(answer01)
        for q in range(0, k):
            answer02.append(answer01)
        answer01 = []
    return answer02

 

 

118. 조건에 맞게 수열 변환하기 3

def solution(arr, k):
    answer = []
    if k%2 == 1: #홀수
        for i in range(0, len(arr)):
            answer.append(arr[i]*k)
    else:        #짝수
        for i in range(0, len(arr)):
            answer.append(arr[i]+k)
    
    return answer

 

 

119. l로 만들기

def solution(myString):
    answer = ''
    for ori_alp in myString:
        if ord(ori_alp) < ord('l'):
            answer += 'l'
        else : 
            answer += ori_alp
    return answer

 

 

120. 특별한 이차원 배열 1

def solution(n):
    answer = [ [0]*n for i in range(0, n)]  # 예시, [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    for i in range(0, n): 
        answer[i][i] += 1
    return answer

 

 

121. 정수를 나선형으로 배치하기

def solution(n):
    if n == 1:
        return [[1]]
    
    #배열 초기화 / 예시, [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
    answer = [[0 for j in range(n)] for i in range(n)] 
    
    x = 0
    y = 0
    dir = 'r'
    
    for i in range(n*n):
        answer[x][y] = i + 1
        #정방향(→)
        if dir == 'r':
            y += 1
            # 맨 끝 인덱스에 도달했거나 가려는 곳이 이미 값이 있드면 방향 전환
            if y == n-1 or answer[x][y+1] != 0: 
                dir = 'd'
        #정방향(↓)
        elif dir == 'd':
            x += 1
            if x == n-1 or answer[x+1][y] != 0:
                dir = 'l'
        #정방향(←)    
        elif dir == 'l':
            y -= 1
            if y == 0 or answer[x][y-1] != 0:
                dir = 'u'
        #정방향(↑)        
        elif dir == 'u':
            x -= 1
            if x == n-1 or answer[x-1][y] != 0:
                dir = 'r'
    return answer

 


122. 특별한 이차원 배열 2

def solution(arr):
    for i in range(0, len(arr)):
        for j in range(0, len(arr)):
            #모든 경우에 수에 적용해서 '!='일 경우, '0'을 반환
            if arr[i][j] != arr[j][i]:
                return 0
    return 1

 


123. 정사각형으로 만들기

def solution(arr):
    #열의 수가 행의 수 보다 클 경우, 
    if len(arr) > len(arr[0]) :
        for _ in range(len(arr) - len(arr[0])) :
            for i in arr :
                i.append(0)
                
    #행의 수가 열의 수 보다 클 경우,                 
    elif len(arr) < len(arr[0]) :
        for _ in range(len(arr[0])-len(arr)) :
            arr.append([0]*len(arr[0]))
            
    return arr

 


124. 이차원 배열 대각선 순회하기

def solution(board, k):
    answer = []
    for i in range(0, len(board)):
        for j in range(0, len(board[i])):
            if (i+j) <= k :
                answer.append(board[i][j])
    return sum(answer)