SWLUG/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 슀쿨 (C)

[C] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 슀쿨_7μ£Όμ°¨ 문제 2: μ•„μ΄μŠ€ 아메리카노

waterproof 2023. 8. 20. 09:32

 

 

 


문제 μ„€λͺ…

λ¨Έμ“±μ΄λŠ” μΆ”μš΄ λ‚ μ—λ„ μ•„μ΄μŠ€ μ•„λ©”λ¦¬μΉ΄λ…Έλ§Œ λ§ˆμ‹­λ‹ˆλ‹€. μ•„μ΄μŠ€ μ•„λ©”λ¦¬μΉ΄λ…ΈλŠ” ν•œμž”에 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] λŠλ‚€ 점

 

κ°œλ…μ„ 꼼꼼히 곡뢀해야 κ² λ‹€!