
[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를 매개변수로 받아들인다.
함수 내부에서는 다음과 같은 작업을 수행한다:
- float 형식의 변수 result를 선언하고, num1을 num2로 나눈 후에 1000을 곱한 값을 저장한다. 이 때, num1과 num2를 float로 형변환하여 정확한 나눗셈이 이루어지도록 한다.
- result를 int 형식으로 형변환하여 answer라는 변수에 저장한다. 이로써 answer는 소수점 이하 부분이 버려진 정수 값이 된다.
- 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 중간고사 때 연산자를 다루는 문제가 나왔는데 그 때도 틀렸던 기억이 있다. 다시 복습하게 되어서 다행이다.
'Algorythm > 프로그래머스 스쿨 (C 언어)' 카테고리의 다른 글
[C] 프로그래머스 스쿨_2주차 문제3: 나머지 구하기 (2) | 2023.07.13 |
---|---|
[C] 프로그래머스 스쿨_2주차 문제2: 몫 구하기 (3) | 2023.07.13 |
[C] 프로그래머스 스쿨_1주차 문제4: 두 수의 곱 (0) | 2023.07.08 |
[C] 프로그래머스 스쿨_1주차 문제3: 두 수의 차 (0) | 2023.07.08 |
[C] 프로그래머스 스쿨_1주차 문제2: 두 수의 합 (0) | 2023.07.08 |