코테/항해99

[99클럽 코테 스터디 4일차 TIL] #문자열4

쪼성윤 2024. 10. 31. 15:31

코테 스터디 4일 차! 점점 실력이 늘고 있는 게 느껴진다. 시작해 보자!

 

문제 설명


숫자의 일부 자릿수를 영단어로 바꾼 문자열이 주어지면 이를 다시 숫자로 된 문자열로 바꾸는 문제입니다.

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

생각 흐름


우선, 4번째 문자열 관련된 문제이기 때문에 지금까지 써왔던 함수와 문제의 규칙을 비교해 보며 문제를 읽어보았다.

 

영어로 표현된 수 문자열을 숫자로 바꾼다는 점에서 영어 표현이 들어있는 배열을 따로 선언한 후 이를 받아오는 s 문자열에 일일이 find() 함수를 통해 비교를 해야겠다는 생각이 들었다.

 

또한, 발견한 인덱스부터 그 영어로 표현된 수 표현의 길이만큼의 인덱스까지를 문자열에서 제외시킨 후 다시 숫자로 채워 넣는 작업을 하면 문제가 쉽게 풀릴 것이라고 생각하였다.

 

#include <bits/stdc++.h>
using namespace std;

int solution(string s) {
    vector <string> v = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

    for (int i = 0; i < 10; i++) {
        while (s.find(v[i])!= string::npos) {
            int index = s.find(v[i]);
            s.erase(index, v[i].length());
            s.insert(index, to_string(i));
            
        }
    }
	
    return s;
}

 

 

따로 컴파일러를 돌려보았을 때 값도 제대로 나오고 해서 문제를 제출해 보았는데

(signal: segmentation fault (core dumped)) 이게 뜨는 것이었다.

 

구글링을 해본 결과, 

대표적

1. 배열 잘못 써서 (범위를 초과, 음수 인덱스 참조)

2. 포인터 잘못 써서

고급지게-위키피디아 왈 세그멘테이션 결함은 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생한다. 

 

라고 하였다. 이게 무슨 말이었을까.. 잘못 쓴 게 없지 않나 고민을 하다가 문제에서 원하고 있는 결괏값은 정수형의 형태가 아닐까라고 생각하였고 마지막에 stoi() 함수를 통해서 바꿨다.

 

이랬더니 성공하였다. 정확한 오류이유는 물어봐야 할 것 같다.

 

#include <bits/stdc++.h>
using namespace std;

int solution(string s) {
    vector <string> v = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

    for (int i = 0; i < 10; i++) {
        while (s.find(v[i])!= string::npos) {
            int index = s.find(v[i]);
            s.erase(index, v[i].length());
            s.insert(index, to_string(i));
            
        }
    }

    int s1 = stoi(s);
    return s1;
}

 

공부한 내용 정리

1. insert() 함수

 

문자열을 삽입, 삭제할 때 사용하는 함수이다.

string str("I love you!");
str.insert(2, "really ");
cout << str << "\n";

 

위치는 기존 문자열 기준이며, 항상 0부터 시작합니다. 그러니 띄어쓰기를 감안하면 love의 l부터 "really"가 들어가는 겁니다.

 

insert( 문자를 넣고 싶은 인덱스, 무엇을 넣을 건지); 라고 생각하면 편하다.

 

 

2. replace () 함수

string str("I love you!");
str.replace (2,4,"hate");
cout << str << "\n"; // i hate you 출력

 

replace (시작 위치, 넣을 문자열 길이, 문자열) 로 생각하면 좋다.

 

 

3. erase() 함수

string str("I love you!");
str.erase(0,2);
cout << str << "\n"; //love you 출력

 

erase () 함수를 이용할 때 시작 위치와 끝 위치를 매개변수로 넘길 때 주의할 점이 있다. 위 소스 코드에서 보듯이 2를 적었다고 해서 0~2까지 3개의 문자를 지우는 것이 아니다. 항상 끝 위치값의 하나 적게 삭제되는 것을 기억해야 한다.

 

4. to_string() 함수

 

함수를 직역하면 말그대로 숫자 타입을 c++ string 타입의 문자열로 간편하게 바꿔주는 함수이다.