-문제: https://www.acmicpc.net/problem/9576

골드 Level1 문제.

n권 중에 최대로 줄 수 있는 책 수를 구하는 건 줄 알았는데 그게 아니라 학생의 수를 구하는 것이라서 틀렸던 문제

처음엔 아쉽이었는데, 두번째 때 해결함!

-틀린풀이: 

다른 사람에게 준 책 수를 books리스트에 넣고, 최종 리스트의 합이 답이라고 생각해서 짠 코드이다

student의 i행의 0열부터 1열까지의 책번호 중에 남아있는 책이 있으면 주는 방식으로 생각했다 

그런데 학생수를 구하는 것이었으므로 틀렸다

 

5번,10번에 n+1, student[i][1]+1로 코드 입력해야한다. 그냥 n,student[i][1]로하면 indexError 발생

 

case =int(input())
for _ in range(case):
    n,m=map(int,input().split())
    student=[]
    
    for _ in range(m):
        student.append(list(map(int,input().split())))
    student=sorted(student,key=lambda x: x[1])
    
    cnt=0
    books=[0]*(n+1) #i번째 책이 아직 있는지 확인하는용
    for i in range(m):
        for j in range(student[i][0],student[i][1]+1):
            if books[j]==0: #아직 안 나눠준 책이라면 준다
                books[j]=1
                cnt+=1
                break
    print(cnt)

-정답풀이: 

cnt 추가하고, student 리스트 1열로 정렬하고, 학생이 처음 책을 받았을 때 cnt세고 break하는 것까지 추가했다 

1열로 정렬하는 이유는 

N, M = 3, 3 이고 각 학생들의 신청숫자가 [ (1,2), (1,3), (2,2) ] 이라고 가정할 때, 첫 번째 학생에게 1번 책, 두 번째 학생에게 3번 책, 세 번째 학생에게 2번 책을 주면 된다.
만약 그냥 정렬을 한다면 첫 번째 학생이 1번 책, 두 번째 학생이 2번 책을 가져가 세 번째 학생은 책을 가져가지 못하게 된다. (출처: https://velog.io/@zwooo96/%EB%B0%B1%EC%A4%80-9576%EB%B2%88-%EC%B1%85-%EB%82%98%EB%88%A0%EC%A3%BC%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%ACPython)

'백준 > Greedy' 카테고리의 다른 글

[백준] 2012번: 등수 매기기  (0) 2022.02.09
[백준] 13904번: 과제(다시)  (0) 2022.02.09
[백준] 9237번: 이장님 초대  (0) 2022.02.09
[백준] 1092번: 배(다시 복습)  (0) 2022.02.08
[백준] 12904번: A와 B  (0) 2022.02.08

-문제:https://www.acmicpc.net/problem/9237

 

9237번: 이장님 초대

입력은 두 줄로 이루어져 있다. 첫째 줄에는 묘목의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄에는 각 나무가 다 자라는데 며칠이 걸리는지를 나타낸 ti가 주어진다. (1 ≤ ti ≤ 1,000,000)

www.acmicpc.net

 

실버 level5이고, 스스로 풀었던 문제.

원리 이해하는데는 그렇게 어렵지 않았다. 먼저 주어진 값들을 큰 순서대로 나열한 다음, 각각의 인덱스와 인덱스 값을 더해 ans리스트에 넣는다.

ans 값 중 가장 큰 값에 2를 더해서 출력하면 끝

2를 더하는 이유는 처음 시작을 1일부터라고 했는데 인덱스는 0부터 시작이므로 그 차이를 더해줬고, 묘목이 다 자란 다음날에 이장님을 초대한다고 했으므로 묘목이 다 자란 뒤 하루를 더 더했다 

 

-정답풀이: 

n=int(input())
s=list(map(int,input().split()))
s.sort(reverse=True)
ans=[]
for i in range(n):
    ans.append(i+s[i])
print(max(ans)+2)

 

-7월 14일 풀이 

이건 한번에 성공했다!

n=int(input())
trees=list(map(int,input().split()))

trees.sort()
trees.sort(reverse=True)
trees=[0]+trees

answer=0
for i in range(n+1):
    answer=max(answer,i+trees[i])
    
print(answer+1)

-문제: https://www.acmicpc.net/problem/1092

간단하게 봤는데 아니었던 문제. 블로그 참고해서 다시 복습해야할 것 같다 

https://velog.io/@ju_h2/Python-%EB%B0%B1%EC%A4%80-1092.-%EB%B0%B0-%ED%92%80%EC%9D%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%83%90%EC%9A%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EA%B7%B8%EB%A6%AC%EB%94%94-%EA%B5%AC%ED%98%84-5

 

-정답풀이: 

사실 이 풀이는 복잡하고, 이해도 안가서 이거 말고 다른 풀이로 푸는 게 더 나을 것 같다(7/14)

n=int(input())
crane=list(map(int,input().split()))
m=int(input())
box=list(map(int,input().split()))
crane.sort(reverse=True)
box.sort(reverse=True) 

minute=0 #시간
checked=[0 for _ in range(m)] #박스를 옮겼는지 여부
count=0 #옮긴 박스의 개수

positions =[0]*n

if max(box)>max(crane):
    print(-1)
else:
    while count <len(box): #옮긴 박스가 전체 박스보다 적을 때까지 실행
        for i in range(n):
            while positions[i]<len(box):
                #아직 안 옮긴 박스 중에서, 옮길 수 있는 박스를 만날 때까지 반복
                if not checked[positions[i]] and crane[i]>=box[positions[i]]:
                    checked[positions[i]] = True
                    positions[i]+=1
                    count+=1
                    break
                positions[i]+=1
        minute+=1
    print(minute)

-공부: 

-문제:https://www.acmicpc.net/problem/12904

 

풀이 없이 스스로 푼 문제 골드 level5문제 

 

-정답풀이: 

일정한 규칙으로 s를 t로 바꾸는 경우는 문제 그대로 s부터 시작하는 것이 아니라 결과물에서 규칙을 적용해서 s로 풀어나가야한다

t에서 s로 변하는 규칙을 생각해보면 다음과 같다

1. 끝자리가 'A'일 때 t에서 'A'빼기

2. 끝자리가 'B'일 때 t에서 'B'빼고 뒤집기 

 

뒤집는 건 메인 코드에 구현하면 코드가 복잡해질 것 같아 flip()이라는 함수를 정의 후 진행했다

True로 걸어 놓고, if문으로 break 구현하기

일단 길이가 같을 때 두 단어가 같은지 다른지 알 수 있으므로 먼저 길이를 확인하고 같다면 둘이 일치하는지 확인하고 1출력, 둘이 길이는 같은데 문자가 다르다면 0을 출력해주고 break를 하면 while문을 빠져나온다

 

길이가 같지 않을 때는 끝자리 수에 따라 진행해주면 된다

22번라인데 flip한 걸 새로 t에 넣어줘야하는데 처음에 그냥 flip(t)만 해서 뒤집은게 t에 저장이 안돼 틀렸었다 

def flip(a):
    b=[]
    for i in range(len(a)-1,-1,-1):
        b.append(a[i])
    return b
s=list(input())
t=list(input())
while True:
    if len(t)==len(s):
        if t==s:
            print(1)
            break
        elif t!=s:
            print(0)
            break
    
    if t[-1]=='A':
        del t[-1]
        
    elif t[-1]=='B':
        del t[-1]
        t=flip(t)

+ Recent posts