인프런 커뮤니티 질문&답변

욕망의햄버거님의 프로필 이미지
욕망의햄버거

작성한 질문수

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

기억 ( 누적합 )

3강 3번 문제. 텐트세우기 #2304

해결된 질문

작성

·

304

1

안녕하십니까 코딩센세 훗날 일본 개발자 취업을 희망하는 코린이 입니다.

저번 시간에도 궁금한 점이 있어서 질문 드렸지만, 오늘도 어김없이 궁금한 점이 생겨서 이렇게 게시판에 글을 작성합니다.

3번 문제는 숙제로 주셨지만, 컨셉만 도출하고 코드는 30분 이상 걸리도록 구현을 못하여 강의록의 솔루션 코드를 이해하고 있는 중입니다.

서론은 이만하고 바로 본론으로 들어가겠습니다.

본론에 해당 부분은 질문의 내용입니다.

솔루션 코드를 해석하는 중에 # 정답 합치기 부분에 질문이 있습니다. 그 부분은 바로 maxPoint[1] - maxPoint[0] + 1 코드가 왜 필요한지 입니다. 아마도 추정컨대 높은 기둥이 넓이를 구해서 더해주는 연산으로 보입니다만, 항상 밑변이 1이라는 문제의 가정이 있었는데도 answer += 1*maxHeight 또는 answer += maxHeight가 오답인 근거를 듣고 싶습니다!

바쁘신 와중에도 답변에 신경써주셔서 감사드립니다.

답변 2

0

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

항상 질문해주셔서 기뻐요! ㅎㅎ

 

answer += (maxPoint[1] - maxPoint[0] + 1 )*maxHeight

 

이유는 가장 높은 기둥이 만약에 1줄이라고 상상해보면 알 수 있습니다!

 

만약에 가장 높은 기둥이 x = 10에 존재한다면 maxPoint[0]과 maxPoint[1]이 동일하기 때문에 0이 될 것이고, 0에다가 maxHeight을 곱한다고 해도 0이 되겠죠!

선생님! 답글 달아주셔서 감사합니다. 그런데 아직도 의문이 있어서 이렇게 대댓글로 남깁니다. +1 이 있었는데.. 어떻게 0 곱하기 maxHeight가 되는거죠..?

시간이 지난만큼 고민을 해봤는데요. (maxPoint[1] - maxPoint[0] + 1)*maxHeight는 모든 기둥이 maxHeight인 경우 등을 방지하기 위한 일반화된 표현이라고 이해해도 무방할까요?

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

오 죄송합니다 제가 좀 이해하기 어렵게 썼네요..

 

만약에 +1이 없다고 하면, 가장 높은 기둥이 하나일 때 0 곱하기 maxHeight가 되기 때문에,

 

+1 코드를 추가해 줘야 한다는 말이었습니다.

 

(maxPoint[1] - maxPoint[0] + 1)*maxHeight는 모든 기둥이 maxHeight인 경우 등을 방지하기 위한 일반화된 표현이라고 이해해도 무방할까요?

 

image

이런 형태의 기둥이 있다고 했을 때, 실제 높이는

 

image이렇게 될겁니다!

 

그런데 제가 사용한 코드에서 maxPoint와 minPoint는

 

image

4와 5겠죠!

 

5 - 4 를 하면 1이지만, 실제로 5의 높이를 가진 x좌표는 2개입니다.

 

그래서 maxPoint - minPoint +1을 해줘야 하는 이야기 입니닷!

 

어려우면 몇번을 질문주셔도 괜찮아요!

 

마지막에 이해한 그 순간이 가장 달콤한 법이니!!!!

 

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

앗 그리고 일본 취업 관련해서 저희 회사 추천 채용이 가능한데 관심 있으시면

sonjungwoo9@gmail.com으로 연락주세요!

항상 친절한 답변 감사드립니다. 센세의 댓글을 보고 좀 더 이해하는데 도움이 되었어요. 그럼에도 불구하고 해소되지 않은 궁금증이 있어서 질문 드립니다.

댓글의 마지막 부분에서 "실제로 5의 높이를 갖는 부분이 5와 4, 이렇게 2개이기 때문에 maxPoint - minPoint +1 로 표현해야 한다." 고 하셨는데요.

문제에서 제시한 정보에 의하면 항상 밑변의 길이는 1이라고 보장되어 있었습니다. 그래서 answer += 1 * maxHeight 라고 해도 될거라고 생각했었는데...... 오답이었구요.

이를 바탕으로 뒤집어서 생각해보면, 실제로 최고높이를 갖는 기둥의 x좌표가 항상 1의 차이가 아닐 수 있기 때문에 maxPoint - minPoint +1 라고 표현하는 게 논리적라고 이해하면 센세의 코드를 바르게 이해한 걸까요?

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

이를 바탕으로 뒤집어서 생각해보면, 실제로 최고높이를 갖는 기둥의 x좌표가 항상 1의 차이가 아닐 수 있기 때문에 maxPoint - minPoint +1 라고 표현하는 게 논리적라고 이해하면 센세의 코드를 바르게 이해한 걸까요?

 

이 말이 저에게 조금 어렵네요..

기둥의 가로 길이가 0이 아니라 1부터 시작하기 때문에 +1을 추가 했다고 이해해 주시면 좋을 것 같습니다...!

0

안녕하세요, 인프런 AI 인턴입니다.
코린이님, 코딩 테스트 준비하시느라 수고 많으십니다.

질문하신 내용에 대한 답변을 드리겠습니다. ‘maxPoint[1] - maxPoint[0] + 1’ 코드는 높이가 가장 높은 기둥의 넓이를 계산하기 위한 것으로 이해하시면 됩니다. 즉, 가장 높은 기둥의 시작점과 끝점 인덱스를 알아내어 그 사이에 있는 부분의 넓이를 구하려는 것입니다. 여기서 밑변이 1이라는 가정은 기둥 하나하나의 길이를 의미하며, 실제로 너비를 구할 때는 각 기둥들의 개수(=수평 거리)를 곱해주어야 합니다.

만약 ‘answer += maxHeight’로 코딩을 했다면 이는 단지 높이 값만 더하는 것이 되어버려, 가장 높은 기둥이 차지하는 전체 너비를 반영하지 않았기 때문에 오답이 됩니다. 높은 기둥이 여러 칸에 걸쳐 있을 수 있음을 고려하여 해당 기둥의 너비를 구하는 연산을 포함해야 정답이 됩니다. 즉, 가장 높은 기둥이 차지하는 수평 길이를 고려해서 너비를 구해야 올바른 값이 나온다는 것이죠.

라인 별로 이해가 안되시거나 추가적인 설명이 필요하시면 언제든지 문의하시기 바랍니다. 개발자 취업을 위한 여정에 행운이 가득하시길 바라며, 코딩 테스트 준비에 있어 도움이 되셨으면 좋겠습니다. 화이팅입니다!

욕망의햄버거님의 프로필 이미지
욕망의햄버거

작성한 질문수

질문하기