Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

30-yuna83 #141

Merged
merged 2 commits into from
Mar 4, 2024
Merged

30-yuna83 #141

merged 2 commits into from
Mar 4, 2024

Conversation

yuna83
Copy link
Member

@yuna83 yuna83 commented Feb 19, 2024

🔗 문제 링크

도둑


✔️ 소요된 시간

40분


✨ 수도 코드

집의 개수 n, 도둑이 돈을 훔쳐야 할 연속된 집의 개수 m,
자동 방범장치가 작동하는 최소 돈의 양 k가 주어질 때,
도둑이 붙잡히지 않고 돈을 훔칠 수 있는 m개의 연속된 집을 고르는 방법의 수를 출력!

ex)
n=8, m=3 k=15,
3 4 7 5 6 4 2 9 이면 (첫집3-마지막집9는 연결되어 있음!!)

m=3이므로 크기가 3인 윈도우를 설정해 순서대로 윈도우를 오른쪽으로 한칸씩 옮겨가며
윈도우의 합이 15가 넘지 않는 경우를 세면 된다!

(3 4 7), (6 4 2), (2 9 3)으로 3가지 방법이 있으므로
3출력


1. 첫집과 마지막집을 연결한다.

if m!=n:
    for j in range(m-1):
        home.append(home[j])

첫집과 마지막집을 어떻게 연결할 것인가?
(예시 기준 마지막 윈도우는 (9 3 4)여야 한다)

마지막 원소를 시작으로 m개의 윈도우가 만들어질수 있도록
처음 원소부터 필요한 원소만큼을 리스트에 append해주면 된다!!
단, m==n일 시에는 ex) n=3, n=3, 3 4 5
어떤 윈도우든 크기가 같으므로 이 경우는 제외한다!


2. 크기가 m인 윈도우를 만들어 그 합이 k를 넘지 않는 경우의 수를 구한다.

start= 0
end=m-1
count=sum(home[:m])
answer=0

if count<k: # 시작 윈도우 확인
    answer+=1
    while end<len(home)-1:
        count-=home[start]
        start+=1
        end+=1
        count+=home[end]
        if count<k:
            answer+=1

윈도우를 오른쪽으로 한칸씩 이동시키면서 start+=1; end+=1
제외된 원소는 빼주고 count-=home[start]
추가된 원소는 더해준다count+=home[end]


전체코드

import sys
input=sys.stdin.readline

t=int(input())
for i in range(t):
    n,m,k=map(int,input().split())
    home=list(map(int,input().split()))

    if m!=n:
        for j in range(m-1):
            home.append(home[j])

    start= 0
    end=m-1
    count=sum(home[:m])
    answer=0

    if count<k: # 시작 윈도우 확인
        answer+=1
    while end<len(home)-1:
        count-=home[start]
        start+=1
        end+=1
        count+=home[end]
        if count<k:
            answer+=1
    
    print(answer)

📚 새롭게 알게된 내용

첫집과 마지막집이 연결되는 걸 구현하면 이후에는 풀만한 문제였습니다!!
다음문제는 탐색 알고리즘들을 다시 공부하겠습니다
BFS, DFS 가 익숙하지 않으니까 PR 리뷰가 쉽지 않더라구요😂
백준 문제들로 훈련하고 못풀었던 고득점 키트문제들 도전해보겠습니다!!

<도움받은 출처>
https://velog.io/@030831/%EB%B0%B1%EC%A4%80-13422-%EB%8F%84%EB%91%91-Python


Copy link
Member

@tgyuuAn tgyuuAn left a comment

Choose a reason for hiding this comment

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

import sys
from collections import deque

total_test_case = int(sys.stdin.readline())
for _ in range(total_test_case):
    house_count, steal_count, maximum = map(int,sys.stdin.readline().split())
    house_information = list(map(int,sys.stdin.readline().split()))
    
    if house_count != steal_count: house_information.extend(house_information[:steal_count-1])

    answer = 0
    accumulate = 0
    window = deque()
    for idx in range(len(house_information)):
        if len(window) < steal_count:
            window.append(house_information[idx])
            accumulate += house_information[idx]

        else:
            accumulate -= window.popleft()
            window.append(house_information[idx])
            accumulate += house_information[idx]

        if len(window) == steal_count and accumulate < maximum: answer += 1
        
    print(answer)

아 슬라이딩 윈도우 로직은 바로 생각이 났는데..

약간 이거 준성님 문제랑 비슷하네요.

근데 집 개수와 털 때 개수가 같을 때 순환이 안생기는데

그걸 찾느라고 한 20분 정도 썻네요..

image

로직 보니 유나님이랑 완전 똑같이 풀었네요

흐흐.

@pknujsp
Copy link
Collaborator

pknujsp commented Feb 24, 2024

저도 전체 집 개수터는 집 개수를 고려해야한다는 걸 못떠올려서 한참 헤맸네요
누적 합을 따로 전부 계산해서 풀었는데
유나님 처럼 그냥 반복문 내에서 제일 왼쪽 값 빼는 식으로 해도 되겠군요

for _ in range(int(stdin.readline())):
    houses_num, m, k = map(int, stdin.readline().split())
    houses = list(map(int, stdin.readline().split()))
    if houses_num != m:
        houses = houses[houses_num - m + 1:] + houses
        
    for i in range(1, len(houses)):
        houses[i] += houses[i - 1]
    
    left = 0
    count = int(houses[m - 1] < k)
    for right in range(m, len(houses)):
        if houses[right] - houses[left] < k:
            count += 1
        left += 1
        
    print(count)

@yuna83 yuna83 merged commit 323ab91 into AlgoLeadMe:main Mar 4, 2024
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.

3 participants