문제 설명
머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. 아이스 아메리카노는 한잔에 5,500원입니다. 머쓱이가 가지고 있는 돈 money가 매개변수로 주어질 때, 머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 남는 돈을 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
0 < money ≤ 1,000,000
입출력 예
money | result |
5,500 | [1, 0] |
15,000 | [2, 4000] |
입출력 예 설명
입출력 예 #1
- 5,500원은 아이스 아메리카노 한 잔을 살 수 있고 잔돈은 0원입니다.
입출력 예 #2
- 15,000원은 아이스 아메리카노 두 잔을 살 수 있고 잔돈은 4,000원입니다.
[2] 정답 및 해석
#.1 정답 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> #include <stdbool.h> #include <stdlib.h> int* solution(int money) { int* answer = (int*)malloc(2 * sizeof(int)); // 정수 두 개를 담을 메모리 공간 할당 int cups = money / 5500; // 아메리카노 한 잔의 가격은 5500원 int remaining_money = money - cups * 5500; // 남은 돈 계산 answer[0] = cups; // 최대 아메리카노 잔 수를 배열의 첫 번째 요소에 저장 answer[1] = remaining_money; // 남은 돈을 배열의 두 번째 요소에 저장 return answer; // 결과를 배열로 저장한 뒤 반환 } | cs |
#.2 해석
1. #include 문:
이 코드는 표준 입출력 및 동적 메모리 할당을 위해 필요한 헤더 파일들을 포함하고 있다.
2. int* solution(int money):
solution 함수는 정수형 포인터를 반환하는 함수이다. 즉, 결과는 정수 값을 배열로 담아서 반환하게 된다.
함수의 인자로는 돈을 나타내는 정수 money가 전달된다.
3. int* answer = (int*)malloc(2 * sizeof(int));:
결과를 저장할 배열 answer를 동적 할당하여 생성한다. 이 배열은 두 개의 정수 값을 담을 수 있도록 할당된다.
malloc 함수는 메모리를 할당하는 함수인데, (int*)은 할당된 메모리를 정수 포인터로 캐스팅하라는 의미이다.
2 * sizeof(int)는 두 개의 정수가 들어갈만한 메모리 공간을 할당하라는 의미이다.
4. int cups = money / 5500;:
아메리카노 한 잔의 가격은 5500원이다. 따라서 입력된 돈 money를 5500으로 나누면 구매할 수 있는 아메리카노의 잔 수인 cups가 계산된다.
5. int remaining_money = money - cups * 5500;:
구매한 아메리카노의 잔 수에 따라 남는 돈을 계산한다. 아메리카노 한 잔당 5500원을 지불한 금액을 cups 잔 수만큼 빼주면 남은 돈이 계산된다.
6. answer[0] = cups;와 answer[1] = remaining_money;:
계산된 아메리카노 잔 수 cups를 배열 answer의 첫 번째 요소에 저장하고, 남은 돈 remaining_money를 배열 answer의 두 번째 요소에 저장한다.
7. return answer;:
결과를 배열로 저장한 뒤, 동적 할당된 배열의 포인터인 answer를 반환한다. 이렇게 함수 호출자에게 결과를 전달할 수 있다.
[3] 추가 학습
✏️ https://exponent.tistory.com/88
[C] Study: 동적 메모리 - (1) 동적 할당 메모리란?
(1) 동적 할당 메모리란? • 프로그램이 메모리를 할당받는 방법에는 정적(static)과 동적(dynamic)의 두 가지 방법이 있다. • 정적 메모리 할당: 프로그램이 시작되기 전에 미리 정해진 크기의 메모
exponent.tistory.com
✏️ https://exponent.tistory.com/89
[C] Study: 동적 메모리 - (2) malloc()과 free()
(2) malloc()과 free() • 동적 메모리 할당 절차에 대해 알아보자. • 동적 메모리 할당은 도서관에서 책을 빌리는 절차와 비슷하다. 도서관에서는 필요한 책을 신청하고 책이 준비되면 받아오는 단
exponent.tistory.com
✏️ 그런데 free()를 사용하지 않았는데 정답으로 인정이 되었다... 나는 free()를 꼭 써줘야 하는 걸로 알고 있었기 때문에 헷갈려서 더 알아보았다. Chat GPT 를 사용하여 알아보았다.
주어진 코드에는 큰 문제가 없어 보입니다. 그러나 몇 가지 주의해야 할 점이 있습니다. 아래에서 하나씩 설명하겠습니다.
1. 메모리 할당 후 해제: 코드에서 answer 배열을 동적으로 할당한 뒤에 반환하고 있는데, 이 배열을 사용한 후에는 메모리를 해제해야 합니다. 메모리 누수를 방지하기 위해, 이 함수를 사용한 후에 free(answer);를 호출하여 할당한 메모리를 해제하는 것이 좋습니다.
2.메모리 할당 실패 체크: malloc 함수는 메모리 할당에 실패할 경우 NULL을 반환합니다. 이 코드에서는 메모리 할당 실패 시에 대한 처리가 없으므로, 메모리 할당이 제대로 이루어졌는지 체크하는 것이 좋습니다.
그렇다고 한다.
전에 '동적 메모리', '파일 입출력' 개념을 활용해서 도서 목록 관리 프로그램을 만들었던 적이 있었는데, 그 때도 메모리 누수 때문에 계속 오류가 발생했었다.
중요한 개념이니 꼭 기억하도록 하자!
[4] 느낀 점
개념을 꼼꼼히 공부해야 겠다!
'Algorythm > 프로그래머스 스쿨 (C 언어)' 카테고리의 다른 글
[C] 프로그래머스 스쿨_7주차 문제 1: 배열 원소의 길이 (0) | 2023.08.20 |
---|---|
[C] 프로그래머스 스쿨_7주차 문제 3: 삼각형의 완성 조건 (1) (0) | 2023.08.20 |
[C] 프로그래머스 스쿨_6주차 문제 3: 중앙값 구하기 (0) | 2023.08.11 |
[C] 프로그래머스 스쿨_6주차 문제 2: 중복된 숫자 개수 (0) | 2023.08.11 |
[C] 프로그래머스 스쿨_6주차 문제 1: 피자 나눠 먹기 (2) (0) | 2023.08.10 |