[코딩테스트 입문]Day20
직사각형 넓이 구하기
문제 설명
2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots
가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.
제한사항
dots
의 길이 = 4dots
의 원소의 길이 = 2- -256 <
dots[i]
의 원소 < 256 - 잘못된 입력은 주어지지 않습니다.
입출력 예
dots | result |
---|---|
[[1, 1], [2, 1], [2, 2], [1, 2]] | 1 |
[[-1, -1], [1, 1], [1, -1], [-1, 1]] | 4 |
문제 풀이
def solution(dots):
[[x1,y1],[x2,y2],[x3,y3],[x4,y4]] = dots
width = max(x1,x2, x3, x4) - min(x1, x2,x3, x4)
height = max(y1,y2, y3, y4) - min(y1, y2, y3, y4)
return width*height
def solution(dots):
return (max(dots)[0] - min(dots)[0])*(max(dots)[1] - min(dots)[1])
캐릭터의 좌표
문제 설명
머쓱이는 RPG게임을 하고 있습니다. 게임에는 up
, down
, left
, right
방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up
을 누른다면 캐릭터의 좌표는 [0, 1], down
을 누른다면 [0, -1], left
를 누른다면 [-1, 0], right
를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput
와 맵의 크기 board
이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.
- [0, 0]은
board
의 정 중앙에 위치합니다. 예를 들어board
의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.
제한사항
board
은 [가로 크기, 세로 크기] 형태로 주어집니다.board
의 가로 크기와 세로 크기는 홀수입니다.board
의 크기를 벗어난 방향키 입력은 무시합니다.- 0 ≤
keyinput
의 길이 ≤ 50 - 1 ≤
board
[0] ≤ 99 - 1 ≤
board
[1] ≤ 99 keyinput
은 항상up
,down
,left
,right
만 주어집니다.
입출력 예
keyinput | board | result |
---|---|---|
[“left”, “right”, “up”, “right”, “right”] | [11, 11] | [2, 1] |
[“down”, “down”, “down”, “down”, “down”] | [7, 9] | [0, -4] |
문제풀이
def solution(keyinput, board):
dist = {"up": [0,1],"down": [0,-1],"left": [-1, 0], "right": [1, 0]}
start = [0, 0]
for i in keyinput:
if -(board[0]//2) < start[0] < board[1]//2 and -(board[1]//2) < start[1] < board[1]//2:
start[0] += dist[i][0]
start[1] += dist[i][1]
return start
테스트 케이스 결과가 실패입니다. 다시 생각 합니다.
def solution(keyinput, borad):
x, y = borad[0]//2, borad[1]//2
dist = {"up": [0,1],"down": [0,-1],"left": [-1, 0], "right": [1, 0]}
a , b = 0, 0
for i in keyinput:
if a >= x or a <= -x or b >= y or y <= -b:
pass
else:
a += dist[i][0]
b += dist[i][1]
return [a, b]
solution
def solution(keyinput, borad):
x, y = 0, 0
wx = borad[0]//2
wy = borad[1]//2
for i in keyinput:
if i == "left" and x > -wx:
x -= 1
elif i == "right" and x < wx:
x += 1
elif i == "up" and y < wy:
y += 1
elif i == "down" and y > -wy:
y -= 1
return [x, y]
def solution(keyinput, board):
x_lim,y_lim = board[0]//2,board[1]//2
move = {'left':(-1,0),'right':(1,0),'up':(0,1),'down':(0,-1)}
x,y = 0,0
for k in keyinput:
dx,dy = move[k]
if abs(x+dx)>x_lim or abs(y+dy)>y_lim:
continue
else:
x,y = x+dx,y+dy
return [x,y]
최댓값 만들기(2)
문제 설명
정수 배열 numbers
가 매개변수로 주어집니다. numbers
의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
제한사항
- -10,000 ≤
numbers
의 원소 ≤ 10,000 - 2 ≤
numbers
의 길이 ≤ 100
입출력 예
numbers | result |
---|---|
[1, 2, -3, 4, -5] | 15 |
[0, -31, 24, 10, 1, 9] | 240 |
[10, 20, 30, 5, 5, 20, 5] | 600 |
문제 풀이
def solution(numbers):
m = []
for i in range(len(numbers)):
for j in range(len(numbers)):
num = numbers[i] * numbers[j]
if i != j:
m.append(num)
return max(m)
def solution(numbers):
numbers.sort()
return max(numbers[0] * numbers[1], numbers[-1] * numbers[-2])
다항식 더하기
문제 설명
한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial
이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.
제한사항
- 0 <
polynomial
에 있는 수 < 100 polynomial
에 변수는 ‘x’만 존재합니다.polynomial
은 양의 정수, 공백, ‘x’, ‘+’로 이루어져 있습니다.- 항과 연산기호 사이에는 항상 공백이 존재합니다.
- 공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
- 하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
- ” + 3xx + + x7 + “와 같은 잘못된 입력은 주어지지 않습니다.
- 0으로 시작하는 수는 없습니다.
- 문자와 숫자 사이의 곱하기는 생략합니다.
polynomial
에는 일차 항과 상수항만 존재합니다.- 계수 1은 생략합니다.
- 결괏값에 상수항은 마지막에 둡니다.
- 0 <
polynomial
의 길이 < 50
입출력 예
polynomial | result |
---|---|
“3x + 7 + x” | “4x + 7” |
“x + x + x” | “3x” |
문제 풀이
반례가 있어서 쉽게 통과하기 힘들었습니다.
처음에는 단순히 x
의 유무로 구분해서 그 앞의 수를 계산했고, 정수같은 경우는 주어진 str
형을 int
로 변환해서 더해주어서 계산했더니 다음과 같은 문제가 발생했습니다.
정수
들이0
인 경우변수x
가0
인 경우변수x
가1
인 경우
세가지 경우의 반례가 생겼습니다.
처음것은 elif를 통해서 정수가 0일 경우 최종 리스트에 추가하지 않는 조건문을 생성했습니다.
두 번째 경우도 위와 같이 조건문을 재설정 했습니다. 이 조건문을 설정하지 않으면 문자열로 있던 수를 정수로 변환하여 계산하고 다시 문자열로 바꾸기 떄문에 0x
가 출력됩니니다. polynomial이 “1”로 주어진다면 이런 문제가 발생합니다.
그리고 다항식의 계수가 1인경우 또한 처음 for문으로 “x”가 포함된 요소를 받았을때 분류하는 것 이외에, 최종적으로 x의 계수가 결정된 후에 x가 1인 경우에도 계수 1을 지워줘야하기 때문에 다시 조건문으로 재설정 했습니다.
def solution(polynomial):
num = polynomial.split(" + ")# 부호 사이에 공백이 존재하기때문에 이렇게 지워줍니다.
print(num)
x, y = 0, 0 #x의 계수와 정수를 계산할 변수 생성
sol = [] #join을 통해 문자열을 생성하기 위해 최종 리스트 생성
for i in num:
if "x" in i:
if len(i) != 1: #i의 길이가 1인경우는 "x"하나뿐입니다.
x += int(i[:-1])#마지막 "x"를 제외하고 정수부분을 계산해줍니다.
else:
x += 1 #"x"가 주어졌다면 계수를 나타내어 1을 더해줍니다.
elif i.isdigit(): #i가 숫자라면
y += int(i)
if x > 1: #x는 0이면 안되고 1이어도 안됩니다.
sol.append(str(x)+"x")
elif x == 1: #그리고 "x"의 계수가 최종적으로 1일때 계수를 표현하지 않는 조건을 설정해줍니다.
sol.append("x")
if y != 0: #정수가 0이 아닐때 추가해야합니다. 0이라면 정수 자리에 0이 표시됩니다.
sol.append(str(y))
return ' + '.join(sol)#분류했던 ' + '으로 다시 연결합니다.
def solution(polynomial):
xnum = 0
const = 0
for c in polynomial.split(' + '):
if c.isdigit():
const+=int(c)
else:
xnum = xnum+1 if c=='x' else xnum+int(c[:-1])
if xnum == 0:
return str(const)
elif xnum==1:
return 'x + '+str(const) if const!=0 else 'x'
else:
return f'{xnum}x + {const}' if const!=0 else f'{xnum}x'
댓글남기기