본문 바로가기
코딩테스트/백준

백준 2588번 c++ : 두 가지 풀이 방법( getline 함수, 문자열 자르기 substr, 문자열->숫자 형변환 stoi 함수.)

by YUYU_ 2022. 10. 14.

코딩을 하기 전 다음과 같이 생각을 해 보았다. 

1. Num1과 Num2에 숫자 두 개를 입력 받는다. 

2. Num2를 백, 십, 일 의 자리로 분리한다. 

  • case 1.숫자를 문자열로 변환을 한 후에 파싱해서 각각 따로 변수로 저장한다.
  • case 2. 각각의 자리 수를 구해주는 식을 세워서 백, 십, 일 자리를 계산한다.

Case 2 : 각각의 자리 수를 구해주는 식을 세워서 백, 십 , 일 자리를 따로 계산

난 case 2를 택해서 코딩을 했다. 

백의 자리를 구할 때 -> 나누기 100

십의 자리를 구할 때  -> (입력값 -  백의자리x100)   를 10으로 나눔.

일의 자리를 구할 때 -> (입력값 - 십의 자리 x10+백의자리*100) 

 최종 답은 다음과 같다. 

#include<iostream>
using namespace std;
int main(){
    int Num1,Num2;
    int baek,ship,ill;
    cin>>Num1>>Num2;
    baek=Num2/100; ship=(Num2-baek*100)/10;ill=Num2-(ship*10+baek*100);
    cout<<Num1*ill<<endl;
    cout<<Num1*ship<<endl;
    cout<<Num1*baek<<endl;
    cout<<Num1*Num2<<endl;
    return 0;
}

 

 

Case 1: 문자열로 두 번째 숫자를 입력받아서 파싱하기 

그렇다면  case 1으로 문제를 해결하려면?

1. 음... 우선 어쨌든 문자열로 파싱해야 하기 때문에  두 번째로 입력 받는 숫자를 string 형으로 받아야 할 것 같다. 

=> string Num2; 선언.

2. string 문자열을 입력받는다. 

cin>>Num1;
cin.ignore();
getline(cin,Num2);

cin>>Num1 로 정수를 입력받은 후 누른 엔터 값이 버퍼에 남아있어서 getline 에 들어가게 된다. 따라서 ignore 을 써 줘서 그 값을 무시해주고 getline 을 써줬다. 

3. 각 자리 수로 파싱한다. 

파싱할 때 substr 함수를 사용했다. 

substr 함수의 사용법

#include 헤더를 사용해야 함. 

string변수이름.(시작문자열자리,시작부터 몇 개 더 자를건지 갯수) 

예를 들어서 string변수이름.substr(1,3) 이라면 1번째문자부터 시작해서 3개가 출력된다.  

string에 abcde 가 저장되어있다면 b부터 b,c,d  이렇게 세 개가 출력되는 것이다. 

 

따라서 나는 한 자리씩 파싱할거기때문에 다음과 같이 작성해줬다. 

   baek  = Num2.substr(0,1); //0번째부터 1개까지 즉, 0번째만 출력
    ship  = Num2.substr(1,1); // 1번째부터 1개 출력 즉, 1번째만 출력
    ill  = Num2.substr(2,1);//2번째부터 1개 출력. 즉, 2번째 문자열만 출력.

3. 값 출력

현재 baek, ship, ill 모두 다 string형이기 때문에 Num1 과 각 자리 수를 계산 해 주기 위해서는 

해당 자리 수 변수(string 형)을 int 형으로 변환해야 한다. 

따라서 string->int  으로 변환하는 함수인 stoi 를 사용했다. 

(** int -> string 으로 변환하려면  to_string 을 사용)

stoi 함수 사용법

#include<string> 헤더를 사용해야 함. 

stoi(string함수명)

    cout<<Num1*stoi(ill)<<endl;
    cout<<Num1*stoi(ship)<<endl;
    cout<<Num1*stoi(baek)<<endl;

 

최종 제출한 답은 다음과 같다. 

#include<iostream>
#include<string>
using namespace std;
int main(){
    int Num1; string Num2;
    string baek,ship,ill;
    cin>>Num1;
    cin.ignore();
    getline(cin,Num2);
    baek  = Num2.substr(0,1);
    ship  = Num2.substr(1,1);
    ill  = Num2.substr(2,1);
    
    //baek=Num2/100; ship=(Num2-baek*100)/10;ill=Num2-(ship*10+baek*100);
    cout<<Num1*stoi(ill)<<endl;
    cout<<Num1*stoi(ship)<<endl;
    cout<<Num1*stoi(baek)<<endl;
    cout<<Num1*stoi(Num2)<<endl;
    return 0;
}