[ 이것이 코딩테스트다 ] 12일차

안영우·2021년 1월 8일
0
post-thumbnail
post-custom-banner

✏️ 서론

어제 배웠던 구현 알고리즘(완전탐색, 시뮬레이션)유형을 다시 한번 복습해보는 시간을 가졌다.


✏️ 본론

왕실의 나이트알고리즘은 2가지 방법으로 풀 수 있는데 오늘 중점은 책에 나와있지 않는 방법을 풀었다는 점이다.

먼저, 책에 나와있던 코드다.

cases변수는 이동할 방향을 나타내는 코드이다.

첫번째 코드는 cases변수를 선언하여 new_array, new_row를 계산할 때 dx = case[0], dy = case[1]과 같은 역할을 하게햇다.

data = input()
column = int(chr(ord(data[0]) - 48))
row = int(data[1])
count = 0

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

for case in cases:
    new_column = column + case[0]
    new_row = row + case[1]
    if new_column > 0 and new_row > 0 and new_column <= 8 and new_row <= 8:
        count = count + 1
        print(new_row, new_column)
print(count)
👉🏽 입력: al
👉🏽 출력: 2

두번째코드는 dx, dy를 넣은 코드인데, cases를 풀어서 작성했다.
보통 dx, dy를 선언하는 방식으로 알고리즘에 많이 접근한다고 했다.

data = input()
column = int(chr(ord(data[0]) - 48))
row = int(data[1])
count = 0

move_types = [True for _ in range(8)]
dx = [-2, -2, 2, 2, -1, 1, -1, 1]
dy = [-1, 1, -1, 1, -2, -2, 2, 2]

for i in range(len(move_types)):
    nx = column + dx[i]
    ny = row + dy[i]
    if nx > 0 and ny > 0 and nx <= 8 and ny <= 8:
        count = count + 1
print(count)
👉🏽 입력: al
👉🏽 출력: 2

다음은 백준에 나와있는 브루트 포스 유형 문제이다.

📍 [ 문제 ] 백준 - 블랙잭(2798)

문제

여러가지 풀이 방법이 있겠지만, itertools -> combination을 적용했다.

if result < sum(card) <= m: 코드에서 result를 추가하면 출력 값을 최소값부터 출력할 수 있다.

결과적으로 제일 나중에 나온 값을 result로 저장해서 print하면 된다.

나중에 잘 써먹을 수 있을것 같다.

import itertools

n, m = map(int, input().split())
cards = list(map(int, input().split()))

result = 0

# 배열값을 큰 순으로 정렬하려면 result보다 크게 범위를 설정한다.
for card in itertools.combinations(cards, 3):
    if result < sum(card) <= m:
        result = sum(card)
print(result)

✏️ 결론

2일 동안 구현 알고리즘을 배워봤는데,
한 문제 풀때마다 시간이 엄청 오래걸렸다.

백준에서 단계별 알고리즘에 보면 관련문제는 많은데 1문제씩 풀고 있어 진도가 엄청 느리게 나간다.

하지만, 내가 완벽하게 구조를 이해해야 다음 구문으로 넘어갈 수 있기 때문에 천천히 나가더라도 완벽하게 이해하려고 한다.

문득, 알고리즘이 어려워 포기하고 싶은 마음이 들때마다 그래도 최소 30일은 해보고 그만둬야지라는 생각을 한다.

일단 30일정도는 해보자. 그럼 실력이 늘겠지. 😎

profile
YW_Tech
post-custom-banner

0개의 댓글