Logic

EHminShoov2J·2023년 9월 2일
0

CPP/코딩테스트

목록 보기
13/25
post-thumbnail

1. 1차원 배열 회전

rotate() 함수를 이용해서 손쉽게 구현할 수 있다.

rotate( 시작 위치, 시작위치로 만들고 싶은 위치, 회전 시킬 위치의 마지막)

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
    vector<int> v = {1,2,3,4,5};
    rotate(v.begin(),v.begin()+ 1, v.end()); // 첫번째 인자는 그냥 시작점. 두번째 인자는 처음으로 만들고 싶은 원소!
    for(int i : v) cout << i;
    cout << endl;
    
    v = {1,2,3,4,5};
    rotate(v.begin(), v.begin() + 2, v.begin()+ 4); // 5는 계속 맨뒤에 존재 
    for(int i : v) cout << i;
    cout << endl;

    v = {1,2,3,4,5};
    rotate(v.rbegin(),v.rbegin()+ 1, v.rend()); // 반대로 rotate 시키는 경우 
    for(int i : v) cout << i;
    cout << endl<< endl;
}

2. 2차원 배열의 회전이동

temp에 잠시 저장해주고, 2차원 배열의 크기를 resize() 해주는 과정이 필요

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void rotate_left_90(vector<vector<int>> &key){
    int n = key.size();
    int m = key[0].size();

    vector<vector<int>> temp(m , vector<int>(n,0));
    for( int i =0; i < m; i++){
        for(int j=0; j < n; j++){
            temp[i][j] = key[j][m-i-1];
        }
    }
    key.resize(m);
    key[0].resize(n);

    key = temp;
    return ;
}

int main(){
    vector<vector<int>> v_2d = {
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12}
    };
    rotate_left_90(v_2d);
    for(vector<int> v : v_2d){
        for(int i : v) cout << i << " ";
        cout << endl;
    }
    cout << endl;
}

3. N 진법으로 표현하기

N 으로 계속해서 숫자를 나누어가며, 나머지를 저장해주면 된다. 모두 저장한 뒤 reverse() 해주어야 함.

#include <iostream>
#include <vector>

using namespace std;

int main(){
    int n = 111;
    int nary = 16;
    vector<int> v_nary;
    while( n > 1){
        v_nary.push_back(n % nary);
        n /= nary;
    }
    if( n == 1) v_nary.push_back(1);
    reverse(v_nary.begin(), v_nary.end());
    for(int i : v_nary){
        if(i > 10) cout << char( i + 55);
        else cout << i;
    }
}

10진법 이상으로 넘어가주면 영어로 표현해 주어야 한다.

0개의 댓글