강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của freejia
freejia

câu hỏi đã được viết

Nhập môn giải bài toán bằng thuật toán cho việc làm CNTT (với C/C++): Luyện thi viết mã

9. Số chia của tất cả (thời gian giới hạn 1 giây)

전역변수 지역변수 차이때문에 질문 드립니다.

Viết

·

670

6

안녕하세요 선생님.

int cnt 배열이 지역변수로 main() 안에 있으면, 채점할 때 5개중에 4개만 통과되더라구요.  (아래 코드 처럼요.)

선생님 코드처럼 int cnt 배열이 전역변수로 main() 밖에 위치해야만 하는 이유를 알고 싶습니다. 

감사합니다.

#include <stdio.h> 

// 9. 모두의 약수 (제한시간 1초) 

int main(int argc, char** argv) {
	
	//freopen("input.txt", "rt", stdin);
	int input=0, i=0, j=0;
	int cnt[50001];
	
	scanf("%d", &input);
	
	for(i=1; i<=input; i++){
		for(j=i; j<=input; j=j+i){
			cnt[j]++;
		}
	}
	
	for(i=1; i<=input; i++){
		printf("%d ", cnt[i]);
	} 

	return 0;
}

C++코테 준비 같이 해요!

Câu trả lời 3

9

codingcamp님의 프로필 이미지
codingcamp
Người chia sẻ kiến thức

배열선언에서 지역변수와 전역변수의 차이는 대략 2가지 정도입니다.

1. 배열을 전역으로 선언하면 기본값이 0으로 초기화 됩니다. 하지만 지역변수는 0으로 초기화 된다는 보장이 없습니다. 지역변수로 선언할 때 0으로 확실이 초기화 하고 싶으면 int cnt[50001]={0, } 이렇게 선언하면 됩니다.

2. 지역변수로 선언하면 메모리의 스택영역에 할당됩니다. 스택은 메모리가 작아 크기가 큰 배열을 선언하기에는 적당치 않습니다. 전역변수는 메모리 데어터 역영에 할당되며, 크기가 큰 배열을 선언해도 문제없이 할당이 됩니다. 즉 문제풀이 코드에서는 10만 이상 크기의 배열은 전역으로 선언하는게 좋습니다.

위 코드의 문제는 지역변수로 선언해서 0으로 초기화가 되지 않아서 생기는 에러같습니다.

22번 문제와 24번 문제에서 벡터를 사용해 배열을 동적으로 선언하는 것을 배웁니다. 벡터을 사용하는게 제일 좋습니다.

0

날카로운 질문에 감탄하고 갑니다.

0

jarchive님의 프로필 이미지
jarchive
Người đặt câu hỏi

자세한 답변 감사합니다 선생님!!

Hình ảnh hồ sơ của freejia
freejia

câu hỏi đã được viết

Đặt câu hỏi