프로그래머스 - 원하는 문자열 찾기 - C++

프로그래머스 원하는 문자열 찾기 문제 바로가기 lowercase, uppercase C++에서 string을 lowercase 또는 uppercase하는 방법은 정말 다양하다. 1) transform()안에 iterator과 tolower()함수를 넣는 경우. 2) ASCII 아스키 코드를 이용해서 대문자->소문자로 바꾸는 경우 3) boost에서 to_lower() 함수를 불러와서 바꾸는 경우. 사실 가장 간단한 것은 boost 방식이라 이를 이용해서 문제를 해결했다. 내 풀이 myString의 각 자리를 pat의 첫 번째 요소와 비교해가며 조건을 만족하는 경우 1을 return하도록 했다. 이중 for문이라 시간복잡도는 O(n*m)이다. #include <string> #include <vector> #include <boost/algorithm/string.hpp> using namespace std; int solution(string myString, string pat) { boost::algorithm::to_lower(myString); boost::algorithm::to_lower(pat); int count = 0; if (myString.size() < pat.size()){ return 0; } for (int i=0; i<myString.size()-pat.size()+1; i++){ count = 0; for (int j=0; j<pat.size(); j++){ if (myString[i+j] == pat[j]){ count++; if (count == pat.size()){ return 1; } } } } return 0; } 다른 사람의 풀이 구경 조금 더 간단하게 풀어내는 방법이 없을까 고민하다가 다른 사람들의 풀이를 구경했다. 훨씬 깔끔하더라ㅜㅜㅜ 그러면 코드를 파헤쳐 보자 ...

2023-8-11 · 1 min · 204 words · Junha

프로그래머스 - 9로 나눈 나머지 - C++

프로그래머스 9로 나눈 나머지 문제 바로가기 char -> int로 바꾸기 char one = '1'; int ione = one - '0'; cout << ione // 1 나의 풀이 char -> int로 바꿀 수만 있다면 for문으로 string으로부터 char을 받아와서 쉽게 각 자리 합을 구할 수 있다. #include <string> #include <vector> using namespace std; int solution(string number) { int ans = 0; for (char n: number){ int num = n - '0'; ans += num; } return ans%9; } References stackoverflow - convert char to int

2023-8-10 · 1 min · 83 words · Junha

프로그래머스 - 문자열 여러 번 뒤집기 - C++

프로그래머스 문자열 여러 번 뒤집기 문제 바로가기 reverse() function vector나 string에 대해서 reverse()함수를 이용하면 특정 부분을 거꾸로 만들 수 있다. vector<int> nums = {1, 2, 3, 4, 5}; reverse.(nums.begin(), nums.end()); cout << nums << endl; // (5, 4, 3, 2, 1) reverse.(nums.begin(), nums.begin()+3); // 1~3번째 원소에 대해서만 reverse cout << nums << endl; // (3, 4, 5, 2, 1) 이 함수를 이용해 풀면 다음과 같다. #include <string> #include <vector> #include <algorithm> using namespace std; string solution(string my_string, vector<vector<int>> queries) { for (vector<int> q: queries){ reverse(my_string.begin()+q[0], my_string.begin()+q[1]+1); } return my_string; } 여담 - Python과의 비교 python의 경우 slicing을 이용해서 arr[i:j+1] = arr[j:i-1:-1]만 해도 해결 가능한데 C++은 조금 귀찮긴 하다… 그나마 reverse() function이 있어서 일일히 부분 복사해서 붙여넣기 안해도 되니까 다행인듯!! ...

2023-8-10 · 1 min · 123 words · Junha

프로그래머스 - 배열 만들기 2 - C++

프로그래머스 배열 만들기 2 문제 바로가기 to_string()을 이용한 풀이 #include <string> #include <vector> using namespace std; vector<int> solution(int l, int r) { vector<int> answer; for (int i=l; i<r+1; i++){ bool check = true; if (i%5 != 0){ continue; } for (char c: to_string(i)){ if (c!='0' && c!='5'){ check = false; break; } } if (check){ answer.push_back(i); } } if (answer.size() == 0){ return {-1}; } else{ return answer; } } 간단한 문제였는데 구현하는 과정에서 시간이 오래 걸렸던 문제. 시간을 단축하기 위해서는 다음과 같은 조건들을 고려해주어야 한다. 5의 배수가 아니라면 continue 숫자의 각 자리를 확인하면서 0이나 5가 아니라면 check을 false로 바꿈. break을 통해 시간 절약 check이 true라면 push, false라면 그냥 지나감. 각 자리를 나눠가며 하는 풀이 위의 풀이와 거의 동일하지만 i을 10으로 나눈 몫과 나머지를 이용하는 방법도 있다. ...

2023-8-9 · 1 min · 192 words · Junha

프로그래머스 - 수 조작하기 1 - C++

프로그래머스 수 조작하기 1 문제 바로가기 map을 이용한 풀이 일일히 조건문 짜는 것보다 미리 python의 딕셔너리 같은걸 만드는게 어떨까 생각했다. c++에는 이에 해당하는 map이 존재한다. STL을 지원하고, size(), empty(), find(k), operator[]과 같은 여러 기능들을 제공한다. map<char,int> cmd;로 declare한 뒤에 cmd['w']=1처럼 define해도 좋고, 처음부터 {% raw %}{{'w',1},{'s',-1},{'d',10},{'a',-10}}{% endraw %}이렇게 define해도 된다. #include <string> #include <vector> #include <map> using namespace std; map<char,int> cmd; cmd['w'] = 1; cmd['s'] = -1; cmd['d'] = 10; cmd['a'] = -10; int solution(int n, string control) { int ans = n; for (char ct: control){ ans += cmd[ct]; } return ans; } switch을 이용한 풀이 가독성을 위한다면 switch을 사용해도 좋다. 각 case별로 기능을 지정해주면 case가 일치할 때에 각각 실행된다. ...

2023-8-9 · 1 min · 167 words · Junha