강의

멘토링

커뮤니티

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

작성자 없음

작성자 정보가 삭제된 글입니다.

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

2-J

2차원 배열 fill 초기화 질문드려요~

작성

·

401

0

안농하세요 선샌님~❣

무식하지만 확실한 이중 for문으로만 2차원 배열 초기화를 하다가 이번에 새로운 방법으로 초기화해보고 싶어서 fill을 사용해보았습니당.

 

교안 39페이지 2차원 배열 초기화 부분을 참고해서 2-J번 문제를 풀어보려고 했는데

초기화하는 방법을 제가 잘못 이해한 것 같아서 질문 드리고자 합니다.

교안.PNG

먼저 제가 처음 교안을 보고 이해한 방법대로 fill 함수를 사용해본 코드는 다음과 같습니다.

// 수정 전 코드
fill(&result[0][0], &result[0][0] + H * W , -1);

두번째 인수 값으로 &배열[0][0]에 세로 * 가로를 더해주면 되는구나!로 이해를 했는데 의도했던 결과가 안 나왔습니다..ㅜㅜ

 

다시 fill 함수 부분을 제 마음대로 수정해서 제출했을 때는 맞았습니다! 라고 나왔지만.. 아니 이게 왜 돼?.. 이렇게 쓰는건가?... 싶은 의혹이 들어서 확인차 찾아오게 되었습니다.

// 수정한 코드
fill(&result[0][0], &result[H][W], -1);

교안을 보고 이해한 코드와는 사뭇 달라서 fill 함수의 올바른 초기화 사용 방법을 여쭤보고자 질문드립니다!

 

2-J번 풀이 전체 코드입니다.

#include <bits/stdc++.h>
using namespace std; 

int H, W;
char arr[104][104];
int result[104][104];

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	scanf("%d %d", &H, &W);
	fill(&result[0][0], &result[H][W], -1);
	
//	for(int i = 0; i < H; i++){
//		for(int j = 0; j < W; j++){
//			result[i][j] = -1;
//		}
//	}
	
	for(int i = 0; i < H; i++){
		for(int j = 0; j < W; j++){
			scanf(" %c", &arr[i][j]);
			if(arr[i][j] == 'c'){
				result[i][j] = 0;
			}
		}
	}
	
	for(int i = 0; i < H; i++){
		int cnt = 1;
		bool isCloud = 0;
		for(int j = 0; j < W ; j++){
			if(isCloud && arr[i][j] != 'c') result[i][j] = cnt++;
			if(arr[i][j] == 'c'){
				isCloud = 1;	
				cnt = 1;
			}
		}
	}
	
	for(int i = 0; i < H; i++){
		for(int j = 0; j < W; j++){
			printf("%d ", result[i][j]);
		}
		printf("\n");
	}
	
  return 0;    
}

답변 1

1

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

fill은 전체를 초기화 해야 합니다. 자 만약 10 * 10짜리 배열에서 5, 5 가입력으로 들어와요.

여기서 fill을 이용해 5 * 5까지만 초기화를 하면

0으로 초기화한다고 해볼게요

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0

이렇게 초기화가 되어버립니다. 내가 생각한 5 * 5 부분만 초기화를 하는 것과는 다른셈이죠.

그렇기 때문에 104 104로 했다면 104 * 104까지 초기화를 시켜주어야 해요.

감사합니다.

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

또한 해당 부분에 관한 교안을 수정했습니다. 참고해주세요~

이해했습니다! 감사합니다 ㅎㅎㅎ

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기