ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.