본문 바로가기

BAEKJOON/구현

백준 1871번 [좋은 자동차 번호판](C++) -yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 1871 [좋은 자동차 번호판]


문제 링크: https://www.acmicpc.net/problem/1871

문제 설명:

자동차 번호판은 ABC-1234 형태로 주어집니다. 번호판에서 앞의 3글자는 알파벳으로 이루어져 있으며, 이를 26진법 숫자로 변환한 값과 뒤의 4자리 숫자 간의 차이가 100 이하면 nice, 그렇지 않으면 not nice를 출력하는 문제입니다.


문제 해결 코드


// 백준 1871 - 좋은 자동차 번호판
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n; // 테스트 케이스 수

    for (int i = 0; i < n; i++) {
        string s;
        cin >> s; // 번호판 입력

        // 앞 3자리 알파벳을 26진법 숫자로 변환
        int fs = 0;
        for (int j = 0; j < 3; j++) {
            fs += (s[j] - 'A') * pow(26, 2 - j);
        }

        // 뒤의 숫자 부분을 정수로 변환
        int bs = stoi(s.substr(4));

        // 차이 계산 및 결과 출력
        if (abs(fs - bs) <= 100) {
            cout << "nice\n";
        } else {
            cout << "not nice\n";
        }
    }

    return 0;
}

코드 설명

코드의 주요 로직과 사용된 알고리즘 설명.

  • 핵심 알고리즘:
    • 앞의 3자리 알파벳을 (A=0, B=1, ..., Z=25)로 변환하여 26진법의 숫자값을 계산합니다.
    • 뒤의 숫자는 문자열에서 잘라낸 뒤 stoi를 사용해 정수로 변환합니다.
    • 두 값의 차이를 구해 100 이하인지 확인합니다.
  • 구현 세부사항:
    • 알파벳 부분의 변환은 반복문에서 26의 거듭제곱을 곱해가며 계산합니다.
    • 숫자 부분은 substr을 사용하여 잘라낸 뒤 stoi로 처리합니다.
    • 차이의 절대값을 구하기 위해 abs 함수를 사용합니다.
  • 시간 복잡도 분석:
    • 알파벳 변환: O(1)
    • 숫자 변환: O(1)
    • 테스트 케이스 수를 n이라 할 때 총 시간 복잡도는 O(n)입니다.

결과

제출 시, 모든 테스트 케이스에 대해 올바른 결과를 출력합니다.

다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST