170803 - Week 6
Week 6
1. 색종이(넓이)
- 도화지를 2차원 배열(0으로 초기화)로 생각할 수 있고, 색종이를 붙인다는 건
그 도화지에 1을 채우는 것으로 생각할 수 있다.
- 결국 1의 갯수가 색종이가 붙여진 곳의 넓이..!!
2. 색종이2(둘레)
- 000
010
000 에서 1은 1x1 크기의 색종이, 이 색종이의 둘레는 4
- 000
010
000
010
000 에서 도화지에 붙인 색종이의 둘레는 8.
- 즉 1의 상하좌우에 있는 0의 갯수가 둘레가 됨..!!
for(i=0; i<100; i++) {
for(j=0; j<100; j++) {
if(dowhaji[i][j] == 1) {
if(dowhaji[i-1][j] == 0) cnt++; // 상
if(dowhaji[i+1][j] == 0) cnt++; // 하
if(dowhaji[i][j-1] == 0) cnt++; // 좌
if(dowhaji[i][j+1] == 0) cnt++; // 우
}
}
}
3. 통계학 문제
- 빈도수관련 하여 배열을 이용하여 카운트 할 수 있는데,
이 문제에서 값의 범위는 절대값이 4000 이하.
즉 -4000 ~ 4000 까지의 값이 들어오게 되는데,
이 값을 0 ~ 8000 으로 매핑해서 빈도수를 체크할 수 있음.
즉 scanf("%d", &k); cnt[k]++; 이런식으로 가능
- 반올림의 경우 0.5를 더한 후 버림을 하면 구할 수 있음.
4. 동적할당
- #include <stdlib.h> 헤더파일 선언 필요
- 배열의 크기를 그때그때 다르게 하고 싶을때..?
int main() {
…
f(n);
…
}
void f(int n)
{
int arr[n]; // 컴파일 에러 발생
}
int *arr = (int*)malloc(sizeof(int)*n);
>> malloc() 은 주소를 반환. int*로 캐스팅을 하는 이유는
포인터 연산(배열의 인덱싱)을 할 때 자료형의 크기(여기서는 int)만큼
계산되기 위해..
위의 경우 sizeof(int) = 4Bytes * n 크기의 공간이 생성되고,
그 공간의 시작주소를 반환하게 되며 arr에 그 시작주소가 저장됨.
(int*)으로 캐스팅하여 arr[0] ~ arr[n-1]까지 배열처럼 사용가능.
동적할당은 힙 이라는 메모리 영역이 할당되어,
free(arr); 이라는 명령어를 통해 해당 메모리를 따로 해제시켜줘야함.
#include <stdio.h>
char* getName();
int main()
{
char *name;
name = getName();
printf("%s\n", name);
return 0;
}
char* getName()
{
char name[30];
scanf("%s",name);
return name;
}
>> 위 문장은 에러발생. 에러메세지 확인해보기.
>> getName() 의 name은 지역변수..!!
>> 지역변수는 함수가 소멸되면 같이 소멸됨
>> 동적할당으로 해결 가능
'Tutoring > 17-1 C Lang (Summer)' 카테고리의 다른 글
170727 - Week 5 (0) | 2018.02.21 |
---|---|
170720 - Week 4 (0) | 2018.02.21 |
170706 - Week 2 (0) | 2018.02.21 |
170629 - Week 1 (0) | 2018.02.21 |