1. 코딩테스트 연습 - 다음에 올 숫자 | 프로그래머스 스쿨 (programmers.co.kr)
문제 설명
등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.
나의 풀이 (실패 정확성 88.9%)
def solution(common):
num=common[1]-common[0]
if num>0:
if common[2]-common[1]==num:
return common[-1]+num
else:
return common[-1]*num
else:
if common[2]-common[1]==num:
return common[-1]+num
else:
num=common[1]/common[0]
return common[-1]*num
모범 답안
def solution(common):
answer = 0
if common[1] - common[0] == common[2] - common[1]:
# 등차수열
answer = common[-1]+(common[1]-common[0])
elif common[1]/common[0] == common[2]/common[1]:
# 등비수열
answer = common[-1]*(common[1]/common[0])
return answer
접근 방법은 같으나 공차나 공비가 음수인 경우 나눠서 생각 X
2. 코딩테스트 연습 - 연속된 수의 합 | 프로그래머스 스쿨 (programmers.co.kr)
문제 설명
연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
나의 풀이
.
모범 답안
def solution(num, total):
d=0
for i in range(1, num):
d += i
start=(total-d)//num
answer = [i for i in range(start, start+num)]
return answer
3. 코딩테스트 연습 - 분수의 덧셈 | 프로그래머스 스쿨 (programmers.co.kr)
4. 코딩테스트 연습 - 주사위 게임 3 | 프로그래머스 스쿨 (programmers.co.kr)
나의 풀이
def solution(a, b, c, d):
num=str(a)+str(b)+str(c)+str(d)
numm=list(set(num))
print(numm)
lnum=len(numm)
if lnum==1:
score=1111*int(num[0])
elif lnum==2:
if num.count(numm[0])==1:
score=(10*int(numm[1])+int(numm[0]))**2
elif num.count(numm[1])==1:
score=(10*int(numm[0])+int(numm[1]))**2
else:
score=(int(numm[0])+int(numm[1]))*abs(int(numm[0])-int(numm[1]))
elif lnum==3:
if num.count(numm[0])==2:
score=int(numm[1])*int(numm[2])
elif num.count(numm[1])==2:
score=int(numm[0])*int(numm[2])
else:
score=int(numm[0])*int(numm[1])
else:
score=int(min(numm))
return score
풀이 참고
def solution(a, b, c, d):
nums = [a, b, c, d]
counts = [nums.count(i) for i in nums]
if max(counts) == 4:
return a * 1111
elif max(counts) == 3:
p = nums[counts.index(3)]
q = nums[counts.index(1)]
return (10 * p + q) ** 2
elif max(counts) == 2:
if min(counts) == 2:
return (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b)
else:
p = nums[counts.index(2)]
return (a * b * c * d) / p**2
else:
return min(nums)
5. 코딩테스트 연습 - 안전지대 | 프로그래머스 스쿨 (programmers.co.kr)
문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
나의 풀이
.
모범 답안
def solution(board):
n=len(board)
danger=set()
for i, row in enumerate(board):
for j, x in enumerate(row):
if x:
danger.update(
(i + di, j +dj)
for di in [-1, 0, 1]
for dj in [-1, 0, 1]
if 0 <= i + di < n and 0<= j + dj < n
)
return n*n - len(danger)
구현(응용) - 문제 1 안전지대 - 내일은 코딩테스트 실전문제 풀이 (youtube.com)
★ update() 함수
dict 자료형에 있는 함수로 기존 딕셔너리의 데이터를 한꺼번에 변경할 때 유용한 함수
기존의 데이터를 수정할 수도, 추가할 수도 있음
[Python] 파이썬 dict 자료형의 update 함수 (tistory.com)
6. 코딩테스트 연습 - 겹치는 선분의 길이 | 프로그래머스 스쿨 (programmers.co.kr)
문제 설명
선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.
나의 풀이
.
모범 답안
def solution(lines):
s1 = set(i for i in range(lines[0][0], lines[0][1]))
s2 = set(i for i in range(lines[1][0], lines[1][1]))
s3 = set(i for i in range(lines[2][0], lines[2][1]))
return len((s1 & s2) | (s2 & s3) | (s1 & s3))
set을 이용해 각 선분의 길이를 집합으로 만들어 교집합을 찾음
☆ ☆ ☆ 7. 코딩테스트 연습 - 정수를 나선형으로 배치하기 | 프로그래머스 스쿨 (programmers.co.kr)
문제 설명
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
나의 풀이
.
모범 답안
def solution(n):
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
y, x = 0, -1
arr = [[0] * n for _ in range(n)]
num = 1
direction = 0
while num <= n**2:
ny, nx = y + dy[direction], x + dx[direction]
if 0 <= ny < n and 0 <= nx < n and not arr[ny][nx]:
arr[ny][nx] = num
num += 1
y, x = ny, nx
else:
direction = (direction + 1) % 4
return arr
8. 코딩테스트 연습 - 평행 | 프로그래머스 스쿨 (programmers.co.kr)
문제 설명
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
- [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
나의 풀이 (실패 정확성 64.7%)
def solution(dots):
dot=[]
for i in range(1, len(dots)):
dot.append((dots[0][1]-dots[i][1])/(dots[0][0]-dots[i][0]))
for i in range(2, len(dots)):
dot.append((dots[1][1]-dots[i][1])/(dots[1][0]-dots[i][0]))
dot.append((dots[2][1]-dots[3][1])/(dots[2][0]-dots[3][0]))
for i in dot:
if dot.count(i)!=1:
return 1
return 0
모범 답안
def solution(dots):
answer = 0
dots_idx = [[0, 1, 3, 2], [0, 2, 3, 1], [1, 2, 0, 3]]
for d1, d2, d3, d4 in dots_idx:
x1, y1 = dots[d1][0], dots[d1][1]
x2, y2= dots[d2][0], dots[d2][1]
x3, y3= dots[d3][0], dots[d3][1]
x4, y4= dots[d4][0], dots[d4][1]
if (y1-y2)*(x3-x4) == (y3-y4)*(x1-x2) :
answer = 1
return answer
나는 경우의 수로 12번 비교를 해야 한다고 생각했으나 문제에서
아래와 같은 3가지 경우의 수만을 의미했음
- [a-b, c-d],[a-c, b-d],[a-d, b-c]
즉, 4개의 점들로 임의의 두 쌍을 만들었을 때 그 두 쌍이 이루는 직선이 서로 평행한지를 묻는 문제
9. 코딩테스트 연습 - 옹알이 (1) | 프로그래머스 스쿨 (programmers.co.kr)
문제 설명
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
나의 풀이
.
모범 답안
from itertools import permutations
def solution(babbling):
word=[]
result=0
speek=["aya", "ye", "woo", "ma"]
for i in range(1, len(speek)+1):
for j in permutations(speek, i):
word.append("".join(j))
for i in babbling:
if i in word:
result+=1
❗️permutations - 순열 함수
from itertools import permutations
A = ['a', 'b', 'c', 'd']
P = list(permutations(A, 2))
# P = [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
'코딩테스트 > programmers (python)' 카테고리의 다른 글
20240113/ programmers/ 1단계/ python (1) | 2024.01.13 |
---|---|
20240112/ programmers/ 1단계/ python/O (0) | 2024.01.12 |
20240110/ programmers/ 0단계/ python (0) | 2024.01.10 |
20240109/ programmers/ 0단계/ python (1) | 2024.01.09 |
20240108/ programmers/ 0단계/ python (0) | 2024.01.08 |