Iriton's log

[C] 11047번: 동전 0 // C6011: NULL 포인터 ' '을(를) 역참조하고 있습니다. 본문

Problem Solving/C,C++

[C] 11047번: 동전 0 // C6011: NULL 포인터 ' '을(를) 역참조하고 있습니다.

Iriton 2023. 5. 17. 13:39

문제


준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.

동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.

 

입력


첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)

둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

 

출력


첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

 

풀이


1. 오름차순으로 주어지기 때문에 입력값을 배열에 저장한다.

2. i를 배열의 길이 즉, 배열의 맨 뒤 인덱스로 둔다.

3. K가 배열[i]보다 클 경우에만 K-배열[i]를 진행하며 count한다.

4. 작을 경우에는 i 인덱스를 1씩 줄인다.

 

초기 코드

#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS

int main(void)
{
    int answer = 0;		//count 횟수 저장
    int N, K;
    scanf_s("%d %d", &N, &K);
    int* arr = (int*)malloc(sizeof(int) * N);	//N 사이즈만큼 int형 동적 배열 생성

    for (int i = 0; i < N; i++)
        scanf_s("%d", &arr[i]);

    int idx = N - 1;		//배열 맨 끝 인덱스 지정
    while (K > 0) {		//K가 0이 됨은 값이 완성될 때를 의미

        if (arr[idx] > K)		//현재 K값보다 큰 값이라면 idx를 줄여서 작은 값으로 반복
            idx--;
        else {		//작거나 같은 값이라면 - 연산, count 증가
            K -= arr[idx];
            answer++;
        }
    }
    
    free(arr);		//배열 반환
    
    printf("%d", answer);
    
    return 0;
}

정상적으로 실행되는 코드이지만,

동적 배열 포인터가 NULL값을 가리키면 잘못된 접근으로 인해 오류가 생길 수 있으니

이를 검사하는 코드가 필요하다.

 

if ( arr )		// 또는 arr!=NULL
  {
    *arr = '\0';	//값 대입
    // code ...

    free( p );

 

최종 코드

#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS

int main(void)
{
    int answer = 0;
    int N, K;
    scanf_s("%d %d", &N, &K);
    int* arr = (int*)malloc(sizeof(int) * N);

    for (int i = 0; i < N; i++)
        scanf_s("%d", &arr[i]);

    int idx = N - 1;
    
    if (arr != NULL) { 
        *arr = '\0';

        for (int i = 0; i < N; i++)
            scanf_s("%d", &arr[i]);

        int idx = N - 1;
        while (K > 0) {

            if (arr[idx] > K)
                idx--;
            else {
                K -= arr[idx];
                answer++;
            }
        }
    }
    
    free(arr);

	printf("%d", answer);
    
    return 0;
}

오류를 감안하여 검사 코드를 추가한 최종 코드는 위와 같다.

 

Error Message: NULL 포인터 ' '을(를) 역참조하고 있습니다.

 

해당 오류 참고 자료

 

경고 C6011

Visual Studio C++ 코드 분석 경고 C6011에 대한 참조입니다.

learn.microsoft.com

 

'Problem Solving > C,C++' 카테고리의 다른 글

[C++/BOJ] 2212번: 센서  (0) 2023.05.31
[C] 9095번: 1, 2, 3 더하기  (0) 2023.05.17
[C] 1697번: 숨바꼭질  (0) 2023.05.10
[C] 4716번: 풍선  (0) 2023.05.10
[C++/Baekjoon] 2243번: 사탕상자  (0) 2023.05.03
Comments