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

워니님의 프로필 이미지
워니

작성한 질문수

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

2-S

2-S 1325번 효율적인 해킹 문제 질문

작성

·

284

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

http://boj.kr/d5dbeef9edfd46d4b6ca8eda86668fcd

문제는 해결했는데 궁금한 점이 생겨 질문 드립니다.

  1. 23번째 줄에서 배열 초기화 할 때 fill함수가 아닌 memset함수를 사용해야 하는 이유가 궁금합니다.

  2. fill함수를 쓰면 출력 결과가 안 나오는데 어떤 문제 때문에 그런건지 궁금합니다. 코드에 문제가 있는 건가요?

    -> fill(&visited[0], &visited[0]+10001*10001, 0);

 

 

답변 2

1

1차원 배열인데, fill(&visited[0], &visited[0]+10001*10001, 0);

10001*10001 이 아니라 10001 이 되야할 것 같습니다.

0

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

안녕하세요 워니님 ㅎㅎ

KIM님이 설명을 잘해주셨는데요. ㅎㅎ

첨언하자면 다음과 같아요.

일단 fill, memset 둘 다 비슷합니다. 다만, memset의 경우 0, -1이란 값으로 초기화 할 때만 사용할 수 있고 fill은 모든 값이 가능하니 해당부분 참고해서 써주시면 되구요.

교안을 잠시 볼까요?

fill()은 O(n)의 시간복잡도를 가지며 fill(시작값, 끝값, 초기화하는값)로 값을 초기화합니다. 모든 값을 기반으로 초기화가 가능합니다. 

void fill (ForwardIterator first, ForwardIterator last, const T& val);

 

자, 시작값과 끝값이 들어가죠?

워니님이 선언하신 이 배열이요.

int n, m, a, b, visited[10001], mx,dp[10001];

visited의 끝값은 얼마일까요?

visited[10000]이 아닐까요?

여기서 fill의 두번째 인자는 "포함하지않는" 끝값이기 때문에 visited[10001]을 넣습니다. 그렇게 해서 visited[10001] 이전인 visited[10000]까지 초기화를 되게 만드는 것이죠.

	for (int i = 1; i <= n; i++) {
		fill(&visited[0], &visited[10001], 0); 

즉 앞의 코드와 같이 하시면 되구요. 또

	for (int i = 1; i <= n; i++) {
		fill(visited, visited + 10001, 0); 

이렇게도 가능하니 참고해주세요. ㅎㅎ

또한 fill 부분 설명이 교안 내에 좀 헷갈리게 설명되어있는 것같은데 해당 부분은 업데이트하도록 하겠습니다.

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

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

감사합니다.

강사 큰돌 올림.

워니님의 프로필 이미지
워니

작성한 질문수

질문하기