■ 출처
- 코딩테스트 : Python3 / 코딩 기초 트레이닝 / 모든 상태 체크 / 81~124문제
■ 연습문제
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)