이번에는 함수에 배열(포인터) 대상의 인자전달에 관해 이야기를 하려고 한다. 하지만 그전에 함수에서 인자의 전달이 어떻게 되는지 먼저 짚고 그 다음으로 넘어가자. 인자 전달의 기본방식 - 복사 함수호출시 전달되는 인자의 값은 매개변수에 복사가 된다. 다음 예제를 살펴보자. #include int test_func (int num) { return num + 1; } int main () { int test = 1; int a = test_func(test); // test에 저장된 값이 num에 복사된다. } 이 코드에서 test_func함수에 test라는 값을 인자로 전달하고 있다. 언뜻보면 test변수 자체를 넘기는 것 같지만, 사실은 test에 저장된 값을 test_func의 인자인 num에 복사하..
마저 못한 정리를 시작하자. 상수형 문자열을 가르키는 포인터. 지금까지는 배열을 통해 문자열을 선언했었다. 하지만 우리는 포인터를 배우면서 배열은 상수형 포인터임을 배웠다. 그렇다면 포인터를 통해 문자열을 다룰 수 있을까? char str1[] = "string 1"; 이는 배열을 통해 선언한 문자열이다. 더 정확히 말하면 변수 형태의 문자열이다. 우리가 임의로 문자열의 일부를 수정할 수 있기 때문이다. 포인터와 배열은 상수냐 변수냐에 따라 구분되는 같은 것이라고 볼 수 있다. 그렇기에 우리는 다음처럼 쓸 수도 있다. char *str2 = "string 2"; 이렇게도 역시 가능하다. 배열과 포인터 모두 문자 s의 주소값을 나타낸다. 그럼 차이점이 무엇인가? 몇가지 차이점이 존재한다. 첫번째, 메모리상..
배열의 포인터 연산 앞의 배열에 관한 내용을 조금 복습하자면, 배열의 이름은 상수형 포인터라고 했다. 그렇다면, *연산이 가능할까? 정답은 Yes이다. 다음 예제를 살펴보자. #include int main () { int arr_i[3] = {1,2,3}; double arr_d[3] = {1.1, 2.2, 3.3}; printf("%d %g\n", *arr_i, *arr_d); *arr_i += 10; *arr_d += 120.5; printf("%d %g\n", arr_i[0], arr_d[0]); } 실행 결과 1 1.1 11 121.6 포인터의 *연산이 무리없이 작동하는 것을 알 수 있다. 포인터를 배열의 이름처럼 배열이름이 포인터이고 포인터처럼 사용할 수 있다면, 포인터를 배열처럼 사용할 수 ..
https://www.acmicpc.net/problem/15829 15829번: Hashing APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정 www.acmicpc.net 해시함수에 관한 문제, small과 large문제 합하여 모두 맞춰야 하는 문제인데 자꾸 부분정답만 나온다.... #include #define r 31 #define M 1234567891 long long pown (int a, int exp) { long long res = 1; for (int i = 0; i < exp; i++) { res *= a; } return res; } int ..
https://www.acmicpc.net/problem/11050 11050번: 이항 계수 1 첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 10, 0 ≤ \(K\) ≤ \(N\)) www.acmicpc.net 조합을 구하는 문제. 이항계수가 뭔지 까먹은 나 자신 반성하자... #include int fac (int n) { int res = 1; while (n > 1) { res *= n--; } return res; } int combination (int n, int r) { return fac(n) / (fac(r) * fac(n-r)); } int main () { int n, r; scanf("%d %d", &n, &r); printf("%d", combination..
https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들 www.acmicpc.net M개의 수가 N개의 숫자 배열에 들어있는지 찾는 문제. 중첩반복문을 쓸 때 느낌이 쎄하긴 했는데, 시간초과로 틀렸다. 근데 다른 방법이 있긴 한건가? #include int main () { int n, m; int i; int check; scanf("%d", &n); int a[n]; for (i = 0; i < n; i++) { scanf("%..
https://www.acmicpc.net/problem/10250 10250번: ACM 호텔 프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수 www.acmicpc.net 규칙을 파악하면 금방 풀리는 문제. 함정들에 조심하자. 높이 H에 너비 W, N번째 손님이 주어지는데, 사실 W의 값은 중요하지 않더라. 만약 6 12 10의 입력이 들어오면, 10번째 손님은 402호실에 들어가면 된다. 따라서 층수는 N과 H의 나머지, 호실은 N과 H의 몫 + 1인 셈이다. 이렇게만 보면 쉬운문제이지만, 함정이 있다. N과 H가 나누어 떨어지는 경우 나머지값이 0이..
https://www.acmicpc.net/problem/2231 2231번: 분해합 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 www.acmicpc.net https://codejin.tistory.com/10 백준 4673번 C언어 풀이 https://www.acmicpc.net/problem/4673 4673번: 셀프 넘버 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어.. codejin.tist..