코테 스터디 4일 차! 점점 실력이 늘고 있는 게 느껴진다. 시작해 보자!
문제 설명
숫자의 일부 자릿수를 영단어로 바꾼 문자열이 주어지면 이를 다시 숫자로 된 문자열로 바꾸는 문제입니다.
https://school.programmers.co.kr/learn/courses/30/lessons/81301
생각 흐름
우선, 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 타입의 문자열로 간편하게 바꿔주는 함수이다.
'코테 > 항해99' 카테고리의 다른 글
[99클럽 코테 스터디 6일차 TIL] #해시2 (2) | 2024.11.03 |
---|---|
[99클럽 코테 스터디 5일차 TIL] #해시 (1) | 2024.11.01 |
[99클럽 코테 스터디 3일차 TIL] #문자열3 (0) | 2024.10.30 |
[99클럽 코테 스터디 2일차 TIL] #문자열2 (1) | 2024.10.29 |
[99클럽 코테 스터디 1일차 TIL] # 문자열 (1) | 2024.10.28 |