본문 바로가기
VBA/365 FUNCTION

[365리뷰] 해찾기 [feat. 서랍님]

by 일등미노왕국 2024. 2. 23.

https://www.youtube.com/watch?v=g070BU204yQ&t=559s&ab_channel=IT%EC%84%9C%EB%9E%8D

 

 
 
 
 
 
오늘은 서랍님이 올리신 함수로 '해찾기'로직에 대해서 리뷰해 보려고 한다.
 
365로 잘하려면 배열 매트릭스에 대한 개념이 잡혀있어야 문제를 해결하는 관점이 달라질 수 있을 것 같다. 365는 셀 기반이 아닌 배열기반으로 움직이기 때문에 각 1차원 배열 x 1차원 배열로 만들어진 2차원 배열의 예상 결과값을 알아야 진정한 365 마스터가 되리라 생각한다.
 
영상에도 볼수 있듯이 결과는 단순하게 1차원 배열로 나오지만, 그 결과값이 나오기까지 1차원 배열들로 2차원 배열의 테이블값을 만들어서 그 값들 중 목표값과 비교하여 결국 원하는 [해찾기] 결과를 가져오는 것을 알수 있다.
 

 
1,2,3,4의 값이 주어졌을 때 모든 경우의 수는 [ 2^4 -1 ] 이다. 표에서 행의 값을 보면 0부터 시작해서 15까지 나오게 되는데

SEQUENCE(2^4,,0)

 
이는 2^4 만큼 행을 만드는데, 0부터 시작하라는 뜻이다.
 
1,2,3,4 는 총 4개의 숫자인데 이를 열로 표현하는 1차원 배열을 만들면

2^SEQUENCE(,열의수,0)

 
이렇게 하면 2^0, 2^1, 2^2, 2^3  이렇게 1차원 테이블이 만들어지며, 이는 2진수 표기로 각 숫자의 자리수를 의미한다.
 

 
만들어진 테이블을 뒤집어보면
 
 0 = 0000
 1 = 0001
 2 = 0010
 3 = 0011
 4 = 0100
   .
   .
   .
15 = 1111
로 나타나는데 이것이 각 숫자가 들어가는 자리이기도 하다.
 

=LAMBDA(arr,target,
LET(
→step1, "각 인덱스의 값에 배열의 값을 대입시켜라",
list,MOD(INT(SEQUENCE(2^ROWS(TOCOL(arr)),,0)/2^SEQUENCE(,COLUMNS(TOROW(arr)),0)),2)*TOROW(arr),

→step2, "각 행의 합과 목표값과의 차의 절대값을 구해라",
findV,ABS(BYROW(list,LAMBDA(a,SUM(a)))-target),

→step3, "step2를 통해서 구한값 중 최소값을 찾아 그 행의 값을 모두 가져와라",
listV,INDEX(list,XMATCH(MIN(findV),findV)),

→step4, "step3에서 구한 값중 0을 제외한 모든 값을 가져와서 열방향으로 정렬해라",
SORT(FILTER(listV,listV<>0),,,1))
)(B7:C10,C2)

 
 
전체코드중 step1이 이 해찾기의 가장 핵심이 되는 key구문이다.
 

  1. SEQUENCE(2^ROWS(TOCOL(arr)),,0): 이 부분은 0부터 (2^열 수 - 1)까지의 1차원 배열을 생성한다. 이렇게 함으로써, 각 수는 가능한 조합의 인덱스를 나타나게 된다. 예를 들어, 배열이 3개의 열로 구성되어 있다면, 이 수열은 0, 1, 2, 3, 4, 5, 6, 7을 생성하게 되는것이다.
  2. SEQUENCE(,COLUMNS(TOROW(arr)),0): TOROW 함수는 배열을 열방향의 1차원 배열을 생성한다. 이 부분은 0부터 (열 수 - 1)까지의 수열을 생성하며,  이 수열은 각 열의 선택 여부를 결정하는 데 사용된다.
  3. MOD(...,2) : 각 인덱스를 열 수에 해당하는 이진수로 변환한다. 열 수로 나눈 후 정수 부분을 취하면 해당 열의 이진수 표현이 나오게된다. 이진수의 각 자릿수는 각 열의 선택 여부를 나타내는 것이다.
  4. ...*TOROW(arr): 각 열의 선택 여부에 따라 해당하는 값을 가져오게 된다. 

 
나머지 step부분은 눈으로 봐도 다 이해되는 구문이기에 주석을 한번 쓰윽 읽어보면 이해되리라 본다.
 
 

서랍님 해찾기.xlsx
0.01MB

 
 
 

댓글