TIL 38. CodeKata-Python 3주차 리뷰

문승준·2021년 10월 17일
0
post-thumbnail

1.🤯 복소수 곱하기

1-1. 문제

두 개의 input에는 복소수(complex number)가 string 으로 주어집니다. 복소수란 a+bi 의 형태로, 실수와 허수로 이루어진 수입니다.
input으로 받은 두 수를 곱해서 반환해주세요.
반환하는 표현도 복소수 형태의 string 이어야 합니다.

복소수 정의에 의하면 (i^2)는 -1 이므로 (i^2) 일때는 -1로 계산해주세요. (i * i = -1)

제곱 표현이 안 되어 i의 2제곱을 (i^2)라고 표현했습니다.

Input: "1+1i", "1+1i" Output: "0+2i" 
설명: (1 + i) * (1 + i) = 1 + i + i + i^2 = 2i
2i를 복소수 형태로 바꾸면 0+2i
Input: "1+-1i", "1+-1i" Output: "0+-2i"
설명: (1 - i) * (1 - i) = 1 - i - i + i^2 = -2i
-2i를 복소수 형태로 바꾸면 0+-2i.
Input: "1+3i", "1+-2i" Output: "7+1i"
설명: (1 + 3i) * (1 - 2i) = 1 - 2i + 3i -6(i^2) = 1 + i + 6
7+i를 복소수 형태로 바꾸면 7+1i.
  • 가정
    input은 항상 a+bi 형태입니다. output도 a+bi 형태로 나와야 합니다.

1-2. 풀이

def complex_number_multiply(a, b):
  a_nums = a[:-1].split("+")
  b_nums = b[:-1].split("+")
  a1 = int(a_nums[0])
  a2 = int(a_nums[1])
  b1 = int(b_nums[0])
  b2 = int(b_nums[1])

  x = (a1*b1)-(a2*b2)
  y = (a2*b1)+(a1*b2)
  
  return f'{x}+{y}i'
  • a+bi 형태에서 a와 b를 각각 알아내서 정수로 만든다.

  • 최종 반환할 복소수는 x+yi 형태인 것으로 가정한다.

  • (a1 x b1)-(a2 x b2)는 x가 된다.
    a2와 b2는 뒤에 i가 붙어있는 애들이며 i끼리 곱하면 -1이된다

  • (a2 x b1)+(a1 x b2)는 y가 된다.
    a2와 b2는 뒤에 i가 붙어있는 애들이며 i끼리 곱해지는 경우가 아니므로 그대로 계산하면 된다.


2. 문자를 뒤집어서 반환하기

2-1. 문제

문자로 구성된 배열을 input으로 전달하면, 문자를 뒤집어서 return 해주세요.

새로운 배열을 선언하면 안 됩니다.

인자로 받은 배열을 수정해서 만들어주세요.

Input: ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]

Input: ["H","a","n","n","a","h"]
Output: ["h","a","n","n","a","H"]

2-2. 풀이

def reverse_string(s):
  return s[::-1]
# 배열이 아닌 문자열을 그대로 뒤집을때
def reverse_string(s):
  return "".join(reversed(s))
  • 슬라이스 증가폭(step)을 -1로해서 시퀀스 객체를 뒤집는다.

  • 문자열을 그대로 뒤집을때 -> reversed()로 반대방향으로 순회하는 iterator를 리턴하고, join으로 각 요소를 합친다.


3. 🤯 m x n 그리드에서 길 찾기

3-1. 문제

양수로 이루어진 m x n 그리드를 인자로 드립니다. 상단 왼쪽에서 시작하여, 하단 오른쪽까지 가는 길의 요소를 다 더했을 때,가장 작은 합을 찾아서 return 해주세요.

한 지점에서 우측이나 아래로만 이동할 수 있습니다.

Input: [ [1,3,1], 
	 [1,5,1],
     	 [4,2,1] ]

Output: 7

설명: 1→3→1→1→1 의 합이 제일 작음

3-2. 풀이

def min_path_sum(grid):
    n = len(grid[0]) # 가로길이
    m = len(grid)    # 세로길이   

    # 첫번째 가로와 첫번째 세로줄을 통해 올때
    for i in range(1, n):
      grid[0][i] += grid[0][i-1]
    for i in range(1, m):
      grid[i][0] += grid[i-1][0]
        
    # 나머지 경우 (안쪽으로 오는 경로)
    for i in range(1, m):
        for j in range(1, n):
            grid[i][j] += min(grid[i-1][j], grid[i][j-1])

    return grid[-1][-1]
  • 시작은 grid[0][0], 마지막은 grid[-1][-1]

  • 지나가는 요소를 모두 더하며 좌표를 이동한다.

  • 이동은 오른쪽(가로)이나 아래(세로)로만 한다.

  • 가장 윗줄과 가장 왼쪽줄은 끝까지 이동할때 한방향이어서 따로 합을 구해준다.

  • 안쪽으로 들어오는 경우 어느 경로를 통해 오느냐에 따라 최소합계를 찾는다.


4. 특정 요소를 배열 뒤로 보내기

4-1. 문제

주어진 숫자 배열에서, 0을 배열의 마지막쪽으로 이동시켜주세요. 원래 있던 숫자의 순서는 바꾸지 말아주세요.

새로운 배열을 생성해서는 안 됩니다.

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

4-2. 풀이

def move_zeroes(nums):
  for i in range(len(nums)):
    if nums[i] == 0:
      nums.append(nums[i])
      nums.remove(nums[i])
  return nums
  • 0이 있는 인덱스를 알아내서

  • 배열에 append()하고 remove()를 한다
    -> remove는 첫번째 값만 지우니까 가능하다.

  • 먼저 지우면 인덱스가 달라져서 안된다.


5. 재귀함수로 팩토리얼 만들기

5-1. 문제

재귀를 사용하여 팩토리얼(factorial)을 구하는 함수를 구현해주세요. 팩토리얼이란 1에서부터 n까지의 정수를 모두 곱한것을 말합니다.

1! = 1 
2! = 1 * 2 
5! = 1 * 2 * 3 * 4 * 5

5-2. 풀이

def factorial(n):
  if n == 1 or n == 0:
    return 1
  return n * factorial(n-1)

profile
개발자가 될 팔자

0개의 댓글