![24b0d121e09c28a8699fe8b115ef046f584f919b]()
aoc란?
12월 1달동안 매일 1개의 문제가 공개됩니다.
시간제한 메모리제한 같은 거 없이 답을 구해내기만 하면 되므로
언어선택은 아무 상관이없습니다.
지오핫, 프라임젠 등과 같은 유명한 개발자들도 함께 참여하는 대축제이니
많은 참여바랍니다
![31]()
https://adventofcode.com/2023/day/1
문제를 간략히 소개하면
문자열이 주어졌을때 맨처음 digit이 등장할때와 마지막 digit이 등장하는 걸 찾아서
합친다음에 십진법으로 표현해서 모두 더하는 문제임 ㅇㅅㅇ..
pqr3stu8vwx <~ 38
8vwx <~ 88
이와 같은 형식
part2는
이번에는 one, two, ..., nine 과 같은 문자열이 주어져서
얘네들도 처리를 해줘야함
two1nine <~ 29
alskdfsdlakjtwoalsdkjf <~ 22
이런식 ㅇㅇ..
깃붕이들의 다양한 언어로 푼 다양한 풀이를 보고싶어요잉~!
12월은 aoc와 함께,,,
스포방지
---
Part1
bool is_digit(char c) {
return c >= '1' && c <= '9';
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
string line; ifstream file("input.txt");
int ans = 0;
while (getline(file, line)) {
int l = 0, r = line.length()-1;
while (!is_digit(line[l++])) {}
while (!is_digit(line[r--])) {}
string s; s += line[--l]; s += line[++r];
ans += stoi(s);
}
file.close();
cout << ans;
return 0;
}
투포인터로 해결해봤음 ㅇㅇ..
지금 안건데 isdigit이란게 애초에 내장으로 그냥 존재하네? ;; (isalpha 이것도 됨,, ~.~)
더 섹시한 풀이 있으면 깃붕이들이 공유해저잉~
Part2
vector<string> valid = {
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
};
string check(const string& sub_line, bool first) {
string res = "";
for (int i=0; i<sub_line.length(); ++i) {
for (int j=0; j<valid.size(); ++j) {
if (i + valid[j].length() > sub_line.length()) continue;
if (sub_line.substr(i, valid[j].length()) == valid[j]) {
if (first) return to_string(j+1);
res = to_string(j+1);
}
}
}
return res;
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
string line; ifstream file("input.txt");
int ans = 0;
while (getline(file, line)) {
string cur;
vector<string> v;
for (const char& c : line) {
if (isalpha(c)) cur += c;
else {
if (!cur.empty()) {
v.push_back(cur);
cur.clear();
}
v.push_back(string(1, c));
}
}
if (!cur.empty()) v.push_back(cur);
string first = "", last = "";
for (int i=0; i<v.size(); ++i) {
if (isdigit(v[i][0])) {
if (first.empty()) first = v[i];
else last = v[i];
}
else {
auto s = check(v[i], first.empty());
if (s.empty()) continue;
if (first.empty()) first = s;
else last = s;
}
}
if (last.empty()) last = first;
string ns = first + last;
ans += stoi(ns);
}
file.close();
cout << ans;
return 0;
}
더 좋은 풀이가 있을 것 같은데 이게 내 머가리로는 최선임..
먼저 문자열을 쌓아 놓으면서 숫자 만날때 마다 문자열 단위로 벡터에 집어넣음
abc5def7jl 이면
abc, 5, def, 7, jl 로 담기는 방식 ㅇ.ㅇ
그다음
vector를 순회하면서 first, last를 갱신함 ㅇㅅㅇ..
first가 empty인지를 체크해 한번 담긴후에는 갱신하지않음 ㅇㅅㅇ..
check에서는 해당 문자열에 valid한게 담겨있는지 체크하는 건데
first에 할당하는 경우에는 얼리리턴하고,
last에 할당하는 경우에는 계속 갱신하다가 리턴함
지금 생각해보니까 굳이 vector에 담지 말고 문자열 내에서
처리하는게 더 깔끔하겠다는 생각이..
stoi말고 int로 처리할 수 있을것같은데 ㅇㅅㅇ..
아무튼 이상입니다.
좋은 주말되세요.
깃추 - dc App
https://ideone.com/1qR3ki
오.. 근데 part2 54489로 답이 나오는데 예외케이스를 못찾겠네.. 54473이 나와야함.. 뭐지..
part1은 통과함 ㅇㅇ..
글쎄 원문제는 안보고 소개글만 보고 즉석에서 짜본거라 문제 요구사항에 안맞는거면 0을 넣어선 안되거는거였겠네 스포일러로 올려둔 코드를 보니
그게 아니라 정규식이 잘못 됐다 'eightwo' 같은 경우 너껀 8만 매칭됨 ?= 같은걸로 그룹 해주면 잘 된다. 수정해줬다
https://ideone.com/2hIWLp
아하 그런 경우도 가능하겠군 ㄳ
해당 댓글은 삭제되었습니다.
헐 수정했어요..
digit이었구나 number인줄 알아서 aaa84aaa 이런거 8484로 나오게 했는데.. - dc App