https://www.acmicpc.net/problem/1008
문제는 이렇다. 두 수 A, B를 입력받아 나눠주기만 하면 되는 것으로 보일 수 있겠으나,
한 가지 조건이 있는데, 상대오차 범위가 10의 -9승 이하여야 한다는 것이다.
https://unicoti-sub.tistory.com/5
Baekjoon No. 1000, 1001, 10098 - C# 풀이
(1001번, 10998번은 +를 각각 -, * 로 바꾸면 되기에 생략한다) 원래 유니티 개발자로 활동하여 코딩 테스트는 해본 적 없었는데 이번에 C# 기본 구조도 파악해야좀 더 나은 개발자가 될 것 같아 코딩
unicoti-sub.tistory.com
이 글에서 더하기와 빼기, 곱하기는 같은 맥락에서 기호만 바꿔 성공했는데,
나누기의 경우는 조금 다르다. 코드로 설명하겠다.
using System;
namespace unicoti
{
class Program
{
static void Main(string[] args)
{
string input = Console.ReadLine(); //"1 2"
string[] nums = input.Split(" "); //["1", "2"]
Console.WriteLine(double.Parse(nums[0]) / double.Parse(nums[1]));
}
}
}
위의 글과 거의 같은 코드이지만 한 줄만 바뀌어 있을 것이다.
Console.WriteLine(double.Parse(nums[0]) / double.Parse(nums[1]));
이 부분인데, 원래는 int.Parse였고 int를 double로 바꿔주야만 정답이 인정된다.
가장 먼저 int.Parse를 쓰면 안 되는 이유는 둘 다 정수형 데이터라서 나누기를 해도 정수형으로 나온다.
예를 들면 1/3은 0.333인데, 정수로 나와야 하기에 가장 가까운 정수인 0을 출력하게 된다.
따라서 "실수" 형으로 바꿔줘야 나누기가 정상적으로 작동하는데, 이건 float.Parse를 이용하면 된다.
하지만 float는 소수점 이하 7자리까지 저장가능하고, 이건 문제의 조건인 10의 -9승 이하의 오차범위를 만족 못한다.
따라서 더 많은 소수점을 저장할 수 있는 타입을 찾아야 하는데, 그래서 사용된 타입이 double이다.
double은 16자리까지 표현 가능하여 문제의 조건을 만족시킬 수 있게 되는 것이다.
물론 실제 프로젝트에서는 double이 메모리를 2배 가까이 먹어서 엄청 정확해야 하는 거 아니면
float를 쓰는 것이 이상적이기는 하나 int형 두 개를 나누는 실수는 범하지 말자.
오늘의 느낀 점)
정수형 데이터 2개를 나누려는 잘못된 시도는 내가 코딩을 처음 시작할 때도 겪었었던 오류이며
메인 블로그에도 남겨놨었고, 오류 기록 메모장에도 남겨놨었던, 그런 많이 겪었던 문제라
꽤 빠르게 문제를 인식하고 해결할 수 있었던 것 같다.
구글에서 답을 찾아볼까도 고민했지만 조금 참고 직접 답을 찾아내서 기쁘며,
글의 형식도 조금씩 찾아가는 것 같아 좋다. 하루에 하나 이상씩 푸는 것을 목표로 하고 있는데,
유니티 코딩 말고 순수 C# 코딩을 하면서 배우는 점도 많은 것 같다.
앞으로 가져가는 지식이 더 많아지길.
이상으로 도움이 되었길 바라며,
끝.
'코딩테스트 (C#)' 카테고리의 다른 글
백준 1004 : 어린 왕자 - C# 풀이 (0) | 2024.07.12 |
---|---|
백준 1003 : 피보나치 함수 - C# 풀이 (0) | 2024.07.09 |
백준 1002 : 터렛 - C# 풀이 (0) | 2024.07.09 |
백준 1000 : A+B, 1001 : A-B, 10098 : AxB - C# 풀이 (0) | 2024.07.08 |
C#의 기본 구조 완전히 이해하기 (0) | 2024.07.07 |
댓글