[C++ 스터디] LeetCode 코딩 테스트 문제 풀어보기! - Roman to Integer

2022. 8. 15. 13:3903. Resources/C, C++

728x90
반응형

새로 배우는 언어에 익숙해지는 방법이 몇 가지 있는데,

첫번째는 바로 실무를 뛰면서 하드 트레이닝을 받는 것이고

두번째는 매일매일 문제를 한 개씩 풀어보는 것이다.

회사 동료분이 LeetCode가 좋다고 하셔서 예전에 파이썬으로 조금 문제를 풀어봤었는데,

이제 내 주력언어는 C++이 되어야하기 때문에 C++로 짜보기 시작했다.

 

로그인하고 이런저런 정보를 입력하니 몇 개의 문제를 추천해줘서 진짜 하드코딩해서 문제를 풀었다.

 

문제

문제는 로마식 숫자 표현을 우리가 아는 정수로 바꾸는 것이었다.

https://leetcode.com/problems/roman-to-integer/

 

Roman to Integer - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

 

제출한 답

내가 제출한 답은 아래 코드와 같다.

class Solution {
public:
    int romanToInt(string s) {
        int sum_roman = 0;
        for (const char& cur_roman : s) {
            if (cur_roman == 'I') {
                sum_roman += 1;
            } else if (cur_roman == 'V') {
                if(prev_roman_ == 'I'){
                    sum_roman -= 1*2;
                } 
                sum_roman += 5;
            } else if (cur_roman == 'X') {
                if(prev_roman_ == 'I'){
                    sum_roman -= 1*2;
                } 
                sum_roman += 10;
            } else if (cur_roman == 'L') {
                if(prev_roman_ == 'X'){
                  sum_roman -= 10*2;  
                } 
                sum_roman += 50;
            } else if (cur_roman == 'C') {
                if(prev_roman_ == 'X'){
                    sum_roman -= 10*2; 
                } 
                sum_roman += 100;
            } else if (cur_roman == 'D') {
                if(prev_roman_ == 'C'){
                    sum_roman -= 100*2; 
                } 
                sum_roman += 500;
            } else if (cur_roman == 'M') {
                if(prev_roman_ == 'C'){
                    sum_roman -= 100*2; 
                } 
                sum_roman += 1000;
            } 
            prev_roman_ = cur_roman;
        }
        return sum_roman;
    }
private:
    char prev_roman_ = ' ';
};

 

결과

완전 하드코딩한 코드인데, 거의 최고점을 받아버렸다 허허

 

배운 점

파이썬이나 다른 언어들은 문자열을 만들 때 쌍따옴표(" ")를 쓰던 홑따옴표(' ')를 쓰던 동일하게 동작했는데, C++은 달랐다.

처음에 쌍따옴표로 하니까 동작을 안하고 컴파일 에러가 나오길래 검색을 여기저기 해봤는데 딱히 적용이 되는 솔루션이 없었다.

그래서 홑따옴표로 바꾸고 해보니 바로 동작했다...!

 

이해가 되질 않아서 아래 코드로 각 변수 선언의 타입을 비교해봤다.

#include <iostream>
#include <string>

int main()
{
    auto a = "A";
    auto b = 'B';

    std::cout << "Type of A: " << typeid(a).name() << std::endl;
    std::cout << "Type of B: " << typeid(b).name() << std::endl;
    return 0;
}

 

결과는 아래 사진처럼 나왔다.

 

타입 정보가 저렇게 나오면 이해가 안돼서 찾아보니 아래 링크를 찾을 수 있었다.

https://stackoverflow.com/questions/65369710/what-does-pkc-as-the-output-of-typeidvar-name-mean

 

What does "PKc", as the output of typeid(var).name(), mean?

I'm getting PKc as the output when providing typeid(check).name() - where check is a char variable - as the argument to typeid.name() #include<bits/stdc++.h> using namespace std; main() { ...

stackoverflow.com

 

그 중에 채택된 답변을 보면

PKc is the mangled name of const char*. 
P is the encoding for "pointer", K refers to "const", and c means "char"

이렇다고 한다.

즉, C++에서 쌍따옴표로 단일 문자를 감싸게 되면 const char* 타입으로 변수 타입이 설정되고

홑따옴표로 단일 문자를 감싸게 되면 char 타입으로 변수 타입이 설정된다.

 

확실히 C계열의 언어가 디테일하게 신경써야하는게 많다.

이런 것도 결국 누군가가 불편해서 파이썬이나 다른 언어에서는 같은 일을 하도록 바꾼게 아닐까 싶다.

반응형