관리 메뉴

cococo-coding

[C++ 풀이] 1871번. 좋은 자동차 번호판 본문

[BOJ] 코드 모음/C++_learning 문제집

[C++ 풀이] 1871번. 좋은 자동차 번호판

_dani 2024. 1. 23. 00:00

 

문제 분석

글자와 숫자로 이루어진 자동차 번호판을 입력받아 각각의 가치를 계산하는 문제이다.

이때 자동차 번호판의 길이는 일정하며, LLL-DDDD형식으로 이루어져있다. (LLL : 글자, DDDD: 숫자)

LLL부분과 DDDD부분의 가치를 계산하고, 절댓값을 씌운 차를 100과 비교하면 된다.

 

알고리즘 설계

자동차 번호판의 길이가 고정되어 있고, 앞의 세 글자와 뒤의 네 숫자로 분류되어 있어서 형식적인 부분에서 코드를 짜기 편했다. 

번호판을 string형으로 선언하고 입력받는다.

 

1. LLL 부분

for문을 이용해 인덱스 0~2까지 반복했다. 

이때 A=0, B=1.. 이므로 65씩을 빼줘야한다는 점, 지수형식으로 되어있는 부분은 따로 j라는 변수를 설정해서 한 번씩 sum을 구할때마다 j--;로 빼주면서 설정해주었다. 

 

2. DDDD 부분

substr함수를 이용해 부분문자열로 뽑아왔다.

DDDD가 시작되는 인덱스는 4로 일정하며, 길이도 4이므로 substr(4,4)로 설정한다.

substr으로 가져온 문자열은 string이므로, 이를 숫자형태로 변환해주어야 한다.

예를 들어 "0999"라는 문자열은 숫자로 999로 변환해야 한다.

이를 위해 stoi함수를 이용해 부분문자열을 int형으로 변환해주었다.

 

이제 LLL-DDDD의 절댓값을 구해주어야 한다. 이 부분은 abs함수로 구현했다. 

마지막으로 구한 절댓값이 100기준으로 같거나 작으면 nice, 아니면 not nice를 출력하도록 if-else문을 구현했다. 

 

느낀 점

문제만 봤을 때에는 빠른 시간내에 구현할 수 있겠다 생각했는데, 의외로 신경쓸 부분이 많았다.

특히  c++에서 많이 사용하는 함수들 substr(), stoi(), abs() 의 기능을 잘 알고있어야 수월하게 풀 수 있을 것 같다. 

 

코드

#include <iostream>
#include <cmath> //pow함수
#include <string>
using namespace std;
/*
    1. 번호판 수를 입력받는다.
    2. 번호판을 입력받는다.
    3. 좋은 번호판인지 판단한다.
    4. 판단한 결과를 출력한다.
*/

int main() {
    //1
    int n;
    cin >> n;

    //2
    string num;
    int sum=0;
    while (n--) {
        cin >> num;
        //LLL-DDDD에서 LLL 부분
        int j = 2;
        for (int i = 0; i < 3; i++) {      
            sum += ((int)num[i]-65) * pow(26, j);           
            j--;                    
        }
        //LLL-DDDD에서 DDDD부분
        //DDDD부분을 추출해 INT형으로 변환
        string sub = num.substr(4, 4);       
        int last = stoi(sub);       

        //|LLL-DDDD| 값 구하기
        int aabs= abs(sum - last);
        //4
        if (aabs <= 100) cout << "nice" << '\n';
        else cout << "not nice" << '\n';

        sum = 0;
    }
    return 0;
}