프로그래머스 - 문자열 여러 번 뒤집기 - 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

프로그래머스 - 주사위 게임 2 - C++

프로그래머스 주사위 게임 2 문제 바로가기 일일히 조건 나눠가며 풀기 C++에서는 AND 연산자를 &&로, OR 연산자를 ||로 표현할 수 있다. 이를 이용해서 일일히 조건을 나누면 문제를 해결할 수 있다. #include <string> #include <vector> #include <cmath> using namespace std; int solution(int a, int b, int c) { if (a == b && b == c){ return (a+b+c)*(pow(a,2)+pow(b,2)+pow(c,2))*(pow(a,3)+pow(b,3)+pow(c,3)); } else if (a==b || b==c || c==a){ return (a+b+c)*(pow(a,2)+pow(b,2)+pow(c,2)); } else{ return a+b+c; } } std::set 그러나 조건이 복잡해진다면 코드가 복잡해질 염려가 있어서 간편한 방법이 필요하다. 이 경우 set을 이용하면 간단하게 해결 가능하다. set은 중복되는 요소가 없기 때문에 arr.size()을 통해서 몇 개의 숫자가 동일한지 역추적할 수 있게 된다. include <set>으로 헤더를 불러오고 set<int> s{a,b,c};로 선언(declare)한 뒤에 사용하면 된다. ...

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

프로그래머스 - 주사위 게임 3 - C++

프로그래머스 주사위 게임 3 문제 바로가기 구현하는게 은근히 까다로웠던 문제… python이라면 Counter 라이브러리를 불러와서 바로 풀었을 텐데, C++은 그런 라이브러리가 존재하지 않아 한땀한땀 구현해야하는게 필요하다. 물론 자체 제작 counter을 만들면 되긴 하지만! vector로 숫자를 받고 오름차순으로 sort해준 뒤에 나머지 작업을 진행했다. 가독성을 높이기 위해서 switch구문을 활용해서 숫자의 종류의 수에 따라 case을 나누어 풀어주었다. #include <string> #include <vector> #include <algorithm> #include <cmath> #include <set> using namespace std; int solution(int a, int b, int c, int d) { vector<int> nums{a,b,c,d}; set<int> counts{a,b,c,d}; sort(nums.begin(), nums.end()); switch (counts.size()){ case 1: return 1111*nums[0]; case 2: if (nums[1] != nums[2]){ return (nums[3]+nums[0]) * (nums[3]-nums[0]); } else{ if (nums[0] == nums[1]){ return pow((10 * nums[0] + nums[3]), 2); } else{ return pow((10 * nums[3] + nums[0]), 2); } } case 3: if (nums[0] == nums[1]){return nums[2]*nums[3];} if (nums[0] == nums[2]){return nums[1]*nums[3];} if (nums[0] == nums[3]){return nums[1]*nums[2];} if (nums[1] == nums[2]){return nums[0]*nums[3];} if (nums[1] == nums[3]){return nums[0]*nums[2];} if (nums[2] == nums[3]){return nums[0]*nums[1];} case 4: return nums[0]; } }

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