[BAEKJOON - C++] 2908번 : 상수

정다은·2023년 7월 4일
0

BAEKJOON

목록 보기
48/54
C++ 배우기 (101~150) 이 문제집을 참고하여 문제를 풀었습니다.

2023년 1월 ~ 2월에 프로그래밍을 공부하기 위해 풀었던 문제들이다.

🍑문제

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.
상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.

출력
첫째 줄에 상수의 대답을 출력한다.

🍑대략적인 틀

  • 첫째줄에 두 수가 주어진다(0포함된수가 아님, 무조건 세자리수)
    • 어떻게 입력받은 숫자의 자릿숫자에 맞추어 수를 분리 할것인가?
    • 이 아이디어는 결국 구글링을 통해 해결 → 글자수 만큼의 정수 배열과 scanf을 이용한.
    • scanf("%1d",&a[i]); 를 통해서 공백 없이 연결되어 입력된 수라고 해도 한글자씩 끊어서 배열에 넣어준다.
  • 거꾸로 읽은 것으로 수를 바꾸어준다
  • 그 중에 큰 수를 출력한다

🍑오류 해결

int a = (100 * a[0]) + (10 * a[1]) + a[2];
int b = (100 * b[0]) + (10 * b[1]) + b[2];

이 코드에서 C2040 오류가 났다. 그냥 intint 배열의 형식이 다르다는 소리 같은데 평소에 변수 = 배열의 원소 이렇게 할당하는것은 괜찮았던것을 고려하면, 곱하고 더하는등의 산술이 곤란한 것 같았다. 두 형식이 달라서 일어난 일이니 그냥 a, b 변수를 a, b 배열의 한 인덱스에 값을 계산하여 업데이트 하는 형식으로 코드를 바꾸었다.

a[0] = (100 * a[0]) + (10 * a[1]) + a[2];
b[0] = (100 * b[0]) + (10 * b[1]) + b[2];

🍑 작성한 코드

// 상수

#include <iostream>
using namespace std;

int main() {
	int a[3] = {}, b[3] = {}, temp;

	for (int i = 0; i < 3; i++)
		scanf("%1d", &a[i]);

	for (int i = 0; i < 3; i++)
		scanf("%1d", &b[i]);

	temp = a[0];
	a[0] = a[2];
	a[2] = temp;

	temp = b[0];
	b[0] = b[2];
	b[2] = temp;

	a[0] = (100 * a[0]) + (10 * a[1]) + a[2];
	b[0] = (100 * b[0]) + (10 * b[1]) + b[2];

	if (a[0] > b[0])
		cout << a[0];
	else
		cout << b[0];
}

그 당시 풀고나서 다른 사람의 코드를 봤을 때, 이건 너무 좋아서 기억하고 싶다고 생각한 코드가 있었다. 그 코드에서는 굳이 복잡하게 수를 반대로 뒤집은 다음 비교하여 과정을 거치지 않고, 숫자를 입력받은 직후에 바로 비교 후 큰 수를 골라내 반대로 출력했다.
코드보러가기

profile
보안 공부하는 대학교 3학년 / 시리즈에서 더욱 편하게 글을 찾아보실 수 있습니다:)

0개의 댓글