-
Notifications
You must be signed in to change notification settings - Fork 0
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
4-oesnuj #14
Conversation
for (auto& i : v) | ||
cin >> i; //각 빌딩 높이 입력 | ||
|
||
long long int count = 0; //count가 int형을 넘어서기에 long long int type으로 둠 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
long long int type은 처음보는 타입인데 준서님 덕분에 새롭게 알아갑니다!
모노톤 스택이라는 개념도 있었군요!!.. 처음 알아갑니다ㅎㅎ 밑에는 모노톤 스택 예시코드인데 참고 하시면 좋을것 같아서 가져와봤어요!!
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
우선 문제 풀이 정말 잘 봤습니다! 덕분에 시간 초과 해결 방법과 모노톤 스택이라는 것도 알게 되었어요
다만, 제가 c++를 잘 알지 못한 나머지 ios_base::sync_with_stdio(false)
라는 구문을 처음 봐서 찾아보니 ios_base::sync_with_stdio
는 c의 stdio와 cpp의 iostream을 동기화시켜주는 역할을 하고, ios_base::sync_with_stdio(false)
는 동기화를 비활성화시켜줌으로써 C++만의 독립적인 버퍼가 생성되어 c의 버퍼와 병행하여 사용할 수 없게 되지만, 사용하는 버퍼의 수가 줄어들었기 때문에 실행 속도는 빨라지게 된다고 하더라고요!
덕분에 신기한 것 많이 알아가요 이번 pr 수고하셨습니다~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아직 알고리즘 문제에 익숙하지 않아 다른 문제 유형들을 볼 때마다 이해하기 힘들었는데, 스택문제가 나와서 좋았어요!! 저도 스택문제를 풀었는데, 준서님 문제는 제가 풀었던 것보다 난이도가 훨씬 있더라구요..그래서 이해하기 조금 힘들었는데, 스택을 알아서 그나마 이해할 수 있었던 것 같아요!! 저도
ios_base::sync_with_stdio(false);
cin.tie(NULL);
이런 코드는 처음봐서 어떤 경우 사용하는지 궁금해서 찾아봤어요! 백준에서의 시간초과를 해결하기 위해 사용하는 코드더라구요. 이 코드를 통해 입출력 속도가 빨라지고, 그로 인해 시간초과로 틀렸던 문제가 맞게 된다니...저도 c++을 이용할 때 사용해봐야 겠어요!
처음에 문제를 이해하는게 어려웠는데, 예시를 들어서 알려주셔서 이해가 되더라구요. 저도 준서님 코드 참고해서 한번 풀어봐야 겠네요!
PR수고하셨어요👻
🔗 문제 링크
백준 | 옥상 정원 꾸미기
✔️ 소요된 시간
2시간
✨ 수도 코드
교황님이 스택 문제로 탑을 추천해주셨는데 저번에 풀어본 문제라서 비슷한 문제라고 나와있는 이 문제를 도전했습니다.
먼저 떠오르는 풀이는 각 빌딩의 오른쪽에 자신보다 높은 빌딩 전까지의 원소의 갯수를 다 더하면 답이었습니다.
그런데 이 방법은 최악의 경우O(n제곱)정도의 시간 복잡도를 가져 다른 풀이를 생각해봤습니다.
스택 문제였기에 스택으로 어떻게 풀어야할지 1시간 넘게 고민했네요.
빌딩의 높이를 왼쪽부터 오른쪽으로 하나씩 입력받고 받을때 마다 아래 로직대로 처리를 해줍니다.
흐름대로 설명을 해보자면
Note
3.위 3단계가 끝나면 스택에 입력받은 빌딩을 스택에 넣어줍니다.
🚩예시
건물 5개이고 높이 {10, 5, 1 ,3 ,14}가 순차적으로 입력됩니다.
현재 스택이 비어있으니 현재 입력
push
합니다.Stack
[ 10 ]
두번째 입력
5보다 낮은 빌딩은 스택에 없다. 스택에 남아있는 빌딩 수가 곧 5를 볼 수 있는 빌딩수(count에 1 더한다.)
나를 볼 수 있는 빌딩수 처리가 끝났으니
push
한다.Stack
[ 10 5 ]
세번째 입력
1보다 낮은 빌딩은 스택에 없다. 스택에 남아있는 빌딩 수가 곧 1를 볼 수 있는 빌딩수 (count에 2 더한다.)
나를 볼 수 있는 빌딩수 처리가 끝났으니
push
한다.Stack
[ 10 5 1 ]
네번째 입력
3보다 낮은 빌딩은 스택에 있다. 3보다 낮은 빌딩을 다
pop
시킨다.Stack
[ 10 5 ] <- 1이 pop, 더 이상 3보다 낮은 빌딩은 없다. 스택에 남아있는 빌딩수가 곧 3을 볼 수 있는 빌딩수 (count 2에 2 더한다.)
나를 볼 수 있는 빌딩수 처리가 끝났으니
push
한다.Stack
[ 10 5 3 ]
다섯번째 입력
14보다 낮은 빌딩이 스택에 있다. 14보다 낮은 빌딩을 다
pop
시킨다.Stack
[ ] <- 3, 5, 10 전부 pop 되어버림. 스택에 남아있는 빌딩수가 없으니 14를 아무도 보지 못한다.
스택이 비었어버렸으니
push
한다.Stack
[ 14 ]
---------------------------------------모든 입력이 처리되었다. 이때 count가 정답이된다.
⚠주의할 점
이 문제의 입력을 보면 빌딩의 개수 N개가 (1 <= N <= 80,000)입니다.
예를들어 첫번째 빌딩의 높이가 80001, 두번째가 80000, .... N번째가 1이면 볼수 있는 건물의 개수는
80000 + 79999+ 79998 + .... + 1 입니다.
이를 식으로 나타내면 1부터 N까지의 합으로 n(n+1)/2로 n^2입니다.
입력의 최대값인 80000^2는 6,400,000,000이므로 int형이 나타낼 수 있는 범위를 초과합니다.
즉 count 변수를 int 형으로 선언하면 안되고
long long형
으로 선언해야 합니다.📂소스코드
📚 새롭게 알게된 내용
문제를 풀때는 내림차순으로 스택의 원소를 구성하면서 로직을 만들자고 푼게 아니고 이것저것 다 생각보고 해보다가 풀고보니 "어 내림차순처럼 스택이 구성되네?" 였습니다.
다 풀고나서 찾아보니 모노톤 스택이라는 것도 있더라구요.
monotone : 단조로운
모노톤 스택은 스택의 원소를 중복을 허용하지 않고 오름차순, 또는 내림차순으로 유지시키면서 값을 저장시키는 것
새 항목이 push 될때 단조를 유지하면서 저장한다. push전에 단조를 유지할 수 있도룩 pop을 수행한다.
이때 정렬되는 과정에서 발생하는 정보들이 유용하다.
이 방식을 이용하면 아까 처음 생각한 풀이와 달리 시간 복잡도가 O(n)인 것을 알 수 있었습니다.
참고한 사이트
처음은 어찌저찌 구현했지만 스택을 이렇게 활용할 수 있다는 점을 알고 다른 비슷한 유형을 풀어보니 쉽게 풀렸습니다.