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

__yourspring님의 프로필 이미지
__yourspring

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-G 와 테스트케이스 팁

질문이 있습니다. Array Index

작성

·

45

0

http://boj.kr/13f2050aabfb4c559d01e1ec1ca4603b

 

안녕하세요 선생님.

매번 코드를 보면 4만큼 여유를 더 주시던데 이유를 여쭤볼 수 있을까요? 막상 그만큼 여유를 안주면 틀리는 문제들도 있더라구요.

if (next < 0 || next > V)

continue;

어차피 여기서 이렇게 예외를 막는데 왜 + 4를 해줘야 문제를 pass하는지 모르겠습니다. ㅠㅠ

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 봄님 ㅎㅎ

constexpr int V = 100000;
int visited[V + 4];
long long cnt[V + 4];

이부분 말씀이신거죠? 이부분은 교안내의 다음부분을 참고해주시면 됩니다.

image.png

 

이 문제의 경우

현재 점 N(0 ≤ N ≤ 100,000)에 있고

앞의 지문처럼 10만을 참조할 수 있기 때문에 배열의 범위를 10만 + 1이상으로 잡아야 합니다.


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


__yourspring님의 프로필 이미지
__yourspring
질문자

음... 이게 오버플로우나 언더플로우 인덱싱을 방지하기 위해서 인건 알겠는데...
if (next < 0 || next > V) 어차피 이 예외에서 걸려서 해당 반복자는 접근조차 할수 없지 않나요? next가 그 다음 방문 예정인 인덱스 그러니까 여러 연산이 완료되어 이미 방문 예정인 인덱스니까 예외에 걸려서 애초에 들어갈 수도 없어서 상관없을 것 같은데...

근데 그렇다고 하기에는 뒤에 4만 지워서 100000으로 하면 또 패스가 안되더라구요.

이 부분이 도저히 상상이 가지 않습니다 ㅠㅠ

번외로 3주차 부터는 시작에 손도 못대는데 다른 학생들 질문 올라오는거 보면 자괴감이 들어서 너무 힘드네요. 어떻게 헤쳐나가면 될까요?

큰돌님의 프로필 이미지
큰돌
지식공유자

constexpr int V = 100000;
int visited[V + 1];
long long cnt[V + 1];

이렇게 10만 + 1로 하시면 됩니다.

예를 들어 숫자 1을 인덱스로 참조하려면 배열의 크기는 2가 필요합니다. int a[2]를 설정하고 -> 0, 1인덱스가 참조가 가능한 것이죠.

이런 것을 생각하시면 됩니다.

 

번외로 3주차 부터는 시작에 손도 못대는데 다른 학생들 질문 올라오는거 보면 자괴감이 들어서 너무 힘드네요. 어떻게 헤쳐나가면 될까요?

>> 제가 요새 봄님 코드를 많이 보고 있는데요. ㅎㅎ 잘하고 계십니다. 제가 가르쳐본 수강생 기준 평타이상이니 걱정하지 마세요. 처음에는 손도 못대다가 손 잘되게 되실겁니다. 지나가는 과정이라고 생각하시면 됩니다.

 

감사합니다.

 

 

__yourspring님의 프로필 이미지
__yourspring
질문자

소중하신 답변에도 이해를 못하는 제 머리가 죄송합니다 ㅠㅠ
예를 들어 int Array[10] 이었을 경우 참조가능한 인덱스는 0 ~ 9까지인데 만약 10은 오버플로우가 나니 V < 10 이렇게 예외처리를 한거까지는 이해가 갑니당.
근데 어차피 V가 < 10 보다 작을 때에만 로직이 돌아가도록 예외를 넣었는데도 10 + 1이 왜 들어가야 하는지 모르겠어서 여쭤본거에용 CurrentIndex가 9였을 경우 Next = Current + 1
if (Next < V) 어차피 이렇게 막혀서 실제로 Next가 접근 또는 비교하기 위한 Array[Next]가 실행되는 코드는 if문 밑에 있을텐데 배열은 왜 [10 + 1]로 해야하는가 입니다.

질문이 많아서 죄송해요 ㅜㅜ 언제나 감사합니다.
아 알고리즘 문제해설이 해설코드였군요! 감사합니다

큰돌님의 프로필 이미지
큰돌
지식공유자

			if (next < 0 || next > V)

안녕하세요 ㅎㅎ

이 로직은 V가 10만이면 10만 + 1일 때 continue입니다.

즉, 인덱스 - 10만 참조는 continue가 안되고 아래로 들어가게 됩니다. 10만 인덱스 참조는 배열 크기 10만 + 1 이 필요합니다.

 

감사합니다.

__yourspring님의 프로필 이미지
__yourspring

작성한 질문수

질문하기