■ 출처
- 코딩테스트 : Python3 / 코딩테스트 입문 / 모든 상태 체크 / 31~60문제
■ 연습문제
31. A로 B 만들기
#두 매개변수가 동일한지 확인하는 문제이므로 정렬함수 활용
def solution(before, after):
"""answer = ''
for i in range(len(before)-1, -1, -1):
answer += before[i]
if answer == after:
return 1
else:
return 0"""
return 1 if sorted(before) == sorted(after) else 0
32. 이진수 더하기
bin() : 2진수로 변환하는 함수
oct() : 8진수로 변환하는 함수
hex() : 16진수로 변환하는 함수
int() : 10진수로 변환하는 함수(단, 두 번째 인자에 첫번째 인자의 진수 형태 입력)
- 예시, 2진수 값을 10진수로 변환시킬 때 'int('0b111100', 2)'
def solution(bin1, bin2):
answer = ''
bin1 = int(bin1, 2)
bin2 = int(bin2, 2)
answer = bin(bin1 + bin2)
return answer[2:]
33. 치킨 쿠폰
나누셈 연산자 구분 : ①'/'은 기본적인 나눗셈, ②'//'은 나눗셈의 몫, ③%은 나눗셈의 나머지
def solution(chicken):
service = 0
coup = chicken
while coup >= 10:
service += coup // 10
coup = coup % 10 + coup // 10
return service
34. 로그인 성공?
def solution(id_pw, db):
answer = "fail"
for i in db:
if i[0] == id_pw[0]:
if i[1] == id_pw[1]:
answer = "login"
else:
answer = "wrong pw"
return answer
35. 등수 매기기
def solution(score):
answer = []
for i in range(0, len(score)):
answer.append((score[i][0]+score[i][1])/2)
#높은 점수 순으로 정렬(내림차순)
sorted_answer = sorted(answer, reverse = True)
#영어/수학 평균점수를 정렬된 평균점수를 기준으로 원본평균점수를 랭킹화
rank_answer = [sorted_answer.index(j) + 1 for j in answer]
return rank_answer
36. 특이한 정렬
sorted() 함수 : 오른차순으로 값을 정렬하는 함수
- reverse = True : 기존 오름차순 정렬을 reverse(즉, 내림차순 정렬)
- key = abs : 절대값을 기준으로 정렬
- key = len : 길이를 기준으로 정렬
- key= lambda x : (len(x), x) : 길이를 기준으로 정렬하고, 오른차순 정렬
- key = lambda x : (abs(x), -x) : 절대값을 적용한 순자순으로 정렬하고, 절대값이 같으면 양수 먼저 반환
def solution(numlist, n):
#numlist 요소별 n과의 거리 측정 값 리스트
answer = []
for i in numlist:
answer.append(i-n)
#거리가 n에 가까운 순서대로 정렬 / 절대값이 같으면 양수 먼저 반환(즉, 큰값부터...)
result = []
for i in sorted(answer[:], key = lambda x : (abs(x), -x)):
result.append(numlist[answer.index(i)])
return result
37. 유한소수 판별하기
최대공약수를 구하는 함수
- 공약수(Common Divisor)란, 두 수 이상의 여러 수의 공통된 약수를 의미)
- 최대공약수(GCD)란, 두 수 이상의 여러 수의 공약 수 중에서 최대인 수를 의미(최대공약수가 1이면 두 수는 서로소 관계)
- 예시,
from math import gcd
math.gcd()
from math import gcd
def solution(a, b):
b = b/gcd(a,b)
while b%2 == 0:
b = b/2
while b%5 == 0:
b = b/5
return 1 if b == 1 else 2
38. 겹치는 선분의 길이
#전체 카운트 프레임에 세 선분에 해당하는 값을 카운트하여 2개 이상 중복된 부분의 길이를 계산
def solution(lines):
answer = 0
count = [0 for _ in range(200)] #-100부터 100까지 범위에서 선분이 그어질 횟수 카운트 프레임
#중앙값(100+n)에서 세 선분의 값을 불러와서 카운트
for line in lines:
for i in range(line[0], line[1]):
count[i + 100] += 1
#2, 3개 이상 겹치는 점
answer += count.count(2)
answer += count.count(3)
return answer
39. 평행
def gdient(a, b): # 기울기 값 계산
return (a[0] - b[0]) / (a[1] - b[1])
def solution(dots):
p1, p2, p3, p4 = dots[:]
if (gdient(p3,p1)==gdient(p4,p2)) or (gdient(p4,p3)==gdient(p2,p1)) or (gdient(p3,p2)==gdient(p1,p4)):
return 1
else:
return 0
40. 저주의 숫자 3
def solution(n):
answer = 0
for _ in range(0, n):
answer += 1
while (answer % 3 == 0) or ('3' in str(answer)):
answer += 1
return answer
41. 외계어 사전
set() 함수를 통한 집합데이터 활용
- 교집합: 두 집합이 공통으로 포함하는 원소로 이루어진 집합을 의미
- 합집합: 두 집합에 속하는 모든 원소를 모우둔 집합을 의미
- 차집합: A집합에 속하지만 B집합에 속하지 않는 원소로 이루어진 집합을 의미
- 대칭 차집합: A집합과 B집합간 서로 속하지 않은 원소로 이루어진 대칭잡합을 의미
-예시,
set1 = set([1,2,3,4,5,6])
set2 = set([3,4,5,6,8,9])
print(set1 & set2) #교집합
print(set1.intersection(set2)) #교집합
print(set1 | set2) #합집합
print(set1.union(set2)) #합집합
print(set1 - set2) #차집합
print(set1.difference(set2)) #차집합
print(set1 ^ set2) #대칭차집합
#spell에서 dic[i]값을 set()함수를 활용한 차집함으로 빼서 아무것도없다는 의미는 spell값이 존재한다는 의미
def solution(spell, dic):
for i in dic:
if not set(spell) - set(i):
return 1
return 2
42. 삼각형의 완성조건 (2)
def solution(sides):
answer = 0
max_side = max(sides)
min_side = min(sides)
#기존 sides 매개변수가 가장 길 경우
for new_side in range (max_side-min_side+1, max_side+1):
answer += 1
#새로운 sides 매개변수가 가장 길 경우
for new_side in range (max_side+1, max_side+min_side):
answer += 1
return answer
43. 안전지대
def solution(board):
N = len(board)
#지뢰를 기준으로 주변 위험지역 프레임을 dx, dy로 정의
dx = [-1, 1, 0, 0, -1, -1, 1, 1]
dy = [0, 0, -1, 1, -1, 1, -1, 1]
#지뢰 인덱스 확인
boom = []
for i in range(0, len(board)):
for j in range(0, len(board)):
if board[i][j] == 1:
boom.append((i,j))
#지뢰가 설치된 주변의 위험지역 확인
for x, y in boom:
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
#지뢰가 한쪽 벽에 붙어버리면 위험지역 수가 줄기때문에 if조건물 활용
if (0 <= nx < N) and (0 <= ny < N):
board[nx][ny] = 1
#지뢰/위험지역을 제외한 안전지역 카운트
count = 0
for x in range(N):
for y in range(N):
if board[x][y] == 0:
count += 1
return count
44. 숨어있는 숫자의 덧셈 (2)
findall() 함수 : 정규식과 매치되는 모든 문자열을 리스트형식으로 리턴
- 예시,
re.findall(r'\d+', my_string) : 숫자와 매치 / [0-9]와 동일한 표현식
re.findall(r'\D+', my_string) : 숫자가 아닌 것과 매치 / [^0-9]와 동일한 표현식
.isalpha() 함수 : 알파벳인지 확인하는 함수
.isdigit() 함수 : 숫자인지 확인하는 함수
- 예시,
b = '1234'
c = "qwer"
print(b.isdigit()) #True`
print(c.isalpha()) #True
#re라이브러리 기반 정규표현식 활용방법
import re
def solution(my_string):
answer = 0
num = re.findall(r'\d+', my_string)
for i in num:
answer += int(i)
return answer
#isalpha()함수 활용방법
"""def solution(my_string):
for i in my_string:
if i.isalpha():
my_string = my_string.replace(i, ' ')
my_string = my_string.split()
return sum(list(map(int, my_string)))"""
45. 다항식 더하기
def solution(polynomial):
answer = ''
num = 0 #x의 개수
sum = 0 #상수값
polynomial = polynomial.replace(' ', '').split('+')
for i in polynomial :
if i[-1] == 'x':
num += 1 if len(i) == 1 else int(i[:-1])
else:
sum += int(i)
if num > 0:
answer = (str(num) if num>1 else '') + 'x' + (' + ' if sum>0 else '')
answer += (str(sum) if sum>0 else '')
return answer
46. 최댓값 만들기 (2)
def solution(numbers):
numbers = sorted(numbers, reverse = True) #예시, [4, 2, 1, -3, -5]
return max(numbers[0]*numbers[1], numbers[-1]*numbers[-2])
47. 캐릭터의 좌표
나누셈 연산자 구분 : ①'/'은 기본적인 나눗셈, ②'//'은 나눗셈의 몫, ③%은 나눗셈의 나머지
def solution(keyinput, board):
answer = [0, 0]
#[0, 0]은 중앙에 위치하기 때문에 '11'일 경우 '5'거리를 이동 가능
x = board[0] // 2
y = board[1] // 2
for i in keyinput:
if (i == "up") and (answer[1]+1 <= y):
answer[1] += 1
elif (i == "down") and (answer[1]-1 >= -y):
answer[1] -= 1
elif (i == "left") and (answer[0]-1 >= -x):
answer[0] -= 1
elif (i == "right") and (answer[0]+1 <= x):
answer[0] += 1
return answer
48. 직사각형 넓이 구하기
#직사각형 넓이: 가로 * 세로
def solution(dots):
x = [dot[0] for dot in dots]
y = [dot[1] for dot in dots]
w = max(x) - min(x)
h = max(y) - min(y)
return w*h
49. 배열 원소의 길이
def solution(strlist):
answer = []
for i in strlist:
answer.append(len(i))
return answer
50. 컨트롤 제트
def solution(s):
answer = 0
s_list = list(s.split(' '))
for i in range(0, len(s_list)):
if s_list[i] == 'Z':
answer -= int(s_list[i-1])
else:
answer += int(s_list[i])
return answer
51. 소인수분해
in/not in 연산자 : 특정 값이 포함되어있는지 여부를 확인하는 명령어
def solution(n):
answer = []
number = 2
while number <= n: #2~n값까지 소인수분해되는지 여부 확인
if n%number == 0:
n = n/number #n /= number
if number not in answer: #소인수분해값들을 중복없도록 리스트에 추가
answer.append(number)
else:
number = number + 1 #number += 1
return answer
52. 숨어있는 숫자의 덧셈 (1)
.isdigit() 함수 : 숫자인지 확인하는 함수
- 예시,
b = '1234'
c = "qwer"
print(b.isdigit()) #True
def solution(my_string):
some_list = []
for i in list(my_string):
if i.isdigit() == True:
some_list.append(int(i))
return sum(some_list)
53. 문자열 정렬하기 (1)
sorted() 함수 : 오른차순으로 값을 정렬하는 함수
def solution(my_string):
some_list = []
for i in list(my_string):
if i.isdigit() == True:
some_list.append(int(i))
return sorted(some_list)
54. 모음 제거
def solution(my_string):
vowel_list = ['a','e','i','o','u']
answer = ''
for i in list(my_string):
if i not in vowel_list:
answer += i
return answer
55. 팩토리얼
factorial() 함수 : 1부터 n수까지 모든 수의 값들을 곱한 함수
- 예시,
from math import factorial
print(factorial(1)) #1
print(factorial(2)) #1*2
print(factorial(3)) #1*2*3
print(factorial(4)) #1*2*3*4
print(factorial(5)) #1*2*3*4*5
#x!(1부터 x값까지 계산)을 통해 도출된 결과가 n이 되도는 x값 반환(단, x!가 도출안될 경우 최대 x값 반환)
'''def solution(n):
number = 1
fac = 1
while fac <= n :
number = number + 1
fac = fac * number
number = number - 1
return number'''
#factorial()함수를 통해 계산한 결과를 직접 비교해서 x값 반환
from math import factorial
def solution(n):
answer = 10
while n < factorial(answer):
answer -= 1
return answer
56. 최댓값 만들기(1)
def solution(numbers):
numbers = sorted(numbers)
return numbers[-1]*numbers[-2]
57. 합성수 찾기
def solution(n):
num = [] #숫사별 약수 개수를 확인할 수 있는 리스트 선언
answer = 0 #약수의 개수를 담을 합성수 선언
#2부터 n까지 약수 삽입
for i in range(2, n+1):
for j in range(1, i+1):
if i%j == 0:
num.append(i)
#약수 수가 3개 이상일 경우, answer +1 카운트
if num.count(i) >= 3:
answer += 1
return answer
58. 주사위의 개수
나누셈 연산자 구분 : ①'/'은 기본적인 나눗셈, ②'//'은 나눗셈의 몫, ③%은 나눗셈의 나머지
def solution(box, n):
Width = box[0] // n
Length = box[1] // n
Height = box[2] // n
answer = Width * Length * Height
return answer
59. 배열 회전시키기
.pop() 함수 : 리스트의 특정 인덱스 값을 삭제 및 반환하는 기능
- 예시,
[1, 2, 3, 4, 5].pop(2) # 3
def solution(numbers, direction):
if direction == 'right':
numbers.insert(0, numbers[-1])
numbers.pop(-1)
elif direction == 'left':
numbers.append(numbers[0])
numbers.pop(0)
return numbers
60. 공 던지기
def solution(numbers, k):
answer = 0
#k*2 값이 len(numbers) 보다 크면 numbers을 확장시켜라(참고, k번을 두 칸식 건너뛰어야하니 k*2 수행)
if len(numbers) < k*2:
numbers = numbers * ((k*2) // len(numbers) + 1)
answer = numbers[2*(k-1)]
return answer