Lv 0. 숫자 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/120904

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(int num, int k) {
    int answer = 0;
    string s;
    s=to_string(num);
    char t='0'+k;
    for(int i=0; i<s.length();i++){
        if(s[i]==t){
            return i+1;
        }
    }
    return -1;
}

위의 코드가 내가 작성해서 제출한 코드.

아래의 코드가 처음 작성해서 제출한 코드이다. 아래의 코드의 경우는 모든 경우가 return -1을 하는 형태가 되었고, char(k)가 인식이 되지 않는다는 것을 발견하였다.

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(int num, int k) {
    int answer = 0;
    string s;
    s=to_string(num);
    for(int i=0; i<s.length();i++){
        if(s[i]==char(k)){
            return i+1;
        }
    }
    return -1;
}

위와 관련된 이유를 알아내기 위해서 gpt를 통해 문제점을 파악하였다.


char(k)가 정상 작동하지 않는 이유는 char(k)에서 k가 아스키 코드 값으로 해석되기 때문입니다. 즉, char(k)는 숫자 k에 해당하는 아스키 문자를 나타냅니다. 아스키 코드에서 0부터 9까지의 숫자는 각각 48부터 57까지의 아스키 코드 값을 갖습니다.

따라서 char(k)가 아니라, char('0' + k)로 수정하여야 합니다. 이렇게 하면 k의 값을 문자 '0'과 더해 해당 숫자에 해당하는 문자를 생성합니다. 아래는 수정된 코드입니다:

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(int num, int k) {
    int answer = 0;
    string s;
    s = to_string(num);
    for (int i = 0; i < s.length(); i++) {
        if (s[i] == char('0' + k)) {
            return i + 1;
        }
    }
    return -1;
}

이렇게 수정하면 char('0' + k)k에 해당하는 문자로 올바르게 작동할 것입니다.


결국 캐스팅을 할때 char(a) 형태로 진행하면, 이때에 넣어주는 int a의 값을 아스키 코드상에서의 값으로 파악하기 때문에, 내가 만약 int a = 7일때,이 값을 char로 바꾸고 싶어서 char(7) 이라고 넣어주면, 아스키 코드상에서 7에 해당하는 값으로 변경하게 되는 연산을 하므로, 원하는데로 7로 바뀌지 않는다. 이때에 0,1,2,3,...,8,9 의 경우는 아스키 코드 상에서 48부터 57번 까지에 해당하므로, 해당 수로 변경하기 위해서는 char('0'+ a ) 형태가 되어야 하는 것이다.

다른 사람의 풀이를 보면, 수 자체를 파싱하면서 구하는 형태풀이도 있는데, 해당 풀이를 첨부해보면,

#include <string>
#include <vector>

using namespace std;

int solution(int num, int k) {
    int answer = -1;
    vector<int>v;
    while(num>0){
        v.insert(v.begin(),num%10);
        num/=10;
    }
    for(int i=0;i<v.size();i++){
        if(k==v[i]){
            answer=i+1;
            break;
        }    
    }
    return answer;
}

이와 같은 형태의 풀이도 충분히 괜찮은 풀이라는 생각이 든다. 혹시 to_string() 함수가 떠오르지 않은 경우는 위와 같은 형태의 풀이를 작성해서 해결해보도록 하자.

  Comments,     Trackbacks