1. 그리디 & 구현 (이것이 코딩테스트다 - with python)

Jaewoong2·2021년 1월 14일
0

알고리즘공부

목록 보기
10/35

강의를 보며 기록해야할 부분만 작성.

[1]이 될 때 까지

1이 될 때까지 입력받은 N을 K로 나누거나, N을 1을 빼는 최소 횟수를 구하는 문제

  • 최소 횟수 를 구하기 위해선, 나누는 것을 많이 할 수록 최소 횟수이다. (1을 빼는 것을 적게하자)

내가 문제를 풀 때 나온 것은 재귀로 풀었는데, 이렇게 재귀로 하면 시간초과가 나올 것 같다..
또한, 입력 받아야 하는 값이 n과 k 뿐인데 count 까지 함수로 넣었으니 할 말 없다
---> 작성이유

def whileOne(n, k, count):
    if n == 1:
        print(count)
        return
    if n % k == 0:
        n = n // k
    else:
        n = n - 1
    count = count + 1
    whileOne(n, k, count)

whileOne(25, 3, 0)


-----------------------------------------------------

def whileOneOLogN(n, k):

    result = 0 # 결과 값

    while True: # n 값이 K보다 크거나 같을 때 까지 반복한다
        # target = n을 k로 나누어 떨어지개 만든 후 k를 곱한 값 즉, n 을 k 로 나누어 질때 까지 뺀 값
        # 가장 가까운 나눠 떨어지는 값을 얻는 방법
        target = (n // k) * k

        # result = 얼마나 뺐는지 결과 값에 더해준다 (즉, -1 의 갯수당 실행 횟수 1번이기 때문)
        result += (n - target)

        # n 을 1을 나누어질 때 까지 뺀 값으로 준다.
        n = target

        # 만약, n이 k로 나누어지지 않는다면 실행을 멈춘다.
        if n < k:
            break
        # 실행 1회 추가 (n 을 k로 나누었기 떄문)
        result += 1
        # n을 k로 나눈 정수의 몫을 n에 대입.
        n //= k

    # n이 k보다 작지만, 1보다 클경우 그만큼 실행 횟수를 더해주기 위함
    result += n - 1
    print(result)

n, k = map(int, input().split())
whileOneOLogN(n, k) # 입력 값으로 받은 값을 n과 k 로 int 형으로 각각 받는다.

상하좌우 문제

이동방향을 받고 그 만큼 움직인 후의 위치를 물어보는 문제

def getPosition(space, moves):
    x, y = 1, 1

    #행
    dx = [0, 0, -1, 1]
    #열
    dy = [-1, 1, 0, 0]

    moves_plan = ['L', 'R', 'U', 'D']

    for move in moves:
        index = moves_plan.index(move)
        nx = x + dx[index]
        ny = y + dy[index]
        if nx < 1 or ny < 1 or nx > space or ny > space:
            continue
        x, y = nx, ny
        print(x, y)

getPosition(5, ['R', 'R', 'R', 'U', 'D', 'D'])

dx, dy를 만들어서 즉, 이동방향 을 업데이트 시키는 방향으로 풀면 되는 것을 알아갔다.

기사의 위치

8 x 8 안에 있는 기사의 위치를 받아서 그 기사가 움직일 수 있는 횟수를 구하는 문제이다.

  1. 수평으로 2칸 수직으로 1칸
  2. 수평으로 1칸 수직으로 2칸

기사는 이 2가지 방법 중 1가지 방법을 선택하여 움직 일 수 있다.

나는, 문제를 풀 때 dx, dy 같은 이동방향 에 대해서 생각하지 않고, 기사가 최대 8개의 이동 횟수가 있고, 상하 or 좌우 중 한개를 선택하여 이동 방법 1, 2를 모두 고려하면 움직일 수 있는 갯수가 정해짐을 고려했다.

즉, 기사의 위치 값을 받아서 숫자화 시키고 8x8을 넘어가지 않도록 이동, 이동을 고려해서 if문을 사용했는데,

실제로는, 이 , 구분이 아니라, 모든 케이스 이동방향에 대해서 고려하면 되는 문제였다. 즉

steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]

을 고려하면 되었다.


def KnightOfKingdom(pos: str):
    #행, 열
    col = ["1", "2", "3", "4", "5", "6", "7", "8"]
    row = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    count = 8
    colIndex = col.index(pos[1]) + 1
    rowIndex = row.index(pos[0]) + 1

    #좌
    for i in range(3):
        if i == 0:
            continue
        if i == 1:
            if rowIndex - i < 1 or colIndex - 2 < 1:
                count -= 1
            if rowIndex - i < 1 or colIndex + 2 > 8:
                count -= 1
        if i == 2:
            if rowIndex - i < 1 or colIndex - 1 < 1:
                count -= 1
            if rowIndex - i < 1 or colIndex + 1 > 8:
                count -= 1
    #우
    for i in range(3):
        if i == 0:
            continue
        if i == 1:
            if rowIndex + i > 8 or colIndex - 2 < 1:
                count -= 1
            if rowIndex + i > 8 or colIndex + 2 > 8:
                count -= 1
        if i == 2:
            if rowIndex + i > 8 or colIndex - 1 < 1:
                count -= 1
            if rowIndex + i > 8 or colIndex + 1 > 8:
                count -= 1

    print(count)

-------------------------------------------------------------------------

def GetPostionOfKnight():
    input_data = input()
    row = int(input_data[1])
    col = int(ord(input_data[0]) - int(ord('a')) + 1)

    steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
    result = 0
    for step in steps:
        next_row = row + step[0]
        next_column = col + step[1]
        if next_row > 0 and next_row < 9 and next_column > 0 and next_column < 9:
            result += 1
    print(result)

python 문법

  • .sort() 메소드는 list type만 사용할 수 있다.

  • str.isalpha() 은 문자가 알파벳인지 확인하는 함수이다. 알파벳이 아니면 False를 반환한다

  • list to string''.join(list) 을 사용하자

profile
DFF (Development For Fun)

0개의 댓글