| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- Unity
- c++ 백준
- c#코딩기초트레이닝
- c++ solved.ac
- 바킹독
- solved class 2
- unity게임만들기
- 바킹독알고리즘
- c#
- 오블완
- 유니티공부
- 유니티서바이벌게임만들기
- 백준코딩테스트
- 유니티
- C++
- c#코테
- unity3d게임만들기
- 백준 C++
- unity게임
- 백준 c++ 공부
- 리그오브레전드턴제게임
- 백준 구현문제
- 백준코테
- c#기초문법
- 티스토리챌린지
- unity3dservival
- C#문법
- c#기본문법
- 유니티게임만들기
- 백준
- Today
- Total
나 개발자 진짜 되냐?
바킹독 0x05 문제8 / 백준 6549번 히스토그램에서 가장 큰 직사각형 본문

후딱 풀자더니..
일주일이 넘게 지났다.
요즘 지친 거 같다. 뭔가 의욕이 없다.
그래서 자꾸 멍하게 되고 풀어지는 거 같다.
어제는 나름..?! 힐링여행 대전을 다녀왔다.
케이크집이 유독 좋았다.
오늘 점심에 사온 빵과 케이크를 먹었는데
참 맛있었다.
왕복 7시간 걸렸는데....흠.. 다음에도 갈 수 있을지나 모르겠다.

늘 생각하는거지만 문제 자체도 이해하는 게 힘들다.
가장 넓은것을 찾는 것이기 때문에
위에 그림과 같이 지금은 가장 큰 게 색칠되어 있지만
21 도 이론상 1*2인 직사각형이 생기긴 한다.
이런 걸 고려했을 때....
일단 앞숫자와 뒷숫자를 비교하고 더 작은 크기랑 세었던 횟수를 곱해주면 되지 않을까?라는 생각을 했다.
나도 쓰면서 무슨 뜻으로 말하는지 헷갈리긴 한다.
일단, 스택은 두 개 필요하다.
높이 그다음에 가로, 즉 왼쪽으로 몇 번 갔는지 인덱스를 셀 것이다.
먼저 스택에 들어있던 막대보다 새로 들어온 막대기가 더 작으면,
작은 방향으로 계산해야 하니까 더 이상 먼저 들어왔던 길이가 긴 애는 필요가 없다.
그래서 pop 해줘야 하고,
pop 해주기 전에 면적을 계산해줘야 한다.
이 면적을 계산해 주는 게 나는 힘들었다.
가로길이를 어떻게 계산해야 할지 감이 안 왔다.
그래서 지피티의 도움을 받았다.
그것을 인덱스로 정해놓고 시작하자고 했다.
막대기가 3개 들어왔다면
0 1 2 일거고
그 폭을 구하려면
오른쪽에서 왼쪽을 빼고 +1을 해준다.
L=0, R=0 → 폭=1
L=0, R=1 → 폭=2
L=1, R=3 → 폭=3 (3-1+1=3)
이런 계산을 베이스로 시작하게 된다.
자, 우리는 push 하면서
높이인 h와 가로인 idx를 넣게 된다.
그 인덱스부터 시작할 테니 시작점 즉 L은 정해진 것이다.
이제 R 차례다.
이 R의 끝? 을 생각했을 때,
우리가 위에 말한 새로운 막대기가 원래 있던 막대기 보다 작을 때 이다.
즉 5 뒤에 3이 들어오게 되면
직사각형을 만들기 위해 기준점이 되던 5가 더 이상 5의 높이로 직사각형을 만들 수 없기 때문에
이제 기준점을 3으로 바꿔야 하는 것이다.
3으로 바꾸기 전에 우리가 해야 할 일은
1. 5가 기준이었을 때 있던 직사각형의 넓이를 구하고
2. 더 이상 필요 없으니 pop 해줘야 한다.
1. 5가 기준이었을 때 있던 직사각형의 넓이를 구하고
이 경우 지금.. 3이 기준점이 되기 직전이었으니까
i -1 이 5 일거고
왼쪽은 idx이고 오른쪽은 i -1 이 되게 된다...
그럼 폭 구하는 식은..
(i - 1) - idx + 1
즉.. i - idx가 되게 된다. ㅋㅋㅋㅋㅋ
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아 너무 어려워!!!!!!!!!!!!!
악!!!!!!!!!!!!
이제 문제를 풀어보자
아! 중요한 것은
가로 곱하기 세로인데
세로만 해도 높이가 10의 9승이라..
int로는 택도 없다.
그래서! long long으로 해줘야 한다.

여기서 어려웠던 건 아까 직사각형 만드는 폭 공식..? 이였다.
밑에서도 n - S.top(). second 인 이유는
이제 마지막 검토는
스택에 있는 길이만큼의 직사각형 이기 때문에
맨 오른쪽은 n이니까 거기서 빼주면 크기가 되게 된다.
정확히 말하면 여기서는 n까지 루프를 도니까
제일 끝은 n - 1 이 되고
폭 공식에 의해 n - 1 + S.top().second +1
R - L + 1
그렇다.
너무 어려워서 머리가 아프다....
사실 지금까지 풀던 스택의 패턴은
넣어보고, 전에 친구( top )랑 비교해서 크면 top 빼주고
안 크면 다른 거 비교하는 패턴이었다.
그런 패턴이었음에도 참 어려웠다.
어려웠다.
다 풀긴 했는데.....
너무 어려워서 아무 생각이 없다.
ㅎㅋ 그다음 거도 잘할 수 있겠지!?
파이팅이다!
'C++을 시작해봐요! > 알고리즘을 공부해봐요!' 카테고리의 다른 글
| 바킹독 0x06 문제2 / 백준 18258번 큐2 (0) | 2025.11.21 |
|---|---|
| 바킹독 0x06 문제1 / 백준 10845번 큐 (0) | 2025.11.20 |
| 바킹독 0x05 문제7 / 백준 3015번 오아시스 재결합 (0) | 2025.11.04 |
| 바킹독 0x05 문제6 / 백준 17298번 오큰수 (0) | 2025.10.24 |
| 바킹독 0x05 문제5 / 백준 6198번 옥상 정원 꾸미기 (0) | 2025.10.23 |