프날 오토핫키 강좌
누르면 강좌 리스트가 나와요
프날 오토핫키 강좌

📣 더 깊은 내용이 담긴 '프날 오토핫키 강좌 v2'의 서적판이 공개되었습니다.

가장 최신의 오토핫키를 담은 '프날 오토핫키 강좌 v2'를 책으로 만나보세요! v2 페이지에 공개된 분량보다 더욱 깊은 내용을 처음이라도 괜찮아, 오토핫키 프로그래밍을 통해 배울 수 있습니다. 전국 온/오프라인 서점에서 만나요!
책 더 알아보기 및 구매하기 

[오토핫키] 2차원 배열에서 행 섞기

#질문답변

 

이번 질문은 함수의 매개변수를 바꿔가며 임의의 순서로 함수를 실행시키고 싶다는 질문입니다.

한마디로 매개변수가 임의로 만들어져야 합니다만, 질문자분은 거기에 "미리 지정된 좌표" 중 임의로 뽑고 싶다는 예시를 드셨습니다. 카드뽑기에서 내가 만들어둔 카드묶음을 섞어 한 장을 뽑듯이, 일반적인 Random 명령어로 좌표를 뽑은 임의의 좌표가 아닌, 원하는 좌표 목록 중 임의로 한 곳을 말하는 것이었습니다.

 

즉, (100, 200)과 (300, 400), (500, 500)이라는 세 개의 좌표 목록을 가지고 있을 때

이를 한번 섞은 후, 함수를 호출할 때마다 섞인 순서대로 좌표작업을 하게 되는 경우를 말하고자 하신 듯 합니다. (예를 들어서, 처음엔 (300, 400), 두번째엔 (500, 500), 세번째엔 (100, 200)처럼 말입니다.)

 

당연히 중복된 좌표는 나오면 안되겠지요(중복을 고려 안하면 그냥 Random만 써서 구현이 가능하니까요)

 

아무튼, 아래와 같이 구현하는게 간단할 것 같습니다.


1. 뽑기 목록이 있는 배열 준비

별거 없습니다. 이차원 배열을 이용하여 (300, 300), (500, 500), (700, 700)이라는 세 개의 좌표묶음이 있는 배열을 준비하였습니다. 즉, arr[1][1]은 300, arr[1][2]도 300, arr[2][1]은 500, arr[3][1]은 700일 것입니다. 표로 정리하면 아래와 같습니다.

arr [1] [2]
[1] 300 300
[2] 500 500
[3] 700 700

2차원 배열 표를 읽을 땐 세로축, 가로축 순으로 읽어줍니다(행/열 순). 즉, arr[3][2]는 700의 값을 가집니다. arr[2][3]은 없죠 ('열'은 두 번째까지 있기 때문입니다.)

이로써 우리는 2차원 배열에서 행을 섞는 것이 이 문제의 본질임을 알 수 있습니다.

 

arr [1] [2]
[1] 500 500
[2] 300 300
[3] 700 700

예를 들어 이렇게 섞이겠죠. 1행과 2행이 섞였네요. 이렇게 섞인 배열에서 행만 순차적으로 가져온다면, 원본 매개변수 리스트를 임의로 가져오는 것이랑 마찬가지일 것입니다.

 

 

2. 배열을 섞어줍니다.

이를 위해서 간단한 방법을 생각해보았는데요, 준비한 배열의 요소를 임의로 접근해서 새 배열로 하나씩 옮기는 것입니다. 아래와 같은 알고리즘을 생각할 수 있겠습니다.

1. 원본 배열을 A, 요소 개수를 L이라고 합니다.
2. 1부터 L까지의 수를 임의로 뽑습니다. 뽑은 수를 R이라고 합니다.
3. A[R]을 읽어서, 새 배열 B에 차곡차곡 쌓습니다. (첫 번째로 뽑혔다면 B[1]에 들어가겠죠?)
4. A[R]의 값을 요소가 가질 수 없는 값(K)으로 변경합니다.
5. 1~4를 반복합니다. 만약 3번에서 읽어온 A[R]이 값이 K라면, 뽑기를 다시합니다. (이미 뽑힌 요소이기 때문입니다.: 중복방지)

이를 코드로 구현해보면(함수화 했습니다) 아래와 같습니다.

resultArr이 새 배열이며, 기존 배열의 값이 임의로 섞여 들어갈 배열입니다. 간단한 코드니 눈으로만 보면 어려워도 직접 돌려보시면 어떻게 동작하는지 이해하실 것입니다. (itemcount 변수는, 원본 배열에서 더이상 뽑을 수 있는 배열이 없다면 반복문을 탈출하기 위해 사용하였습니다.)

 

이 함수를 사용하면 뽑기 목록을 섞을 수 있겠네요.

 

 

3. 새 배열의 값을 순차 실행해줍니다.

 

끝입니다. 값이 섞인 새로운 배열을 B라고 할때, B[1]부터 B[L]은 A[1]부터 A[L]의 값이 임의로 섞여서 들어가있을 것입니다. 따라서 B[1]부터 B[L]까지 순차로 가져와주면, A[1]부터 A[L]까지를 임의로 가져오는 것과 같습니다.

arr[1][1]부터 arr[3][3]까지 MsgBox로 출력시켜보면, 애당초 넣은 (300, 300) (500, 500) (700, 700) 의 순서가 아닌 다른 순서가 출력될 것입니다. 물론 같은 순서가 나올 확률도 있죠.

 

 

4. 매개변수가 임의로 섞였으니, 전달해주면 되겠죠?

 

이 부분은 생략하도록 하겠습니다. Function(매개변수) 형식으로 함수 호출하는건 쉬우니까요. (배열도 똑같이 넘기면 됩니다 그냥)


2차원 배열 섞기.ahk
0.00MB

⚠ 이 강좌는 오토핫키 v1을 다룹니다

지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.