-
Left Rotation해커랭크(HackerRank) 2019. 3. 12. 08:36반응형
1. 문제
2. 알고리즘
키워드 - 구현
* 문제 풀이
입력 으로 들어오는 배열에 요소를 왼쪽으로 d 만큼 ROTATION 하는 문제이며
d 입력 값에 따라 반복적으로 연산량이 증가 된다.
초기 접근은 d 만큼 반복문 내에서 swap 하도록 구현 하였으나 timeout 이 발생하여 다른 방법으로 접근 하기로 했음
문제에 주어진 조건에서 d 는 배열의 크기보다 작은 수로 입력 됨으로 아래와 같은 식을 세울 수 있다.
이동 될 위치 = ( 배열의 크기 - d + 현재 배열의 위치) % 배열의 크기
문제에서 주어진 예제 기준으로 대입 해 본다면 이동 될 위치는 아래 와 같다.
index 0 일 때 = (5 - 4 + 0) % 5
이동 될 위치는 1
index 1 일 때 = (5 - 4 + 1) % 5
이동 될 위치는 2
index 2 일 때 = (5 - 4 + 2) % 5
이동 될 위치는 3
index 3 일 때 = (5 - 4 + 3) % 5
이동 될 위치는 4
index 4 일 때 = (5 - 4 + 4) % 5
이동 될 위치는 0
3. 코드
#include <bits/stdc++.h> using namespace std; vector<string> split_string(string); int main() { string nd_temp; getline(cin, nd_temp); vector<string> nd = split_string(nd_temp); int n = stoi(nd[0]); int d = stoi(nd[1]); string a_temp_temp; getline(cin, a_temp_temp); vector<string> a_temp = split_string(a_temp_temp); vector<int> a(n); for (int a_itr = 0; a_itr < n; a_itr++) { int a_item = stoi(a_temp[a_itr]); a[a_itr] = a_item; } vector<int> b(n); for(int i=0; i<n; i++) { b[(n - d + i)%n] = a[i]; } for(int i=0; i<n; i++) cout << b[i] << " "; return 0; } vector<string> split_string(string input_string) { string::iterator new_end = unique(input_string.begin(), input_string.end(), [] (const char &x, const char &y) { return x == y and x == ' '; }); input_string.erase(new_end, input_string.end()); while (input_string[input_string.length() - 1] == ' ') { input_string.pop_back(); } vector<string> splits; char delimiter = ' '; size_t i = 0; size_t pos = input_string.find(delimiter); while (pos != string::npos) { splits.push_back(input_string.substr(i, pos - i)); i = pos + 1; pos = input_string.find(delimiter, i); } splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1)); return splits; }
복습
shfit 가 필요한 정수의 값으로 a의 요소를 b 의 index 로 넣는다.#include <bits/stdc++.h> using namespace std; vector<string> split_string(string); // Complete the rotLeft function below. vector<int> rotLeft(vector<int> a, int d) { int n = a.size(); vector<int> b(n); for(int i=0; i<n; i++) { b[(n - d + i)%n] = a[i]; } return b; } int main() { ofstream fout(getenv("OUTPUT_PATH")); string nd_temp; getline(cin, nd_temp); vector<string> nd = split_string(nd_temp); int n = stoi(nd[0]); int d = stoi(nd[1]); string a_temp_temp; getline(cin, a_temp_temp); vector<string> a_temp = split_string(a_temp_temp); vector<int> a(n); for (int i = 0; i < n; i++) { int a_item = stoi(a_temp[i]); a[i] = a_item; } vector<int> result = rotLeft(a, d); for (int i = 0; i < result.size(); i++) { fout << result[i]; if (i != result.size() - 1) { fout << " "; } } fout << "\n"; fout.close(); return 0; } vector<string> split_string(string input_string) { string::iterator new_end = unique(input_string.begin(), input_string.end(), [] (const char &x, const char &y) { return x == y and x == ' '; }); input_string.erase(new_end, input_string.end()); while (input_string[input_string.length() - 1] == ' ') { input_string.pop_back(); } vector<string> splits; char delimiter = ' '; size_t i = 0; size_t pos = input_string.find(delimiter); while (pos != string::npos) { splits.push_back(input_string.substr(i, pos - i)); i = pos + 1; pos = input_string.find(delimiter, i); } splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1)); return splits; }
반응형'해커랭크(HackerRank)' 카테고리의 다른 글
Ransom Note (0) 2019.03.12 Simple Array Sum (0) 2018.08.19 Compare the Triplets (0) 2018.08.19 A Very Big Sum (0) 2018.08.19 Diagonal Difference (0) 2018.08.19