[Programmers/Lv. 0] 코딩테스트 입문 Day 20 - 수학, 시뮬레이션, 문자열, 사칙연산 (Python)

2023. 6. 3. 10:20Algorithm

1. 직사각형 넓이 구하기


직사각형 네 꼭짓점의 좌표가 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]] 형태로 담겨 있는 배열이 주어질 때, 주어진 직사각형의 넓이를 구하라는 문제이다.
주어진 직사각형은 2차원 좌표 평면에 변이 축과 평행하게 주어진다.

 

(내가 생각한 풀이 과정)

직사각형의 넓이를 구하는 방법이 "가로 x 세로"인 것은 초등학교 때 배우니까 너무 당연한 것이고, 나는 이 가로와 세로의 길이를 x값의 최대-최소, y값의 최대-최소 식을 이용해서 구하기로 했다.

 

(코드)

더보기

💡 내 코드

def solution(dots):
    return (max(dots)[0] - min(dots)[0])*(max(dots)[1] - min(dots)[1])

 


2. 캐릭터의 좌표


"left", "right", "up", "right" 네 가지의 방향이 담겨있는 keyinput 배열과 최대 이동할 수 있는 크기 board 배열이 주어진다.
캐릭터는 항상 [0, 0]에서 시작할 때, keyinput 배열에 따른 이동이 모두 끝난 뒤의 최종 좌표를 구하라는 문제이다.

예를 들어, board 배열의 가로 크기가 4라면, 왼쪽으로 최대 [-4, 0]까지 오른쪽으로는 [4, 0]까지 이동할 수 있다는 뜻이다.

 

(내가 생각한 풀이 과정)

keyinput 배열을 하나씩 반복하면서 해당되는 조건에 따라 알맞게 배열을 더하고, 빼면 되는 간단한 문제이지만, 
배열의 최대 크기가 정해져있기 때문에 이 점도 하나 더 고려해서 문제를 풀어줘야 한다.

"left"일 경우, board의 음수 x값의 절반보다 커서 이동가능하다면, x값을 1 빼준다. 
"right"일 경우, board의 양수 x값의 절반보다 작아서 이동가능하다면, x값을 1 더해준다. 
"up"일 경우, board의 양수 y값의 절반보다 작아서 이동가능하다면, y값을 1 더해준다. 
"down"일 경우, board의 음수 y값의 절반보다 커서 이동가능하다면, y값을 1 빼준다. 

 

(코드)

더보기

💡 내 코드

def solution(keyinput, board):
    answer = [0, 0]
    
    for c in range(len(keyinput)):
        if keyinput[c] == "left" and answer[0] > -(board[0]//2): answer[0] -= 1
        elif keyinput[c] == "right" and answer[0] < (board[0]//2): answer[0] += 1
        elif keyinput[c] == "up" and answer[1] < (board[1]//2): answer[1] += 1
        elif keyinput[c] == "down" and answer[1] > -(board[1]//2): answer[1] -= 1

    return answer

 


3. 최댓값 만들기 (2)


주어진 배열 원소 중 두 개를 곱해 만들 수 있는 최댓값을 구하라는 문제이다.

 

(내가 생각한 풀이 과정)

단순히 배열을 정렬해서 가장 큰 값 두 개를 곱하면 되지 않을까 할 수 있지만, 고려해줘야 할 것이 하나 더 있다.
바로 두 개를 "곱하여" 만들 수 있는 최댓값을 구하라는 문제이기 때문에 양수 두 개를 곱하는 것과 별개로 음수 두 개를 곱해도 최댓값이 나올 수 있다는 점이다.

그렇기에, 가장 큰 값 두 개를 곱한 값과 가장 작은 값 두 개를 곱한 값을 비교하여 마지막으로 최댓값을 골라주면 된다. 

 

(코드)

더보기

💡 내 코드

def solution(numbers):
    numbers = sorted(numbers)
    return max(numbers[0] * numbers[1], numbers[-1]*numbers[-2])

 


4. 다항식 더하기


덧셈으로 이루어진 다항식이 문자열의 형태로 주어질 때, 계산한 결괏값을 문자열로 구하라는 문제이다.
다항식을 계산할 때는 동류항끼리 계산해야한다.

문제에 주어진 제한사항은 아래와 같다.
1. 다항식에 있는 변수는 'x'만 존재한다.
2. 주어지는 문자열 polynomial은 양의 정수, 공백, 'x', '+'로 이루어져 있으며, 일차항만 존재한다.
3. 항과 연산기호 사이에는 항상 공백이 존재한다.
4. 0으로 시작하는 수는 없다.
5. 계수 1은 생략한다.

 

(내가 생각한 풀이 과정)

코딩테스트 입문 풀이 설명 중, 가장 긴 코드로 푼 문제가 아닐까 하는 생각이 든다. 차근차근 가보자.

우선, " + "를 기준으로 split을 하여 반복을 돌려줄 거다.
이때, 반복되는 문자열 끝에 x가 붙어 있으면 일차항을 모아두는 ch 리스트로, 붙어있지 않으면 상수항을 모아두는 n 리스트로 추가해 준다.
단, 문제 제한사항 5번에 계수 1을 생략한다는 조건이 있기에, 이 경우에는 나중 연산을 위해 1을 다시 추가해줘야 한다.

이후, 각 리스트에 있는 숫자들을 sum() 함수를 이용해 합해준다.

이제 두 리스트를 하나의 연산으로 합쳐줄 건데, 이 역시도 나눠지는 조건이 많다.
일차항이 1일 경우에는, 1을 생략하고 "x"만 넣어야 한다.
일차항이 1이 아닐 경우에는, 일차항이 없는 경우에는 상수항만, 일차항만 있는 경우에는 일차항 수에 x를 붙여서, 둘 다 있는 경우에는 각 조건에 맞게 추가해 주는 방법으로 조건을 나눴다.

 

(코드)

더보기

💡 내 코드

def solution(polynomial):
    ch, n = [], []
    answer = ""
    
    for num in polynomial.split(" + "):
        if num[-1] == "x": 
            if len(num) == 1: ch.append("1")
            else: ch.append(num[:-1])
        else: n.append(int(num))
    
    s_ch = sum((int(x) for x in ch))
    s_n = sum((int(y) for y in n))
    
    if s_ch == 1:
        if s_n == 0: return "x"
        else: return "x + " + str(s_n)
    else:
        if s_ch == 0: return str(s_n)
        elif s_n == 0: return str(s_ch) + "x"
        else: return str(s_ch) + "x + " + str(s_n)