[백준] 2588 , 곱셈 출력

YUN·2025년 9월 3일

C++

목록 보기
8/84

곱셈 과정과 결과를 출력하는 문제이다.

중요한것은 472는 고정이고 우리가 인덱스 뽑아와서 쓰는거는 385 뿐이다.
그래서 472는 맘편히 int로 받아도된다.

풀이 방법은 3가지가있다.

(1) C 스타일 -> char 배열 + stdlib.h 헤더의 atoi(배열)
(2) C++ 스타일 -> string 헤더의 string 클래스 + string 헤더의 stoi(string)
(3) 전부 int로 받아서 수학적으로 풀기

위의 3가지 방법으로 각각 풀어볼 것이다.

1. C 스타일 -> char 배열 + stdlib.h 헤더의 atoi(배열)

엄청 많이 틀렸다.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int a;
    char b[4];
    
    scanf("%d", &a);
    scanf("%s", b);
    
    printf("%d\n", a*(b[2]-'0'));
    printf("%d\n", a*(b[1]-'0'));
    printf("%d\n", a*(b[0]-'0'));
    printf("%d\n", a*atoi(b));
    
    
    return 0;
}

이게 정답 코드이다.

오답 노트

(1) scanf , 형식지정자 %s, char[]로 받을 때 항상 char[]의 크기를 받는 값보다 1개 더 크게 설정해야한다.

3자릿수를 받는다면 char b[3]이 아니라, char b[4]로 해야한다.

scanf 형식 지정자를 %s로해서 char[]로 받으면 제일 뒤에 '\0'이 자동으로 들어간다.
따라서 char b[3]을 하면 해당 char[]는 크기가 3이라 4개의 값을 받지못하니 오류가 발생한다.

(2) char 자료형 사용법 미숙

b[2] - '0' 을 이용해 charint로 형변환 할 수 있다.

char []안에는 char 자료형이 들어있다. 즉 b[2]char 타입이된다.

char 타입은 +,-,*,/,% 같은 각종 수학적인 연산자랑 쓰이면 문자로 인식되어 int 타입의 아스키 코드를 반환한다.

따라서 b[2] - '0' 을 하면 int - intint가 나오게된다.

(참고로 아스키코드에서 0~9까지 연속적인 아스키코드를 가지므로 이렇게하는 방식이 가능하다)

char 자료형은 어떻게 쓰이느냐 (printf, cout, 수학연산자등,,,)에 따라서 반환하는 값이 달라진다.

이 것에 대해서 잘알지못해서 어려웠다.

(3) 출력 형식

출력 형식을 제대로 보지않았다. 개행단위로 출력해야하는데 printf() 쓸 때 \n 붙이는 것을 깜빡했다.

(4) stdlib.h 헤더의 atoi() 함수

배열을 int로 변환해주는 함수이다.

C 스타일, 즉 char[]를 string 처럼 써서 숫자값을 받을때 아주 유용하게 써먹을 수 있을 것 같다.

2. C++ 스타일 -> string 헤더의 string 클래스 + stoi(string)

#include <iostream>
#include <string>
using namespace std;

int main() {
    int a;
    string b;
    
    cin >> a >> b;
    cout << a*(b[2]-'0') << "\n";
    cout << a*(b[1]-'0') << "\n";
    cout << a*(b[0]-'0') << "\n";
    cout << a*stoi(b) << "\n";
    
    return 0;
}

오답노트

(1) string 클래스에 인덱스로 접근하면 char 타입으로 반환한다. -> stoi 못씀

string 클래스에 인덱스로 접근하면 char 타입으로 반환한다. -> string 타입이 아니라 stoi() 못씀

이걸 모르고 stoi(s[2]); 이런식으로했다가 틀렸다.

3. (3) 전부 int로 받아서 수학적으로 풀기

#include <iostream>
using namespace std;

int main() {
    int a,b;
    cin >> a >> b;
    
    cout << a*(b%10) << '\n';
    cout << a*(b/10%10) << '\n';
    cout << a*(b/100) << '\n';
    cout << a*b;
    return 0;
}

전부 int로 받아서 수학적으로 b1의 자리, 10의 자리, 100의 자리 를 추출하는 풀이이다.

오답노트

(1) 인덱스를 뽑아서 써야할 것 같아서 string에만 매몰되어 이 풀이를 떠올리지 못했다.

int 자료형이 수학적 연산하기에 편하니까, 입력이 숫자인 경우 int로 받아서 수학적으로 해결할 수 있는것은
수학적으로 해결하는 것이 좋은 것 같다.

(2) 나누기 연산(/) 과 모듈러 연산(%)을 잘 쓰자

/% 연산자를 잘 활용하는 것이 중요한 것 같다.

4. 성능

언제나 그렇듯이 C 스타일 코딩이 성능이 가장 좋다.

5. 느낀점

문자열 관련 공부를 더욱 열심히해야겠다.

개인적으로 생각하는 이 문제의 핵심은

(1) ASCII 코드를 활용한 문자열 <-> 숫자 자료형 변환
(2) <stdlib.h> 의 atoi(arr[]) 와 <string>의 stoi(s) 의 사용

이었던 것 같다.

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글