Merged
Conversation
learntosurf
approved these changes
May 22, 2024
Collaborator
learntosurf
left a comment
There was a problem hiding this comment.
문제를 보고 어떻게 접근할지 생각하는것과 접근하고자 하는 방식대로 구현하는 것 두가지가 다 잘되어야 알고리즘 문제를 풀 수 있는 것 같아요. 그런 의미에서 바로바로 잘 구현하시는 것 같아서 대단하십니다..👍 알고리즘 문제 푼 이후에 TIL 적어놓는 것 리뷰하기에 좋은 방법인것같아요! 이번주에도 수고하셨습니다 🔥
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
목표 문제 수: 3개
아래는 제가 정리한 내용 중에서, 핵심이 되는 플로우와 TIL 위주를 가져왔습니다.
PGS 체육복: 그리디 / Level1
정리한 노션 링크: 노션
🔍Intuition
테스트케이스를 통해서 문제에서 접근하는 방법을 정리해보자
lose리스트와reserve리스트에 공통으로 들어간 번호는 여벌 체육복을 가져왔는데 도난을 당한 경우이다. 즉, 도난은 당했지만 남은 체육복이 1개이기 때문에 수업에는 참여할 수 있으나 체육복은 빌려줄 수 없다. 따라서lost와list에서 모두 지워줘야 한다.n번의 학생이 체육복을 안 가져왔다면,n-1이나n+1번 학생한테만 빌릴 수 있다.lost와reserve는index순서대로 하나씩 비교하게 된다.for문 안에서 remove를 하니까 remove를 한 시점에서 반복이 종료된다.
이렇게 for 문이 비효율적으로 반복되는 것 같아서 한 반복문 안에서 실행시켜도 결과는 똑같다. 뒤에 빌려줄 수 있는 학생들이 있어도 빌려주지 못하는 상황이 여전히 발생했다.
그래서 접근한 방식: 중복을 제거하기 위해 집합 이용
🚩플로우
집합을 이용해 중복값을 제거한다.
lost_set은lost에서reserve를 빼고,reserve_set은reserve에서lost를 뺀다.⇒
lose리스트와reserve리스트에 공통으로 들어간 번호는 여벌 체육복을 가져왔는데 도난을 당한 경우이다. 즉, 도난은 당했지만 남은 체육복이 1개이기 때문에 수업에는 참여할 수 있으나 체육복은 빌려줄 수 없다. 따라서lost와list에서 모두 지워줘야 한다.reserve_set을 기준으로reserve_set의 요소에 -1을 한 값이나 +1을 한 값이lost_set에도 있는지 확인한다. 있다면,loset_set에서 제거한다.=>
n번의 학생이 체육복을 안 가져왔다면,n-1이나n+1번 학생한테만 빌릴 수 있다.전체 학생 수(
n)에서lost_set에 남아있는 학생 수를 뺀 값이 수업에 참석할 수 있는 학생 수, 즉 정답값이 된다.🚩My submission
💡TIL
힌트로서 ‘집합’을 사용한다는 것만 보게 되었는데 명쾌하게 풀렸다. 설마 집합으로 해도 되나 가물가물했는데 과감히 접근해야겠다.
공통요소를 제거할 때는 둘 중 하나만 제거하면 된다. 이때 제거할 때에는 반환하거나 연산에 사용되는 것을 제거하면 된다.
집합을 사용하면
출처 : [https://velog.io/@ready2start/Python-세트set의-시간-복잡도](https://velog.io/@ready2start/Python-%EC%84%B8%ED%8A%B8set%EC%9D%98-%EC%8B%9C%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84)
PGs 구명보트: 그리디 / Level2정리한 노션 링크: 노션
🔍Intuition
limit)은 항상 people 리스트의 최댓값보다 크다.🚩플로우
people[left] + people[right] <= limit이라면,answer += 1,left += 1,right -=1people[right]가 더 크기 때문에right-=1,answer += 1right가left보다 크거나 같을 때까지만 반복한다. 즉right가left의 값보다 작아지면 다 탐색한 것이므로 종료한다.answer를return한다.🚩My submission
💡TIL
x
백준 #1931. 회의실 배정: 그리디 / 실버1
정리한 노션 링크: 노션
🚩플로우
n)와 회의의 시작과 끝의 정보가 주어진 리스트(meetings)를 입력받는다.meetings리스트에 있는 모든 회의를 끝나는 시간 기준으로 정렬한다. 만약 끝나는 시간이 같다면, 시작 시간 기준으로 정렬한다.(lambda이용)meetings리스트의 시작값(start)과 끝값(end)을 반복하여 확인한다.last_end_time)보다 같거나 크다면, 회의를 할 수 있기 때문에 개수를 1개 늘려준다(cnt += 1) 그 후, 회의가 마지막에 끝나는 시간을 현재 값의 끝나는 시간으로 업데이트해준다.cnt)를 출력한다.🚩My submission
💡TIL
그리디 알고리즘은 현재 상황에서 가장 좋은 선택을 하는 방식으로 최적의 해답을 찾는 방법이다. 따라서 시간을 기준으로 정렬해야 한다.
자꾸
lambda로 정렬하는 방법을 까먹는다. 꼭꼭 기억하자ㅜㅜ