[SW정글] Week 04 개발일지

2023. 1. 30. 15:55· SW정글/알고리즘
목차
  1.  
  2. 동적 프로그래밍
  3.  
  4. 그리디 알고리즘
  5.  
  6. Test

 

 

Week 04 개발일지

동적 프로그래밍

swift-shame-3ee.notion.site

동적 프로그래밍

  • 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 설계 기법
  • 비트 연산
    • 1 << k
      • k번째 비트를 켠다
        • 0번째부터 시작
        • 1 << 5 = 0b 100000
      • n & (1 << k)
        • n의 k번째 비트가 켜져있는지 확인
        • 12 & (1 << 3) = True : 0b 1100의 3번째 비트는 1임
      • n | (1 << k)
        • n의 k번째 비트를 켠다
        • 12 | (1 << 2) = 14 : 12의 2번째 비트를 켜서 0b 1110이 됨
    • (1 << k) - 1
      • k개의 비트를 모두 켠다
        • (1 << 5) - 1 = 0b 11111
      • n & ((1 << k) - 1)
        • n의 마지막 k자리 추출
        • 0b 1001 1101 & ((1 << 4) - 1) = 0b 1101
 

현실에서 유용한 Bitwise 연산 및 활용 모음

개인적으로 알고리즘 문제와 실제 개발에서 유용하게 사용했던 몇몇 비트 연산 및 활용법을 소개합니다.

shoark7.github.io

 

그리디 알고리즘

부분의 최적의 해를 구해서 전체의 최적의 해를 구하는 알고리즘

 

Test

 

1890번: 점프

첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장

www.acmicpc.net

import sys
from functools import cache

input = sys.stdin.readline

n = int(input())
arr = [list(map(int, input().split())) for x in range(n)]


@cache
def dfs(x, y):
    if x == n - 1 and y == n - 1:
        return 1

    elif arr[x][y] == 0:
        return 0

    result = 0

    dx = [arr[x][y], 0]
    dy = [0, arr[x][y]]

    for i in range(2):
        nx = x + dx[i]
        ny = y + dy[i]

        if nx < n and ny < n:
            result += dfs(nx, ny)

    return result


print(dfs(0, 0))
 

1937번: 욕심쟁이 판다

n × n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에

www.acmicpc.net

import sys
from functools import cache

input = sys.stdin.readline
sys.setrecursionlimit(10**9)

n = int(input())
arr = [list(map(int, input().split())) for x in range(n)]


@cache
def panda(x, y):
    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]

    max_move = 0

    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]

        if 0 <= nx < n and 0 <= ny < n and arr[nx][ny] > arr[x][y]:
            max_move = max(max_move, panda(nx, ny))

    return max_move + 1


result = 0
for i in range(n):
    for j in range(n):
        result = max(result, panda(i, j))

print(result)
 

1202번: 보석 도둑

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci

www.acmicpc.net

import sys
from heapq import *


input = sys.stdin.readline

n, k = map(int, input().split())
j_arr = [tuple(map(int, input().split())) for x in range(n)]
b_arr = [int(input()) for x in range(k)]


def jewel_thief(j_arr, b_arr):
    heapify(j_arr)
    b_arr.sort()

    result = 0
    temp_arr = []
    for bag_w in b_arr:
        while j_arr and j_arr[0][0] <= bag_w:
            weight, value = heappop(j_arr)
            heappush(temp_arr, -value)

        if temp_arr:
            result -= heappop(temp_arr)

    return result


print(jewel_thief(j_arr, b_arr))

'SW정글 > 알고리즘' 카테고리의 다른 글

[SW정글] Week 03 개발일지  (1) 2023.01.30
[SW정글] Week 02 개발일지  (0) 2023.01.30
[SW정글] Week 00 ~ 01 개발일지  (0) 2023.01.30
  1.  
  2. 동적 프로그래밍
  3.  
  4. 그리디 알고리즘
  5.  
  6. Test
'SW정글/알고리즘' 카테고리의 다른 글
  • [SW정글] Week 03 개발일지
  • [SW정글] Week 02 개발일지
  • [SW정글] Week 00 ~ 01 개발일지
초혼
초혼
siaksiakx@gmail.com github.com/chohon
초혼
초혼 개발일지
초혼
전체
오늘
어제
  • 분류 전체보기 (57)
    • SW정글 (10)
      • 알고리즘 (4)
      • 자료구조 (1)
      • OS (4)
      • 프로젝트 (1)
    • 기본 (26)
    • 용어 정리 (2)
    • 알고리즘 문제 (1)
      • HackRank (1)
    • 게임 서버 (8)
    • 스크랩 (3)
    • Pension (6)
    • Golang (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
초혼
[SW정글] Week 04 개발일지
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.