Skip to content

Conversation

@zaqquum
Copy link
Collaborator

@zaqquum zaqquum commented Apr 19, 2025

🌱WIL

이번 한 주의 소감을 작성해주세요!

  • 이번 주는 과제 문제를 못 풀었습니다. 담주에 이어서 풀도록 하겠습니다.
  • 추가로 이번 주는 실버 단계의 DP 문제를 풀었는데 풀이 아이디어를 봐도 이해가 안된다. 참고한 풀이를 보면 점화식 뿐만 아니라 어떻게 저런 풀이 과정을 떠올리는지 존경스러움 반 , 두려움 반이다.

🚀주간 목표 문제 수: 5개

푼 문제


백준 #1759. 암호만들기: 그래프 / 골드5

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  1. 문자 오름 차순 정렬
  2. 중복 x 인 일반 조합 → backtracking으로 구하기
    • 이때 해당 문자들이
  3. 최소 모음 1개 이상 &자음 2개 이상 조건 충족할 경우 출력

🚩제출한 코드

L , C  = map(int,input().split())
arr = sorted(list(input().split())) #  전체 정렬

# print(f"1 -{arr}")
result = [""] * L 
# print(arr)
# 전체 l 경우에서 c 개 조합
def backtracking(c , l , level , idx) :
    if level == l :
        a = 0 ; b = 0  
        # print(f"result {result}")
        for k in range(l) :
            if result[k] in [ "a" , "e" , "i" ,"o" ,"u"]:
                a +=1
            else :
                b += 1
        if a >= 1 and b >= 2 : 
            print("".join(result))

        return
    for s in range(idx , c) :
        result[level] = arr[s]
        backtracking(c,l,level+1, s+1)
        
backtracking(C , L , 0,0)

백준 #2159. 포도주 시식: DP / 실버1

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?
dp [i] : 현재 섭취 포도주량 최대 값

  1. 현재 O, 이전 O , 전전 X ⇒ cups[i] + cups[i-1] + dp[i-3]
  2. 현재 O , 이전 x , 전전 O ~ ⇒ cups[i] + dp[i-2]
  3. 현재 x , 이전 o or not (이전 O 전전 O ) ~ ⇒ dp[i-1]

dp[i] = max(cups[i] + cups[i-1] + dp[i-3] , cups[i] + dp[i-2] , dp[i-1])

🚩제출한 코드

# 1. 입력변수 
N = int(input())
cups = [int(input()) for _ in range(N)]

# 2. 
dp = [0]*N

dp[0] = cups[0]
if N >=2 : 
    dp[1] = sum(cups[0:2])
if N >= 3 : 
    dp[2] = max(cups[2] + cups[1] , cups[2] + cups[0] , dp[1])
if N >= 4 : 
    for i in range(3,N):
        dp[i] = max(cups[i] + cups[i-1] + dp[i-3] , cups[i] + dp[i-2] , dp[i-1])
# print(dp)
print(dp[-1])

백준 #17484. 진우의 달 여행(small): DP/ 실버2

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?
z= 해당 x,y에서 선택한 3방향 중 하나 { 0,1,2}
dp[z] [y][x] = 최소 연료 누적값

🚩제출한 코드

mport sys
input = sys.stdin.readline

n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
dp = [[[0] * m for _ in range(n)] for _ in range(3)]		# 3차원배열 DP
ans = sys.maxsize											# 임의의 큰 값

for z in range(3):
    for y in range(m):
        dp[z][0][y] = board[0][y]							# 초기 DP 초기화

for x in range(1, n):
    for y in range(m):
        if y == 0:		
        	# 가장 첫 번째 열인 경우
        	# 대각선 왼쪽 방향(dp[0])의 경우, 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
            # 아래 방향(dp[1])의 경우, 오른쪽 위에서 왼쪽 아래 방향으로 진행하는 값만 받을 수 있음
            # 대각선 오른쪽 방향(dp[2])의 경우, 오른쪽 위에서 대각선 왼쪽 진행하는 값과 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
            dp[0][x][y] = dp[1][x - 1][y]
            dp[1][x][y] = dp[0][x - 1][y + 1]
            dp[2][x][y] = min(dp[0][x - 1][y + 1], dp[1][x - 1][y])
        elif y == m - 1:
        	# 가장 마지막 열인 경우
            # 대각선 왼쪽 방향(dp[0])의 경우, 바로 위에서 아래 방향으로 진행하는 값과 왼쪽 위에서 대각선 오른쪽 방향으로 진행하는 값만 받을 수 있음
            # 아래 방향(dp[1])의 경우, 왼쪽 위에서 오른쪽 아래 방향으로 진행하는 값만 받을 수 있음
            # 대각선 오른쪽 방향(dp[2])의 경우, 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
            dp[0][x][y] = min(dp[1][x - 1][y], dp[2][x - 1][y - 1])
            dp[1][x][y] = dp[2][x - 1][y - 1]
            dp[2][x][y] = dp[1][x - 1][y]
        else:
        	# 중간 열인 경우
            # 대각선 왼쪽 방향(dp[0])의 경우, 바로 위에서 아래 방향으로 진행하는 값과 왼쪽 위에서 대각선 오른쪽 방향으로 진행하는 값만 받을 수 있음
            # 아래 방향(dp[1])의 경우, 오른쪽 위에서 대각선 왼쪽 방향으로 진행하는 값과 왼쪽 위에서 대각선 오른쪽 방향으로 진행하는 값만 받을 수 있음
            # 대각선 오른쪽 방향(dp[2])의 경우, 오른쪽 위에서 대각선 왼쪽 방향으로 진행하는 값과 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
            dp[0][x][y] = min(dp[1][x - 1][y], dp[2][x - 1][y - 1])
            dp[1][x][y] = min(dp[0][x - 1][y + 1], dp[2][x - 1][y - 1])
            dp[2][x][y] = min(dp[0][x - 1][y + 1], dp[1][x - 1][y])

        for z in range(3):	# 원래 자신의 좌표값 더함
            dp[z][x][y] += board[x][y]

for z in range(3):			# 3차원 배열 중 마지막 행의 최솟값을 찾음
    ans = min(ans, min(dp[z][-1]))

print(ans)

백준 #17271. 리그오브레전설(small): DP/ 실버2

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

🚩제출한 코드

import sys; input = sys.stdin.readline
MOD = 1000000007

N, M = map(int, input().split())

# i초 때 가능한 경우의 수는 두 가지가 있다.
# i-1초까지 스킬 쓴 상태에서 A 스킬 사용
# i >= M일 때, i-M초까지 스킬 쓴 상태에서 B 스킬 사용
# dp(i) = dp(i-1) + dp(i-M)

dp = [1] * (N + 1)
for i in range(M, N + 1): # M초 미만일 땐 dp[i] = dp[i-1]이기 때문에 무조건 1이다.
    dp[i] = (dp[i - 1] + dp[i - M]) % MOD

print(dp[N]

백준 #16401. 과자 나눠주기: 이분탐색/ 실버2

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

🚩제출한 코드

import sys
m,n=map(int,sys.stdin.readline().split())
snack=list(map(int,sys.stdin.readline().split()))

start=1 #적어도 길이1로 잘라야 함.
end=max(snack) #자르는 길이의 최대는 과자 중 제일 긴 놈

answer=0
while start<=end:
    mid=(start+end)//2 

    cnt=0
    for x in snack:
        if x<mid: #자르려는 단위보다 과자가 작으면 못 자름.
            continue
        else: #자르려는 단위보다 크면,
            cnt+=x//mid #그 과자를 해당 단위로 나눈 몫만큼 과자 나옴.

    if cnt>=m: #cnt가 너무 많으면 길이를 늘려야 함.
        start=mid+1
        answer=mid
    else: #cnt가 너무 적으면 길이를 줄여야 함
        end=mid-1

print(answer)

@zaqquum zaqquum self-assigned this Apr 19, 2025
@zaqquum zaqquum changed the title Hongjoo/4월 2주차/5문제 Hongjoo/4월 3주차/5문제 Apr 19, 2025
@Mingguriguri
Copy link
Collaborator

@zaqquum 님!

백준 #17271. 리그오브레전설(small): DP/ 실버2

이런 식으로 문제 유형 뒤에 바로 /가 오면 인식하지 못할 수 있습니다..! 꼭 공백을 추가해주세요!

백준 #17271. 리그오브레전설(small): DP / 실버2

이번 PR에서는 제가 수정해두었습니다!

Comment on lines +24 to +40
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리스트와 기능적으로 다르진 않지만 저는 set으로 모음을 정의해서 썼는데(vowel=set('aeiou')) ch in vowel 식으로 바로 확인할수 있는 점이 편했습니다! (큰 차이는 없지만 참고용으로,,, )

Comment on lines +25 to +53
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굉장ㅇ히,,,꽤 복잡해 보이는 풀이네요 😵
한주간 꾸준하게 코테 문제 푸신것같은데 너무 수고하셨습니다!!

Copy link
Collaborator

@Mingguriguri Mingguriguri left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

한 주간 여러 문제를 풀이하시느라 고생 많으셨어요!!

Comment on lines +37 to +40
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

문제 풀이를 준비할 때 사실 백트래킹이나 조합으로만 할 수 있다고 생각했는데, 홍주님처럼 DFS만으로도풀이할 수 있다는 것을 알게 되었습니다~~!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사실 얻어걸린거라.., 감사합니다

Copy link
Member

@YoonYn9915 YoonYn9915 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

발제 문제 명확하게 잘 풀어주신 것 같습니다. 👍

@zaqquum zaqquum merged commit e1db1aa into main Apr 20, 2025
@github-actions
Copy link

🔥2025-04 챌린지 진행 상황

👉 그래프

  • YoonYn9915: 0개 ❌
  • Mingguriguri: 0개 ❌
  • zaqquum: 4개 ❌

👉 DP

  • YoonYn9915: 2개 ❌
  • Mingguriguri: 4개 ❌
  • zaqquum: 4개 ❌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants