Lv 0. 문자열 밀기.

 

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

 

#include <string>
#include <vector>
#include <iostream>
using namespace std;

int solution(string A, string B) {
    int answer = 0;
    if(A==B) return 0;
    int len=A.length();
    bool pos=false;
    for(int i=0 ;i<len-1;i++){ // len-1 로 작성해야 tmp가 제자리로 돌아오지 않고 하나 부족한 상태로 종료. 
        string tmp;
        //아래 과정을 거치면 1회 밀기 완료.
        tmp+=A[len-1];
        for(int i=0; i<len-1; i++){
            tmp+=A[i];
        }
        A=tmp;
        if(tmp==B){
            answer=i+1;
            pos=true;
            break;
        } 
    }
    if(pos==false) return -1;
    return answer;
}

 

문자열을 미는 로직을 만들어서 해당 함수에 넣고, 한차례씩 밀어내면서 B 와 같은지 비교하면서 같으면 민 횟수를 리턴하는 형태로 작성. 이때에 처음부터 같다면 바로 맨 위에서 리턴 0 으로 함수 종료. 

 

다른 사람의 풀이를 보니까 아주 극찬을 받고있는 풀이가 있어서 정말 너무 멋진 풀이라 첨부해본다. 

#include <string>

using namespace std;

int solution(string A, string B)
{
    B += B;
    return B.find(A);
}

B를 하나 더 더해서, BB 형태로 만들고, 거기서 A가 존재하는지 찾는 방법으로, 있다면 그 위치를 반환하니까 그만큼 옮기면 되고, 

없다면 stirng::npos를 반환하는데, 이 값의 경우 출력해보면 unsinged long long 값의 최대값이 출력되는것 같은데, return 해보면 제대로 된 출력이 되는걸로 보아서, 이와 관련된 내용을 조사해보면, 

 

아무래도 string::npos의 경우 size_t의 최대값이 나오는것 같은데, 그것을 논리적으로 -1과 동일로 보고 return 값으로 제시해준 것으로 보여진다. 

 

실제로 

cout<<string::npos<<'\n';

형태로 string::npos 값을 출력해보면, 

 

18446744073709551615

값이 출력되게 된다. 이 값은 unsinged logn long의 최대값으로 보여진다. 1844경 정도되니까 signed long long 의 최대값인 922경의 두배로 usinged 하면서 한쪽으로 쭉 몰아서 두배되는 값이 나온것으로 보여진다. 

근데 이 값을 -1 과 동일하게 간주해서 return 할때 -1로 되는것이 아닌가 싶다. 

뭔가 물어보면 물어볼수록 헷갈리는데, 정확히 string::npos의 경우 상징적인 의미를 지니는 값이고, 

return 으로 나타내면 -1로 사용할 수 있는 형태의 값이지 않을까 싶다. 

일단 이정도만 알고 넘어가도록 하고, 

#include <string>

using namespace std;

int solution(string A, string B)
{
    B += B;
    return B.find(A);
}

이러한 코드의 형태가 회전하는 string에서 특별한 string이 존재할 수 있는지에 대한 판단 함수로 사용하기에 아주 적당하고 효율적이라는 것을 알고 넘어가도록 하자. 

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

Lv 0 . 연속된 수의 합  (0) 2023.10.12
Lv 0. 종이 자르기  (0) 2023.10.12
Lv 0. k의 개수  (0) 2023.10.12
Lv 0. A로 B 만들기  (0) 2023.10.11
Lv 0. 이진수 더하기. *다시 풀어보기*  (0) 2023.10.11
  Comments,     Trackbacks