티스토리 뷰
문제 링크 : https://www.acmicpc.net/problem/2908
문제 |
상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.
상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.
두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.
입력 |
첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.
출력 |
첫째 줄에 상수의 대답을 출력한다.
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int main(void) {
string a, b;
cin >> a >> b;
int addr = 2;
while (addr >= 0)
{
if (a[addr] == b[addr])
{
cout << a[addr--];
continue;
}
if (a[addr] > b[addr])
{
while (addr >= 0)
cout << a[addr--];
}
else
{
while (addr >= 0)
cout << b[addr--];
}
}
return 0;
}
처음에 문제 푸는 방향을 완전히 잘못 잡아서 푸는 방법을 다른 방향으로 살짝 틀어버린 문제이다. 배열을 이용해서 푼다는 아이디어는 그대로 갔으나 처음에 숫자 한 줄을 모두 배열에 저장시키는 방법을 char형을 써서 cin.getline()을 쓰다가 그냥 string 형으로 받아서 숫자를 각각 다른 변수에 저장시키는 것이 비교하기도 쉬워서 형식을 개조시켰다.
중요한 알고리즘은 a와 b라는 string형 배열에 2개의 숫자를 입력 받고 그 수를 1의 자리부터 하나씩 비교하는 것이다. 비교해서 숫자가 같다면 다음 10의 자리 수를 비교하여 어느 숫자가 더 큰 지 알아내고 숫자가 더 큰 쪽의 값을 출력해내면 된다. 여기서 핵심 포인트는 자리 수가 큰 값의 비교가 완료되면 그 아래 자리 수들은 비교할 필요가 없으므로 큰 쪽의 자리 수를 모두 출력해버리면 된다. (가령, 437과 398에서 4와 3을 비교하면 4가 더 크므로 밑에 10의 자리 수와 1의 자리 수는 비교하지 않아도 된다.)
이 알고리즘을 작성하다가 저지른 실수가 하나 더 있다면, 바로 숫자가 같을 경우를 처리하지 않은 점. 테스트 케이스로 주어진 734와 893을 넣으면 정답이 제대로 나오길래 그대로 제출했는데 '틀렸습니다!'가 떠서 당황했었다. 알고보니 숫자가 같을 경우를 처리하는 if문을 넣지 않아서 다시 집어 넣은 후에야 맞출 수 있었다.
#include <stdio.h>
#include <iostream>
using namespace std;
int reverse(int num)
{
int hundred, ten, one, result;
hundred = num / 100;
ten = (num / 10) % 10;
one = num % 10;
result = one * 100 + ten * 10 + hundred;
return result;
}
int main(void) {
int a, b;
cin >> a >> b;
int num1, num2;
num1 = reverse(a);
num2 = reverse(b);
if (num1 > num2)
{
cout << num1 << endl;
}
else
{
cout << num2 << endl;
}
return 0;
}
다른 사람들은 어떻게 풀었나 코드를 찾아보다가 나와 같이 코드를 짜신 분도 있었지만, 좀 더 개념적으로 쉬운 방법으로 문제를 푼 분도 계셨다. 위에 코드가 비교적 쉬운 개념으로 문제를 푼 코드를 보고 내가 스스로 다시 짜 본 코드이다. 배열을 사용하지 않고 각각의 숫자를 받아 역순시킨 다음 비교해서 출력하는 방식이다. 역순으로 저장시키는 함수만 제대로 작성하면 나머지는 그다지 머리 쓸 것도 없고 비교만 해서 바로 출력이 가능하다. 문제에서 서로 다른 숫자만이 입력으로 주어진다고 했기에 숫자가 같을 경우는 생각할 필요조차 없다.
'백준 알고리즘' 카테고리의 다른 글
백준 1393번 : 음하철도 구구팔 [문자열/C/C++] (0) | 2020.04.20 |
---|---|
백준 5622번 : 다이얼 [문자열/C/C++] (0) | 2020.04.18 |
백준 2941번 : 크로아티아 알파벳 [문자열/C/C++] (0) | 2020.04.15 |
백준 1152번 : 단어의 개수 [문자열/C/C++] (0) | 2020.04.10 |
백준 10996번 : 별 찍기 - 21 [실습1/C/C++] (0) | 2020.04.09 |
- Total
- Today
- Yesterday
- 웹개발
- TCP
- 컴퓨터과학
- 컴퓨터
- 백준
- It
- 코딩
- 컴퓨터 네트워크
- 컴퓨터기초
- 알고리즘 문제
- 코딩 테스트
- 백준 풀이
- 컴퓨터이론
- 컴퓨터공학
- 알고리즘
- 알파넷
- 프로그래밍
- 서블릿
- 자바
- Servlet
- java
- 컴퓨터과학과
- 인터넷
- C언어
- 코딩테스트
- C++
- 컴퓨터공학과
- jsp
- 네트워크
- 코드 리뷰
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |