네가 찾는 요약은 맨 아래에 있으니까 답답하면 그걸 봐



전제:
일단 나 같은 경우에는 알파카 마차+그랜드마스터 상인으로 무게 1200에 칸수 11칸이야

물물교역할 때 2개 지역의 1티어부터 5티어까지 칸수가 총 22개니까 22÷11=2번만 옮기면 딱 맞아


근데 보증서 쓰면서 옮기는 건데 임고보로 최대한의 이익을 보고 싶어하잖아? 그래서 그 경우의 수가 뭔지 엑셀로 계산해봤어



개당 가격과 무게를 표로 정리하면 아래와 같아

티어개당 가격(평균)개당 무게슬롯 수
1티어3,6001510+10+5 (3칸)
2티어6,000157+7+1 (3칸)
3티어12,000207+3 (2칸)
4티어28,000257+1 (2칸)
5티어128,000303 (1칸)

우선 1칸을 기준으로 대략적인 두카트 이익과 무게를 시트로 만들었어.

무게는 정확한데, 가격은 내가 던바튼 갈 때를 기준으로 평균값을 대충 때려넣었어


???: 않이 왜 18개임?


후술하겠지만, 처음에는 나도 22개로 만들었었어... 그러면 22개 중에서 11개를 조합하는 경우의 수를 계산시켜야 하니까

경우의 수는 22!÷(11!×11!)=705,432개가 나오겠네? 근데 코딩을 하니까 22!=1,124,000,727,777,607,680,000개를 먼저 나열하고 거기서 조합을 하더라고... 엑셀 시트 제한이 10,000,000개인데 제한에도 걸리고 어찌저찌 바꾸더라도 시스템 부하도 심하게 올 거 같아서 포기했어


그래서 생각을 해봤지


어차피 2개 지역을 가도 4티어짜리 7개, 5티어짜리 3개씩 총 4칸은 확정적으로 채우고 갈텐데 그러면 얘네는 빼도 되지 않을까?


그러면 4개를 먼저 채우겠지? 나머지 18개의 조합 중에서 7개를 채우면 되는 문제로 바뀌는 거야


이 때 경우의 수는 18!÷(11!×7!) = 31,824개로 줄어들고 왜인지는 모르겠지만 18!=6,402,373,705,728,000개의 경우의 수도 나열하더라고? 사실 작동만 되면 상관없는 게 아닐까? 난 전공자가 아니거든


그래서 코드를 GPT한테 짜라고 시켰어. 방금 그림의 A2에서 A19에서 7개의 조합을 추출해서 조합의 경우의 수를 A열부터 G열까지 뽑아내는 코드야.


function 조합찾기() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sourceSheet = ss.getSheetByName("금액"); // 금액 시트의 이름을 변경하세요.

  var resultSheet = ss.getSheetByName("결과"); // 결과 시트의 이름을 변경하세요.

  

  var sourceRange = sourceSheet.getRange("A2:A19"); // 금액 데이터 범위를 변경하세요.

  var resultRange = resultSheet.getRange(1, 1, 1, 7); // 결과 데이터가 시작될 범위를 변경하세요 (A열부터 G열까지).

  

  var data = sourceRange.getValues();

  var numRows = data.length;

  var combinations = [];

  

  // 7개의 값을 조합하여 배열에 저장

  for (var i = 0; i < numRows - 6; i++) {

    for (var j = i + 1; j < numRows - 5; j++) {

      for (var k = j + 1; k < numRows - 4; k++) {

        for (var l = k + 1; l < numRows - 3; l++) {

          for (var m = l + 1; m < numRows - 2; m++) {

            for (var n = m + 1; n < numRows - 1; n++) {

              for (var o = n + 1; o < numRows; o++) {

                var combination = [

                  data[i][0],

                  data[j][0],

                  data[k][0],

                  data[l][0],

                  data[m][0],

                  data[n][0],

                  data[o][0]

                ];

                combinations.push(combination);

              }

            }

          }

        }

      }

    }

  }

  

  // 결과 시트에 조합 출력

  resultRange.setValues(combinations);

}


코드는 대충 이렇고, 예상한대로 결과는 31,824개가 나왔어.


가격과 무게에는 4티어 7개와 5티어 7개의 가격, 무게 값을 미리 입력시켜놨어
4티어 7개는 무게가 25×7=175, 5티어 3개는 무게가 30×3=90이고 1, 2지역에서 각각 1뭉씩 챙기니까 무게는 (175+90)×2=530이 추가되어야 해

금액은 애매한데, 4티어는 1개당 28,000 두카트, 5티어는 1개당 128,000 두카트를 평균으로 잡아서 반영했어


그리고 무게 제한에 무게 1200 이하로 필터 걸고, 금액은 가격으로 1차, 가격 기준 내림차순으로 정렬한 거야.

(처음부터 가격으로 내림차순 정렬시키면 너무 오래 걸려)



상위 8개의 결과값이 나왔어. 무게랑 가격 차이는 없으니까 맨 위에 하나만 계산하면 되겠지?


1지역에서 2티어 7개 2뭉, 3티어 7+3개 2뭉, 4티어 1개 1뭉, 2지역에서 3티어 7+3개 2뭉


지역별로 무게 차이는 없으니까 어디에서 어떤 것부터 담느냐 차이만 있을 뿐이지 결과는 똑같아


이제 검산을 해보자


원래대로라면 4티어 7개 1뭉과 5티어 3개 1뭉을 담아야 되는 것도 고려해야 돼. 무게가 1200을 넘기는지 아닌지를 확인할 거야


1) 1지역

 a) 2티어 7개 2뭉 = 15×7×2=210

 b) 3티어 7+3개 2뭉 = 20×10=200

 c) 4티어 7+1개 2뭉 = 25×8=200

 d) 5티어 3개 1뭉 = 30×3=90


2) 2지역

 a) 3티어 7+3개 2뭉 = 20×10=200

 c) 4티어 7개 1뭉 = 25×7=175

 d) 5티어 3개 1뭉 = 30×3=90



총 무게 1,165로 알파카 마차 1,200보다 낮아. 계산이 틀리지 않았다는 이야기지


여담이지만, 앞의 시트에서 두 번째로 높은 가격은

1지역에서 2티어 7개 2뭉, 3티어 7개 1뭉, 4티어 1개 1뭉, 2지역에서 2티어 7개 1뭉, 3티어 7개 1뭉, 4티어 1개 1뭉이야.

4티어랑 5티어까지 감안하면
1지역에서 2티어 7개 2뭉, 3티어 7개 1뭉, 4티어 7+1개 2뭉, 5티어 3개 1뭉, 2지역에서 2티어 7개 1뭉, 3티어 7개 1뭉, 4티어 7+1개 2뭉, 5티어 3개 1뭉이야


무게도 확인했어 이 경우의 수는 2티어랑 4티어 값어치가 높은 경우에 활용하면 더 많이 차익을 벌 거 같아


귀찮으니까 첫 번째 경우의 수를 바탕으로 결론을 낼게


요약

1. 알파카 마차+그랜드마스터 상인 기준으로

2. 첫 번째 지역에서 3티어 2뭉, 4티어 1뭉, 5티어 1뭉을 챙겨

3. 두 번째 지역에서 3티어 2뭉, 4티어 1뭉, 5티어 1뭉을 챙겨

4. 빈 칸은 2티어 2뭉, 4티어 1개짜리 1뭉 채우면 가득 채우면서 최대 차익


반응 좋으면 교역 파트너랑 아무 것도 없는 뉴비 기준으로도 작성해볼게