오늘의 할일
1. 코드카타 정리
2. 세션 정리
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
string answer_str = ""; // 최종 숫자를 문자열 형태로 이어 붙일 변수
string temp = ""; // 알파벳을 하나씩 모아서 단어를 만들 변수
// 문자열 한 글자씩 확인
for (int i = 0; i < s.length(); i++) {
// 만약 지금 읽은 글자가 숫자라면
if (s[i] >= '0' && s[i] <= '9') {
answer_str += s[i];
}
// 숫자가 아니라 알파벳이라면
else {
temp += s[i];
// temp에 모인 알파벳이 숫자 단어가 되었는지 확인
if (temp == "zero") { answer_str += "0"; temp = ""; }
else if (temp == "one") { answer_str += "1"; temp = ""; }
else if (temp == "two") { answer_str += "2"; temp = ""; }
else if (temp == "three") { answer_str += "3"; temp = ""; }
else if (temp == "four") { answer_str += "4"; temp = ""; }
else if (temp == "five") { answer_str += "5"; temp = ""; }
else if (temp == "six") { answer_str += "6"; temp = ""; }
else if (temp == "seven") { answer_str += "7"; temp = ""; }
else if (temp == "eight") { answer_str += "8"; temp = ""; }
else if (temp == "nine") { answer_str += "9"; temp = ""; }
}
}
// 완성된 문자열을 정수로 바꾸고 answer로
answer = stoi(answer_str);
return answer;
}
AI가 작성한 코드
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
// 숫자의 인덱스(0~9)와 영단어가 정확히 일치하도록 배열을 준비합니다.
vector<string> words = {
"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"
};
// 0부터 9까지 10개의 영단어를 순서대로 검사합니다.
for (int i = 0; i < 10; i++) {
size_t pos = 0; // 문자열을 찾기 시작할 위치
// s 문자열 안에서 현재 영단어(words[i])가 더 이상 안 나올 때까지 반복해서 찾습니다.
while ((pos = s.find(words[i], pos)) != string::npos) {
// 영단어를 찾았다면, 그 위치(pos)부터 영단어 길이만큼을 숫자(i)로 바꿔치기합니다.
s.replace(pos, words[i].length(), to_string(i));
// 바꾼 숫자 바로 다음 칸부터 다시 탐색을 이어나갑니다.
pos += 1;
}
}
return stoi(s);
}
s.find(찾을 글자, 시작 위치):
문자열 안에서 특정 단어가 어디 있는지 인덱스 찾아내는 함수. 만약 끝까지 없다면 C++에서 "못 찾았다"는 뜻으로 쓰이는 string::npos를 리턴
s.replace(시작 위치, 지울 길이, 새 글자):
지정한 위치부터 글자를 싹 지우고, 그 자리에 새로운 글자를 끼워 넣습니다. ("zero"가 있던 자리를 지우고 "0"을 넣는 역할)
to_string(숫자):
숫자 i를 문자열 "i"로 변환. replace 함수는 문자열만 끼워 넣을 수 있기 때문에 정수인 i를 문자로 바꿔주는 것
SetupAttachment, 플레이 도중 즉시 어태치먼트를 변경할 때는 AttachToComponent를 주요 방법으로 사용UStaticMeshComponent -> UPrimitiveComponent -> USceneComponentRoot -> Mesh 등의 부착 관계 (별개의 개념)SetupAttachment()는 부모와 자식 간의 공간 관계를 만들어 주는 기능UCharacterMovementComponentUProjectileMovementComponentURotatingMovementComponentUInterpToMovementComponent.h 파일은 다른 여러 .cpp 파일에서 다시 포함될 수 있으므로, 불필요한 헤더를 계속 추가하면 컴파일 의존성이 커짐.cpp에 두는 것이 좋음UCameraComponent* 등)T* Weapon = new Weapon[2])TObjectPtr을 사용하도록 안내TObjectPtr과 구분됨)FRotatorFVectorSetActorRotation() 같은 함수 사용ForwardVector: (1, 0, 0))RightVector: (0, 1, 0))UpVector: (0, 0, 1))FRotator(Pitch, Yaw, Roll) 형태로 회전값을 저장FRotator Rotation(0.0f, 90.0f, 0.0f), SetActorRotation(FRotator(0,0,0));)FRotationMatrix: 어떤 회전을 기준으로 했을 때 앞, 오른쪽, 위가 어디인지 알려주는 도구(회전 행렬, 방향표)FRotationMatrix(FRotator(0.0f, 90.0f, 0.0f))는 Yaw가 90도 들어간 상태를 기준으로 앞, 오른쪽, 위가 어디인지 계산할 수 있는 방향표를 만드는 것