Algorythm/프로그래머스 스쿨 (C 언어)

[C] 프로그래머스 스쿨_2주차 문제1: 두 수의 나눗셈

gapsoo 2023. 7. 12. 23:21

 

 

 


[1] 문제

 

문제 설명

정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 soltuion 함수를 완성해주세요.

 

제한사항

  • 0 < num1 ≤ 100
  • 0 < num2 ≤ 100

 

입출력 예

num1 num2 result
3 2 1500
7 3 2333
1 16 62

 

입출력 예 설명

 

입출력 예 #1

  • num1이 3, num2가 2이므로 3 / 2 = 1.5에 1,000을 곱하면 1500이 됩니다.

 

입출력 예 #2

  • num1이 7, num2가 3이므로 7 / 3 = 2.33333...에 1,000을 곱하면 2333.3333.... 이 되며, 정수 부분은 2333입니다.

 

입출력 예 #3

  • num1이 1, num2가 16이므로 1 / 16 = 0.0625에 1,000을 곱하면 62.5가 되며, 정수 부분은 62입니다.

 

 

 


[2] 정답

 

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
int solution(int num1, int num2) {
    
    float result = (float)num1 / num2 * 1000;
    int answer = (int)result;
    
    return answer;
}
cs

 

 

 

 


[3] 해석

 

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 num1, int num2) {
    
    // num1을 num2로 나눈 결과에 1000을 곱한 값을 실수형 변수 result에 저장합니다.
    float result = (float)num1 / num2 * 1000;
    
    // result를 정수형으로 형변환하여 소수점 이하를 버리고 정수 값으로 저장합니다.
    int answer = (int)result;
    
    // 결과인 answer를 반환합니다.
    return answer;
}
cs

 

이 코드는 C 언어로 작성된 solution이라는 함수를 포함하고 있다. 이 함수는 두 개의 정수 num1과 num2를 매개변수로 받아들인다.

함수 내부에서는 다음과 같은 작업을 수행한다:

 

  1. float 형식의 변수 result를 선언하고, num1을 num2로 나눈 후에 1000을 곱한 값을 저장한다. 이 때, num1과 num2를 float로 형변환하여 정확한 나눗셈이 이루어지도록 한다.
  2. result를 int 형식으로 형변환하여 answer라는 변수에 저장한다. 이로써 answer는 소수점 이하 부분이 버려진 정수 값이 된다.
  3. answer를 반환한다.

 

이 함수는 num1을 num2로 나눈 후에 1000을 곱한 값의 정수 부분을 반환하는 기능을 가지고 있다. 

 

 

 


[4] 풀이 및 오답

 

✔️ C 언어에서 두 개의 정수를 나누면 결과는 정수로 계산된다.

 

내가 처음에 썼던 오답:

 

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
int solution(int num1, int num2) {
    float i = 0;
    i = num1/num2 * 1000;
    int answer = 0;
    answer = (int)i;
    return answer;
}
cs

 

이 코드에서 i = num1/num2 * 1000; 라인은 num1을 num2로 나눈 값을 계산하고, 그 결과에 1000을 곱하여 i 변수에 저장한다.

 

그러나 C 언어에서 두 개의 정수를 나누면 결과는 정수로 계산된다.

(나는 그 사실을 몰랐고, i를 float로 선언해주었기 때문에 정수끼리 계산한 값이어도 소수점 이하를 가지면 i에 반영이 될 것이라고 생각했다.)

따라서, num1을 num2로 나누는 경우, 결과가 소수점 이하를 가질 수 있는데, 이 부분이 잘릴 수 있다. 예를 들어, 5를 2로 나누면 결과는 2.5지만, 정수로 계산되므로 2가 된다.

 

이후 i 값을 int로 형변환하여 answer에 저장한다. 이로 인해 소수점 이하는 버려지고, 정수 부분만 남게 된다.

따라서, 이 코드에서는 소수점 이하 값을 정확히 계산하고 유지하기 어려운 문제가 있다.

 

원하는 결과를 얻기 위해서는 다음과 같이 수정할 수 있다:

 

1
2
float result = (float)num1 / num2 * 1000;
int answer = (int)result;
cs

 

위의 코드는 num1과 num2를 실수형으로 형변환하여 나눗셈 연산을 수행하고, 그 결과를 실수형 변수 result에 저장한다.

그런 다음 result를 정수형으로 형변환하여 answer에 저장한다. 이렇게 함으로써 소수점 이하 값을 정확히 계산하고 유지할 수 있다.

 

 

✔️ 나눗셈 연산자가 헷갈린다. ('/'와 '%'의 기능이 헷갈린다.)

 

 

 


[5] 추가 학습

 

C언어 연산자 부분을 공부한 내용을 티스토리에 올리면 다시 링크를 추가하겠다.

 

 

 

 


[6] 느낀 점

 

1-1 중간고사 때 연산자를 다루는 문제가 나왔는데 그 때도 틀렸던 기억이 있다. 다시 복습하게 되어서 다행이다.