이번 글에서는 백준의 2588번 문제, 곱셈에 대해서 풀이를 남겨보도록 하겠다.
방학 이후에 조금 놀다가 다시 하루에 한문제씩 풀기로 했다. 오랜만에 풀이를 남긴다.
먼저, 간단한 곱셈을 하고 출력만 하면 되는 문제이지만, (3), (4), (5) 번이 문제이다.
먼저 우리가 세로식으로 곱셈을 하는 과정이 사진으로 첨부되는데, 이걸 보고 하면 된다.
(3)번은 5와 472가 곱해진 거고, (4)는 8과 472. (5)는 3과 472가 곱해졌다.
그리고 (3)은 일의자리수, (4)는 십의 자릿수, (5)는 백의 자릿수에서 시작하도록 하고 더하면 끝이다.
나는 (3)을 우리가 직접 하는 것 처럼 5와 2를 곱하고... 5과 70을 곱하고.. 이러고 있었는데,
남들이 쓴 코드도 참고하며 공부해보니 사실 5와 472를 곱하면 되는 문제였다.
여기까지 이해 되었다면 큰 문제 없이 풀어낼 수 있을거라 생각한다.
using System;
namespace unicoti {
class Program {
static void Main(string[] args) {
string stringnum1 = Console.ReadLine()??"";
string stringnum2 = Console.ReadLine()??"";
string[] stringsnum2 = new string[3]; //3,8,5
stringsnum2 = stringnum2.Select(c => c.ToString()).ToArray() ?? Array.Empty<string>();
int[] nums2 = new int[3];
int.TryParse(stringsnum2[0], out nums2[0]);
int.TryParse(stringsnum2[1], out nums2[1]);
int.TryParse(stringsnum2[2], out nums2[2]);
int process3 = int.Parse(stringnum1) * nums2[2];
int process4 = int.Parse(stringnum1) * nums2[1];
int process5 = int.Parse(stringnum1) * nums2[0];
int process6 = int.Parse(stringnum1) * int.Parse(stringnum2);
Console.WriteLine(process3);
Console.WriteLine(process4);
Console.WriteLine(process5);
Console.WriteLine(process6);
}
}
}
우선 조금 비효율적이기도 하지만 내가 해결한 방식은 다음과 같다.
각 자릿수를 알아야 하는것은 2번째 제공된 수 이기 때문에,
2번째 수를 Select를 이용해서 한칸씩 나눈 후 배열로 저장했다.
이후 앞서 말한 방법으로 (3) (4) (5)를 계산해주고, (6)은 그냥 곱해서 계산해준다.
그리고 출력해주면 끝이다. ?, ?? 등 새로운 연산자를 알게 되어 좋은 경험이 되었다.
또한 select 메서드도 새로 알게되었다. 현재는 문제를 푸는 데 썼지만 더
자세히 공부해서 활용할 수 있도록 노력해야겠다.
참고로 ?는 null 조건부 연산자로, 객체가 null인지 판단하여 null이면 접근 불가능하게 하는 연산자이다.
다르게 말하면 null이 아니여야 작동하게 하는 연산자로 이해하면 쉽다.
또한 ??는 null 병합 연산자로, 마치 삼항연산자처럼 어떤 변수가 null인 경우에
뒤에 쓴 값이 기본값으로 저장되는 형식이다. if문으로 null을 검사해서
null인 경우 기본값을 변수에 넣는것과 마찬가지인 연산자이다.
메인 블로그에 올려도 좋을 것 같긴 한데, 너무 내용이 적어서 고민이다.
기록용 정도로는 올려도 좋을 듯 하다.
백준 2588번을 풀어봤다. 누군가에게 도움이 되길 바라며, 여러모로 많은 것을 알게 된
문제였다. 순수 코딩도 알아가는 게 많은 것 같다. 다시 예전으로 돌아갈 수 있다면
C#부터 정식으로 공부하고 시작해도 좋을 것 같다.
using System;
namespace Backjoon2588 {
class Program {
static void Main(string[] args) {
// 입력 받기
int num1 = int.Parse(Console.ReadLine());
int num2 = int.Parse(Console.ReadLine());
// 각 자리수를 곱하기
int unit = num2 % 10; // 1의 자리
int ten = (num2 / 10) % 10; // 10의 자리
int hundred = num2 / 100; // 100의 자리
Console.WriteLine(num1 * unit); // 1의 자리 곱
Console.WriteLine(num1 * ten); // 10의 자리 곱
Console.WriteLine(num1 * hundred); // 100의 자리 곱
Console.WriteLine(num1 * num2); // 최종 결과
}
}
}
더 나은 방법은 위와 같다.
나누기 연산자(%)를 사용해서 각 자릿수를 구했다. 배열로 구한 나보다 나은 것 같고,
이후 과정의 원리는 비슷하다. 확실히 코딩을 좀 하다보면 수학이 필요한 것 같다.
이상으로 도움이 되었길 바라며,
끝.
'코딩테스트 (C#)' 카테고리의 다른 글
백준 10171 : 고양이 - C# 풀이 (0) | 2024.07.31 |
---|---|
백준 11382 : 꼬마 정민 - C# 풀이 (0) | 2024.07.30 |
백준 10430 : 나머지 - C# 풀이 (1) | 2024.07.15 |
백준 18108 : 1998년생인 내가 태국에서는 2541년생? - C# 풀이 (0) | 2024.07.14 |
백준 10926 : ??! - C# 풀이 (1) | 2024.07.14 |
댓글