[프로그래머스 Python] 코딩테스트 입문 Day 22 - dp, 수학, 조건문, 배열
1. 저주의 숫자 3
3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.
10진법 | 3x 마을에서 쓰는 숫자 | 10진법 | 3x 마을에서 쓰는 숫자 |
---|---|---|---|
1 | 1 | 6 | 8 |
2 | 2 | 7 | 10 |
3 | 4 | 8 | 11 |
4 | 5 | 9 | 14 |
5 | 7 | 10 | 16 |
정수 n
이 매개변수로 주어질 때, n
을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤
n
≤ 100
코드 작성
def solution(n):
town = []
for i in range(1, n*3):
# 3의 배수거나 3이 들어가는 경우는 pass
if i % 3 == 0 or '3' in str(i):
pass
else:
town.append(i)
if len(town) == n:
break
return town[n-1]
2. 평행
점 네 개의 좌표를 담은 이차원 배열 dots
가 다음과 같이 매개변수로 주어집니다.
[[x1, y1], [x2, y2], [x3, y3], [x4, y4]] 주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
제한사항
dots
의 길이 = 4dots
의 원소는 [x, y] 형태이며 x, y는 정수입니다.- 0 ≤ x, y ≤ 100
- 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
- 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
- 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.
코드 작성
def solution(dots):
dot = dots[0]
dots = dots[1:]
for i in range(len(dots)):
dx1 = dot[0] - dots[i][0]
dy1 = dot[1] - dots[i][1]
dx2 = dots[i-1][0] - dots[i-2][0]
dy2 = dots[i-1][1] - dots[i-2][1]
slope1 = dy1/dx1
slope2 = dy2/dx2
if slope1 == slope2:
return 1
return 0
3. 겹치는 선분의 길이
선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines
가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.
제한사항
lines
의 길이 = 3lines
의 원소의 길이 = 2- 모든 선분은 길이가 1 이상입니다.
lines
의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 입니다.- -100 ≤ a < b ≤ 100
코드 작성
def solution(lines):
# 각 선분들이 존재하는 영역을 리스트에 담는다.
sets = [set(range(min(l), max(l))) for l in lines]
return len(sets[0] & sets[1] | sets[0] & sets[2] | sets[1] & sets[2])
4. 유한소수 판별하기
소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
두 정수 a
와 b
가 매개변수로 주어질 때, a
/b
가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.
제한사항
a
,b
는 정수- 0 <
a
≤ 1,000 - 0 <
b
≤ 1,000
코드 작성
def solution(a, b):
# 기약분수 만들기 위해 최대공약수 구하기
min_num = min([a, b])
gcd = 0
for n in range(1, min_num+1):
if a % n == 0 and b % n == 0:
gcd = n
# 기약분수 형태로 만들기
if gcd != 1:
a = int(a/gcd)
b = int(b/gcd)
# 분모, 분자 같은 경우
if a == b:
return 1
# 분모가 2, 5로만 이루어졌는지 확인하기
num = b
for i in [2, 5]:
while num % i == 0:
num //= i
if num == 1:
return 1
return 2
👩🏻💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.
댓글남기기