Conversation
YoonYn9915
left a comment
There was a problem hiding this comment.
이번 발제 문제와 과제 문제 모두 잘 풀어주신것 같습니다.
과제 문제는 N이 5000개까지이므로 O(N log N)의 시간복잡도를 사용할 수 있는 문제였습니다. 따라서 선형으로 O(N) 시간복잡도를 써서 세 용액중 하나를 고정시켜놓고, 발제문제에서 사용한 투 포인터 알고리즘으로 O(log N) 시간 복잡도를 써서 나머지 용액 중 절댓값이 0에 가장 가까운 두 용액을 찾으면 되는 문제였습니다.
한 주 수고하셨습니다!!!
There was a problem hiding this comment.
저는 i를 고정한 뒤에 left는 0부터 right는 N-1부터 시작하게 했는데 민정님 코드 보니까 left를 i+1로 해도 되겠네요.
민정님이 리뷰 남겨주신 아래 부분도 left가 0부터 시작하니 i가 left나 right와 같아질 수도 있어서 추가한 거거든요.
if left == i:
left = i + 1
continue
elif right == i:
right = i - 1
continueThere was a problem hiding this comment.
그렇군요!! 윤상님처럼 접근할 수 있다는 점 참고해야겠네요!!
There was a problem hiding this comment.
저는 세 용액 총합의 최소값을 INF로 설정했는데 민정님은 첫번째 경우의 합으로 설정하셨네요. 초기화는 필수가 아닌 이상 저는 설정하지 않고 그냥 사용했던 것 같습니다.
그래도 민정님처럼 중간값, 세 용액 조합 리스트 같이 아래에서 새로 대입하는 변수지만 위에서 초기화 하고 사용하는 것이 가독성과 변수 활용에 용이해 보이네요.
🔥2025-04 챌린지 진행 상황👉 그래프
👉 DP
|
🌱WIL
#2470. 두 용액문제는 비슷한 유형을 여러 번 풀어본 덕분에 비교적 수월하게 해결할 수 있었다. 그러나#2473. 세 용액문제는 세 개의 값을 찾아야 해서 처음에 좀 헤맸다. 처음 접근할 때는 세 개의 포인터(left,mid,right)를 동시에 관리하려 했지만, 문제를 풀다 보니 이 방식은 일부 조합을 시도조차 하지 않는다는 단점이 있다는 것을 알게 되었다. 이 문제를 통해, 세 값을 구해야 할 때는 하나의 값을 고정(i)하고, 나머지 두 값을 투포인터로 관리해야 한다는 점을 배웠다. 또, 다른 분들의 블로그 코드를 참고하다 보니 시간 초과가 발생하는 경우도 있었는데, 그 원인을 분석해볼 수 있었다.#5107. 마니또문제는 잊고 있었던 유니온 파인드 알고리즘을 복습할 수 있는 좋은 기회였다. 기존에는 숫자로 표현된 그래프를 주로 다뤘지만, 이번 문제는 "이름"을 기반으로 접근해야 해서 처음에는 많이 헷갈렸다. 그래도 덕분에 유니온 파인드 개념을 다시 정리할 수 있어 의미 있는 시간이었다.🚀주간 목표 문제 수: 3개
백준 #2470. 두 용액: 투포인터 / 골드5
정리한 링크: (바로가기)
🚩플로우 (선택)
전체 용액의 수
N과 용액의 특성값을 저장할 리스트liquid를 입력받고 정렬한다.left,right투 포인터를 초기화한다.answer와answer_liquid의 초기값을 설정한다.left와right가 교차할 때까지 아래 과정을 반복한다.temp에 저장해둔다.temp가 0에 더 가까우면 정답을 갱신한다temp가 음수이면left += 1,temp가 양수이면right -= 1로 포인터를 이동한다.while반복문 종료 후 정답을 출력한다.🚩제출한 코드
💡TIL
백준 #2473. 세 용액: 투포인터 / 골드3
정리한 링크: (바로가기)
🚩플로우 (선택)
i)를 고정i다음 인덱스를left로, 마지막 인덱스를right로 설정left와right가 교차하면 종료🚩제출한 코드
💡TIL
left,mid,right)를 동시에 관리”**하려고 했다. 이렇게 하면 일부 조합의 경우를 시도하지 않고 넘어가기 때문에 정확한 답을 낼 수 없다는 것을 알게 되었다. 이 문제처럼 3개의 값을 구해야 하는 투포인터의 유형의 경우 하나를 고정값(ex.i)으로 두고, 나머지 2개를 포인터로 설정해야 한다는 것을 알게 되었다.sys.maxsize를 사용하면 시간초과가 날 수 있다는 것을 알게 되었다.*를 붙여 출력하면 한 칸씩 간격을 두고 출력할 수 있다.백준 #5107. 마니또: 그래프 / 실버1
정리한 링크: (바로가기)
🚩플로우 (선택)
N = 0일 때 종료)manito딕셔너리를 만든다.parent배열을 set으로 변환해 그룹 수를 세고 출력한다.🚩제출한 코드
💡TIL