략간스트,, 처음에 문제 파악(?)하는데 쬐에끔 걸렸다ㅋㅋㅋ
말 그대로 숫자를 N개대로 입력 받고, 합쳐서 M이 나오는 경우의 수를 구하는 것인데, 연속된 숫자들을 합했을 때 M이 나오는 경우의 수이다. 근데 지금 보니까 문제를 잘못 풀은 것 같다. 전부 예전에 풀었던 문제들을 다시 공부하는 차원에서 정리하는 중인데 '투 포인터'라는 개념을 사용해서 풀어야 하는 것 같다. 일단은 내가 풀었던 코드 정리 한 번하고 다음에 다시 투 포인터라는 개념을 가지고 풀어봐야겠다.
나는 그냥 배열에 때려박았숨다. >.<
문제에서는 입력받을 숫자갯수는 N, 연속된 수의 합은 M으로 지정했는데 코드에서는 num과 sum으로 선언했다.(N = num, M = sum)
그냥 차례대로 더하면서(이 숫자는 sum_에 저장) sum과 같아지면 count++해 주고 sum을 넘기면 한칸 옆으로 넘어가서(k++) 다시 숫자들을 연속적으로 합해주었다. 참 쉽죠잉...?ㅎ...
그르니께 그림으로 간단하게 설명하자면 다음과같이 k가 num-1번째까지 반복하는 것이닷,,,
코드에 설명을 주석으로 추가로 달아 놓았당
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { //num은 입력받을 숫자 갯수, sum은 연속된 숫자들의 합, arr은 입력받을 숫자들을 저장할 배열 int num, sum, *arr; scanf("%d %d", &num, &sum); //배열의 크기를 할당해 주고 배열에 숫자들을 저장해 줌 arr = (int *)malloc(num * sizeof(int)); for (int i = 0; i < num; i++) scanf("%d", &arr[i]); //k는 시작점, sum_은 연속된 숫자들의 합, count는 경우의 수 int k = 0, sum_, count = 0; //k는 배열의 마지막까지 옮겨가야함 while (k < num) { //sum_을 0으로 초기화 시킴 sum_ = 0; //인덱스k번째부터 배열의 숫자들을 더해 for (int i = k; i < num; i++) { sum_ += arr[i]; //sum과 같아지면 count++해 주고 for문을 빠져나감 if (sum_ == sum) { count++; break; } //sum보다 커지면 더 이상 더해 줄 필요가 없으므로 for문을 빠져나감 else if (sum_ > sum) break; } //시작점을 한 칸 옆으로! k++; } printf("%d", count); free(arr); return 0; } | cs |
흑... 알고리즘 공부 좀 열심히해야겠다...
'백준' 카테고리의 다른 글
백준 알고리즘 2750번 수 정렬하기 (0) | 2019.01.30 |
---|---|
백준 알고리즘 10845번 큐 (0) | 2019.01.26 |
백준 알고리즘 1011번 Fly me to the Alpha Centauri (0) | 2019.01.26 |
백준 알고리즘 9012번 괄호 (0) | 2019.01.15 |
백준 알고리즘 1991번 트리순회 (0) | 2019.01.08 |