아래 글에서 Autohotkey 와 Python 을 사용하여 인덱스 자동 증가 시키기에 대한 소개를 한 적이 있는데요.

 

오늘은 Autohotkey 와 Python 을 사용하여 인덱스 자동 증가 감소 시키기에 대해 소개해 보려 합니다.

 

일단 python 의 정규표현식, pyperclip 을 활용하여 clipboard 의 숫자와 ± 기호를 증가 감소 시키는 코드를 아래와 같이 작성합니다. 파일 명은 Clipincrease.py 입니다.







 

pyperclip 모듈은 아래 글에서도 소개한 적이 있는데~ 최근에 사용을 해보니 함수들이 좀 바뀌었더군요.


http://iamaman.tistory.com/1256


 

다음으로 단축키 설정을 위한 Autohotkey 코드를 아래와 같이 작성합니다. Clipincrease.py 는 Autohotkey 와 같은 폴더에 위치 시켰습니다.

 

아래 단축키는 Shift + Win + = 을 누르면 index 을 증가 시키고~ Shift + Win + - 을 누르면 index 을 감소 시킵니다.

 

+#=::

InputBox, Nloop,Increase Enter # of Loop, , , 300, 100

if Errorlevel=0

{

    Run, %A_ScriptDir%\Clipincrease.py %Nloop% 0         

}


return

 

+#-::

InputBox, Nloop,Decrease Enter # of Loop, , , 300, 100

    if Errorlevel=0

    {

        Run, %A_ScriptDir%\Clipincrease.py %Nloop% 1            

    }

return

 

위 코드를 이용하면 아래와 같은 코드에 대해~

 

다음과 같이 인덱스를 감소 시킬수 있습니다.


코딩을 하다 보면 규칙적인 코딩을 해야 하는 경우가 종종 있습니다.

 

아래 경우와 같이 순차적으로 증가하는 코드를 생각해 보죠~


a0=0;

a1=1;

a2=2;

a3=3;

a4=4;

.

.

.


아래 글에서도 소개를 했지만 vim 을 사용하는 경우 visincr 라는 플러그인을 사용하면 위 코드 예와 같은 경우 쉽게 인덱스를 증가 시킬 수 있습니다.

 

http://iamaman.tistory.com/324

 

그런데 저는 일반적으로 사용하는 에디터에서도 이런 자동 증가 기능이 있었으면 하는 생각이 들더군요.

 

그래서 Autohotkey 와 Perl 을 사용하여 인덱스를 자동 증가 시키는 코드를 한번 만들어 봤습니다.

 

일단 숫자를 인식 해야 할 테니 regular expression 을 지원해야겠고 문자를 숫자로 인식 한 후에 1씩 증가 할 수 있어야겠죠~ 그래서 이 부분은 Perl 을 활용 했습니다.

 

이를 위한 Perl 코드는 다음과 같습니다. 아래 코드에서 보는 바와 같이 Win32::Clipboard 을 활용 했습니다. 아래 Perl 코드의 파일 명은 ClipIncrease.pl 로 만들었습니다.

 

 

Win32::Clipboard 이 없는 분들은 CPAN client 을 실행 한 후에 install Win32::Clipboard 이라는 명령을 통해 설치 할 수 있습니다.

 

다음으로 위 코드를 실행 시키기 위해 Autohotkey 단축키를 하나 만들었습니다. 코드는 다음과 같습니다. 아래 코드에서는 ClipIncrease.pl의 Fullpath 경로만 제대로 설정해 주면 됩니다.

 

+#=::

InputBox, Nloop, Enter # of Loop, , , 300, 100

if Errorlevel=0

{

Run, %comspec% /c perl.exe ClipIncrease.pl의 Fullpath %Nloop%, , Min

}

 

SplashTextOn, ,, Processing End,

Sleep, 1000

SplashTextOff

return

 

위 Autohotkey 코드의 단축키는 Shift + Win + = 입니다.

 

사용 방법을 간단히 설명 드리면~ 위 예에서~ 첫 줄의 코드 부분(a0=0;)을 복사 합니다.

 

다음으로 Shift + Win + = 을 눌러서 Autohotkey 코드는 실행하면 나타나는 InputBox 에 다음과 같이 증가 횟수를 적어 줍니다. 저는 10회를 적었습니다.

 

Ok 을 누른 후에 좀 있으면 다음과 같이 "Processing End" 라는 메시지가 나옵니다.

다음으로 위 코드의 아래 쪽에 CTRL + V 을 해서 붙여 넣기를 합니다.

 

그럼 다음과 같은 코드가 만들어 집니다.

 

위 예는 간단히 10 회 반복을 했지만~ 100 회 1000 회 반복도 쉽게 할 수 있겠죠?


프로그래밍을 배우면서 아마도 가장 처음 접하게 되는 알고리즘이 바로 정렬 알고리즘이 아닌가 생각되네요.

 

C++ 에서는 algorithm 헤더에 sort, stable_sort, partial_sort 와 같은 함수들이 정의되어 있습니다.

 

C++ STL 이 참 좋긴 하더군요. ㅋㅋㅋㅋ

 

partial_sort 는 말 그대로 일부를 정렬하겠다는 거로 이해하시면 될 것 같고

 

저는 처음에 sort 와 stable_sort 가 좀 헷갈리더군요. 무슨 차이일까… 하고요.

 

차이는 간단한데요. 동일한 값이 있을 경우 stable_sort 의 경우에는 정렬 하기 전의 순서가 정렬후에도 유지된다고 하더군요.

 

위 함수들의 사용법 등에 대해서는 아래 주소의 예제들을 참조하시면 쉽게 이해하실 겁니다.

 

http://www.cplusplus.com/reference/algorithm/sort/

http://www.cplusplus.com/reference/algorithm/stable_sort/

http://www.cplusplus.com/reference/algorithm/partial_sort/

 

저는 오늘 MATLAB 의 sort() 결과와 마찬가지로 정렬 결과 뿐만 아니라 인덱스도 정렬되어 나올 수 있도록 구성해 보도록 하겠습니다.

 

C++ 에서는 이런 경우 인덱스와 값을 pair 로 묶은 후에 정렬하는 방법이 있더군요.

 

예제는 다음과 같습니다. 아래 예제처럼 comparator 만 오름 차순 내림 차순에 따라 잘 설정하면 되더군요.

 

#include <iostream>

#include <vector>

#include <algorithm>

#include <random>

#include <ctime>

 

 

using namespace std;

 

 

#define N_SIZE (10)

 

 

typedef std::pair<int,int> int_int_pair;

 

bool comparator ( const int_int_pair& l, const int_int_pair& r) // 첫번째 값을 기준으로 내림차순 비교하는 comparator

{

return l.first > r.first;

}

 

 

 

int main()

{

vector<int_int_pair> A; // vector setting

 

srand( unsigned(time (NULL)));

 

for (int i=0; i<N_SIZE ; i++)

{

A.push_back(int_int_pair(i,i)); // (value, index) setting

}

 

random_shuffle(A.begin(), A.end()); // 마구 마구 섞기

 

 

cout << "정렬전\nValue\tIndex\n" ;

 

for (int i=0; i<N_SIZE ; i++) // 섞인거 확인하기

{

cout << A[i].first << "\t" << A[i].second << endl;

}

 

cout << "\n\n" ;

 

 

stable_sort(A.begin(),A.end(), comparator); // 정렬 하기

 

cout << "정렬후\nValue\tIndex\n" ;

for (int i=0; i<N_SIZE ; i++) // 정렬됐나 확인하기

{

cout << A[i].first << "\t" << A[i].second << endl;

}

 

return 0;

}

 

위 코드에 따라 다음과 같이 내림 차순 정렬 되게 됩니다.





  1. 종이눈 2018.04.25 12:40

    감사합니다^^ 인덱스 정렬에 내림차순까지 제가 필요했던게 전부 들어있네요

    • 남성 2018.04.25 19:12 신고

      도움되었다니 다행이네요. 방문해 주셔서 감사합니다. ^^

+ Recent posts