티스토리 뷰
문제
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.
(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.
출력
첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.
예제 입력
472
385
예제 출력
2360
3776
1416
181720
출처: Olympiad > 한국정보올림피아드 > 한국정보올림피아드시․도지역본선 > 지역본선 2005 > 초등부 2번
해설
사칙 연산 문제에서 언급했던 나머지 연산의 활용법에 대한 아이디어를 얻을 수 있는 문제이다. 그리고 scanf()
함수를 사용할 때 유의해야 할 점도 아울러 살펴보도록 하겠다.
먼저 첫 번째 정수(472)와 두 번째 정수의 각 자리 유효 숫자(3, 8, 5)와의 곱을 각각 출력해야 합니다. 마지막으로 두 정수의 곱셈 결과를 출력해야 합니다. 그렇다면 두 번째 정수에서 각 자리의 유효 숫자를 어떻게 구해야 할까? 두 번째는 문자열로 받아서 각 배열에 들어있는 문자를 숫자로 변환하는 방법? 배보다 배꼽이 큰 격이겠다. 정말 코딩계의 '견문발검'이 아닐까. 이전 문제에서 알아봤던 연산자를 적절히 이용하면 원하는 값을 간단히 얻을 수 있다. 자, 고민의 시간….
먼저 백의 자리의 숫자는 두 번째 정수를 100으로 나눈 몫을 구하면 된다(second_num / 100)). 그렇다면 십의 자리의 숫자는 어떻게 구할 수 있을까? 먼저 백의 자리를 없애기 위해서 두 번째 정수를 100으로 나눈 나머지를 구하고 이 나머지를 다시 10으로 나눈 몫을 구하면 된다((second_num % 100) / 10). 마지막으로 일의 자리의 숫자는 두 번째 정수를 10으로 나눈 나머지를 구하면 된다(second_num% 10). 이렇게 각 자리의 유효 숫자를 구하면 나머지는 일사천리다. 젓 번째 정수에 각 자리의 숫자를 곱해 각각 출력한 다믄 첫 번째 정수와 두 번째 정수의 곱을 출력하면 끝이다.
c에서 scanf() 함수를 사용할 때 주의할 부분은 표준 입력(키보드)으로 받은 문자열은 버퍼에 들어가게 되고 scanf()는 이 버퍼에서 값을 가져온다는 점이다. 첫 번째 정수 입력 시 버퍼에는 프로그램에 전달하기 위해 정수 외에 enter까지 저장되게 된다. 첫 번째 scanf()가 첫 번째 정수를 가져온 다음 버퍼가 비어 있다면 문제가 생기지 않는데 무엇(enter)이 남아 있게 된다. 버퍼의 상황이 이러하면 다음 scanf()는 다음 입력값(두 번째 정수)를 가져오는 것이 아니라 남은 무엇을 먼저 가져오게 된다. 즉 두 번째 scanf()는 두 번째 정수를 받아오지 못하고 enter를 받아오게 되는 문제가 발생한다. 따라서 이 enter를 적절하게 처리하지 않으면 두 개의 정수를 scanf()로 원하는 변수에 대입하지 못하게 된다. 아래의 코드에서는 char형 변수 trash를 선언하여 첫 번째 scanf()의 수행 이후 버퍼에 남아 있는 enter값을 받아 버리는 작업을 수행하게 된다. 이렇게 해서 두 번째 scanf() 함수가 적절히 동작할 수 있는 환경을 만들어 준 것이다. 물론 이 외에도 오버플로우 등 여러 단점이 있는 scanf()를 굳이 써야 할 필요가 있을까 싶겠다. 물론이다, 앞으로 당신이 개발할 프로그램에서는 되도록 쓰지 않도록 하고, 피치 못해 쓴다면 해당 문제점을 적절하게 보완할 코드를 함께 넣어 두어야 할 것이다. 핵심은 여기에 있는 것이다.
2019/12/11 - [Python/심사문제] - 백준(BAEKJOON): 사칙연산(10869번)
소스코드: c
#include <stdio.h>
int main()
{
int first_num, second_num;
char trash;
scanf("%d", &first_num);
scanf("%c", &trash);
scanf("%d", &second_num);
printf("%d\n", first_num * (second_num% 10));
printf("%d\n", first_num * ((second_num % 100) / 10));
printf("%d\n", first_num * (second_num / 100));
printf("%d\n", first_num * second_num);
return 0;
}
소스코드: python3
first_num, second_num = map(int, input().split())
print(first_num * (second_num% 10));
print(first_num * ((second_num % 100) / 10));
print(first_num * (second_num / 100));
print(first_num * second_num);
'Python > 심사문제' 카테고리의 다른 글
백준(BAEKJOON): 세 수, 두 번째로 큰 수 출력하기(10817번) (0) | 2019.12.12 |
---|---|
백준(BAEKJOON): 윤년 확인하기(2753번) (0) | 2019.12.12 |
백준(BAEKJOON): 사칙연산(10869번) (0) | 2019.12.11 |
백준(BAEKJOON): 등록(7287번) (0) | 2019.12.11 |
백준(BAEKJOON): 고양이(10171번) (0) | 2019.12.11 |
- Total
- Today
- Yesterday
- BOJ
- Python
- 북한말
- Tistory
- QGridLayout
- 리규찬
- QLabel
- NK
- 리찬규
- QComboBox
- PyQt5
- words
- C
- books
- baekjoon
- tips
- python3
- QtDesigner
- locallibrary
- 어원
- django
- 소수
- Mac
- 유래
- word
- judge
- MacOS
- 백준
- QLineEdit
- setText()
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |