LeetCode에서 Mendix: 던전에 들어가다 | Mendix

메인 컨텐츠로 가기

LeetCode에서 Mendix: 던전에 들어가다

Leetcode에서 Mendix - 던전에 들어가기 - 신화의 던전에 들어가는 남자를 보여주는 블로그 썸네일

이 시리즈를 처음 시청하는 분이라면 지금까지 일어난 일을 요약해 보겠습니다. 개발자가 잠재적인 인터뷰를 준비하는 데 사용하는 LeetCode 문제를 로우코드를 사용하여 해결하는 것이 재미있는 도전이 될 것이라고 생각했습니다. 첫 번째 도전에서 – 부분의 합계 – 우리는 쉬운 문제를 시작점으로 삼고 사용했습니다. Mendix 이를 해결하기 위해. 다음으로, 우리는 더 높은 난이도의 도전에 나섰습니다. 이에 대한 자세한 내용은 게시물에서 확인할 수 있습니다. 두 개의 탑.

완벽한 퀘스트를 찾아서

이제 어려운 도전을 시도할 때가 되었는데, 여기서부터 일이 조금 까다로워지기 시작합니다.

나는 시도할 적절한 도전을 찾기 위해 오랜 시간을 보냈습니다. 내가 마주친 대부분의 문제는 더 적은 코드 줄로 더 많은 효율성을 짜내기 위해 약간의 변형을 가했을 뿐, 이전의 배열 기반 문제를 다시 해시한 것에 불과했기 때문입니다. 우리가 실제로 그렇게 할 수 없다고 말하는 것이 안전하다고 생각합니다. Mendix 그리고 이 기사의 요점은 분명히 그것이 아닙니다.

내가 마주친 다음 문제 세트는 다차원 배열과 관련이 있었습니다. 기본 프로그래밍 언어에서 비교적 간단한 개념이며 데이터 그리드를 저장하는 빠른 방법입니다. 테이블 기반 시스템에서 Mendix, 그렇게 우아하지는 않습니다. 그러나 한 가지 문제가 실용적으로 할 수 있는 것으로 눈에 띄었고 흥미로운 개념이기도 했습니다. 도전 과제 174: “던전 게임”.

던전에 들어가다

우리 탐구의 주요 요소:

  • 용감하고 두려움을 모르는 기사. 🛡
  • 구출을 기다리는 죄수. ⛓
  • 던전 🚨

이 챌린지에서 우리는 용감한 기사가 마지막 방의 죄수를 구하기 위해 모험해야 하는 던전을 만들 것입니다. 편리하게도 던전은 방의 정사각형 격자이며 각 방에는 다음 중 하나가 있습니다.

  1. 아무것도 아닙니다. 0이고 아무것도 하지 않습니다.
  2. 악마 👿 – 음수이며 기사의 체력 점수를 낮춥니다.
  3. 마법의 구슬 🔮 – 양수이며 기사의 체력 점수를 높여줍니다.

우리의 용감한 기사는 왼쪽 위에서 오른쪽 아래까지 던전을 통과해야 하는데, 그는 왼쪽과 위로 가는 것에 대한 병적인 두려움을 가지고 있기 때문에 오른쪽이나 아래로만 움직여야 합니다. 마지막 부분은 제가 만들었을 수도 있고, 그냥 우리가 루프에 빠지지 않도록 임의로 정한 규칙일 뿐입니다.

던전 마스터로서 우리의 임무는 기사가 마지막 방에 도달하고 살아남기 위해 가져야 하는 최소 체력이 얼마인지 알아내고, 체력 포인트 1로 마무리하는 것입니다.

우리가 던전을 만드는 곳

우선, 던전을 나타내는 데이터를 저장할 방법이 필요합니다. 몇 가지 옵션이 있습니다.

하나는 방의 직선 목록을 가질 수 있는 쉬운 방법이 있습니다. 탐색하려면 오른쪽으로 이동하려면 한 행을 이동하고, 아래쪽으로 이동하려면 n개의 방을 이동하면 됩니다. 여기서 n은 정사각형의 셀 수입니다. 하지만 도전 과제가 다차원 배열을 포함하는 것을 고려하면 약간 부정행위처럼 느껴집니다.

다음에는 더 많은 것이 있습니다 Mendix 각 방을 여전히 목록으로 유지하고 행과 열 인덱스를 참조로 사용하고 각 방에서 오른쪽 방과 아래 방으로의 링크를 저장할 수 있는 방법입니다. 이렇게 하면 연결을 통해 한 방에서 다음 방으로 쉽게 이동할 수 있습니다. 하지만 여전히 다차원 배열의 공정한 표현은 아닙니다.

마지막으로, 이 연습을 시작하는 방법은 먼저 셀 행을 나타내는 "행" 엔터티를 만들고, 이를 순서대로 유지하기 위한 인덱스 속성을 만듭니다. 다음으로, 해당 행의 각 방을 나타내는 "셀"이라는 자식 엔터티를 만들고, 다시 한 번 이를 순서대로 유지하기 위한 인덱스를 만듭니다. 실제로는 다차원 배열처럼 훨씬 더 효율적으로 탐색할 수 없습니다. Mendix 접근 방식을 바꾸었지만, 우리는 가능한 한 간략한 내용을 유지하려고 노력하고 있습니다.

데이터를 어떻게 저장할 것인가

데이터 저장소가 있으니 숫자로 채워 봅시다. 이 부분에서는 효율성에 대해 걱정하지 않으므로 중첩 루프 몇 개로 작업을 완료할 수 있습니다. 또한 Dungeon 엔티티에 그리드 크기와 최대 셀 값에 대한 속성을 추가하여 다양한 범위에 맞게 구성할 수 있습니다. 지금은 둘 다 기본적으로 10으로 설정되어 있습니다. 데이터 로드의 본문은 다음과 같습니다. 간단합니다.

본문 그래프

이것을 화면에 출력하고 갤러리 위젯에 약간의 SASS 스타일을 추가하면 예시의 던전과 매우 유사한 것을 얻을 수 있습니다.

예시 유사품

우리가 경로를 계획하는 곳

이제 우리는 나이트가 오른쪽과 아래로만 움직일 수 있다는 것을 염두에 두고 던전을 횡단해야 합니다. 우리는 그리드 참조 0-0에서 왼쪽 상단 모서리에서 시작하여 거기에서 다음 최적의 단계가 무엇인지 확인합니다. 위의 예에서 그것은 오른쪽 단계가 될 것입니다. 우리는 가장 높은 각각의 값을 제공하는 단계를 취하고 싶습니다. 이 경우 0입니다. 또한 나이트의 체력과 체력이 얼마나 낮아지는지 추적해야 하므로 현재 체력과 가장 낮은 체력에 대한 다른 속성을 던전에 추가하는 것이 좋습니다.

우리의 대담한 기사는 첫 번째 셀에서 여정을 시작합니다. 그는 이미 체력을 1포인트 잃었기 때문에 좋은 시작이 아니므로, 그를 첫 번째 셀에 두고 그의 시작 체력을 계산하여 흐름을 시작하겠습니다.

심장 건강 계산

이 기능을 실행하면 첫 번째 셀이 업데이트되어 해당 사용자의 현재 위치와 건강 점수가 업데이트됩니다.

건강 점수

다음으로 던전을 통과하는 경로를 찾아 다음으로 좋은 단계를 거치도록 합시다. 이를 수행하는 한 가지 방법은 오른쪽과 아래의 옵션을 비교하여 건강에 가장 큰 영향을 미치는 옵션을 선택하는 재귀적 Microflow 호출을 사용하는 것입니다.

재귀적 마이크로플로우 호출

이 함수를 사용하면 해당 경로를 매핑할 수 있습니다. 반드시 최상의 경로는 아니지만 적어도 실행 가능한 경로입니다. 또한 가장 낮은 체력 감소가 어디인지 확인할 수 있으므로 그보다 한 포인트 더 많은 포인트로 시작하면 적절한 체력 값을 얻을 수 있습니다. 아래 예의 경우 나이트를 10 체력으로 시작해야 합니다.

경로 지도

이제 던전을 통과하는 경로가 하나 있고, 기사가 죄수에게 도달할 수 있는 체력 점수도 있습니다. 어떻게 그것이 가장 좋은 경로인지, 즉 가장 낮은 체력 포인트가 필요한 경로인지 알 수 있을까요? 답은 알 수 없다는 것입니다. 이를 이해하려면 각 지점에서 최적의 단계를 계산하고 기사가 여정에서 겪을 체력 부족량을 추적하는 하향식 접근 방식을 시도해야 합니다.

우리가 더 나은 경로를 찾는 곳

이를 위해 우리는 끝에서 죄수부터 시작하여 밖으로 나가 그리드를 따라 올라갑니다. 모든 단계에서 우리가 있는 칸에서 다음 칸으로 이동하는 데 드는 상대적 비용을 계산해야 합니다. 그리드에서 예를 들어보겠습니다.

그리드 예제 1
그리드 예제 2
그리드 예제 3
그리드 예제 4

  1. 우리는 오른쪽 하단의 0에서 5 또는 -4로 이동하는 상대적 비용을 계산합니다.
  2. -4로 변경하면 체력이 4 감소합니다.
  3. 5로 이동해도 체력이 소모되지 않습니다. 실제로 체력을 얻으므로 상대적인 비용은 0입니다.
  4. 마지막으로 -2 칸에서 가장 좋은 단계의 비용을 계산합니다. 이는 -2에서 0까지이며, 따라서 해당 칸의 최종 비용은 -2입니다.

에서 Mendix 관점에서, 이는 그리드를 통해 뒤로, 행별로, 셀별로 반복하기 위해 Microflow가 필요하다는 것을 의미합니다. 1단계에서 각 셀에 속성을 추가하여 셀의 상대적 비용을 저장하고 화면에 표시할 수 있습니다.

화면에 셀의 상대적 비용 표시

다음으로, 필요한 행 목록을 가져오고 각 행을 역순으로 반복하는 루프를 설정합니다. 즉, 행을 추적할 인덱스와 첫 번째 행(혹은 어떻게 보느냐에 따라 마지막 행!)에 도달할 때까지 반복을 계속할 while 루프가 필요합니다.

역순 루프 반복

보시다시피, 우리는 또한 몇 개의 빈 리스트를 만들 수 있습니다. 하나는 상대적 비용을 업데이트할 때 셀에 대한 모든 변경 사항을 수집하여 마지막에 대량 업데이트를 수행할 수 있도록 하고, 다른 하나는 이전 반복에서 셀을 저장하여 두 번 검색할 필요가 없도록 합니다.

이 새로운 루프 안에서 진짜 마법이 일어납니다. 현재 행 반복에 대한 셀 목록을 가져와서 그 안의 모든 셀을 반복합니다. 각 셀에 대해 그리드에서 어디에 위치하는지 확인합니다. 아래쪽이나 오른쪽에 있는 경우 두 개의 가능한 종료 지점이 있는 셀과 다르게 처리해야 하기 때문입니다.

새로운 루프의 내부 모습

각 셀에 대해 최상의 종료 지점을 기준으로 상대 비용을 업데이트해야 합니다. 맨 아래 행과 마지막 열의 경우 오른쪽 또는 아래에 있는 셀에 현재 셀의 값을 더한 값입니다. 다른 모든 셀에서는 현재 셀의 값에 가장 큰 종료 지점의 값을 더한 값입니다. 최종 값이 0보다 큰 경우 상대 비용이 없으므로 값을 0으로 재설정한다는 점을 명심하세요. 가장 복잡한 경우 다음과 같은 계산이 나옵니다.

셀 비용 계산

그 루프는 전체 그리드를 통과하여 상대 비용을 왼쪽 위로 올려 첫 번째 셀에 도달하고 두 루프를 모두 빠져나갈 때까지 진행합니다. 이 시점에서 필요한 최소 시작 체력을 계산합니다. 이는 첫 번째 셀의 상대 비용에 1을 더한 값이며, 던전에 저장합니다.

이 시점에서 저는 또한 던전의 크기를 구성하고 재생성하여 더 작은 던전에서 테스트할 수 있는 기능을 추가했습니다. 지금은 이렇게 보이고 올바른 답을 찾고 있는 것 같습니다!

그리드 이동 예제 1

그리드 이동 예제 2

우리의 성공을 축하하는 날

그럼 다 됐어요! 기술적으로 이 어려운 작업을 완료했습니다. 축하합니다! 성능을 추적하지 않았고 표준 코드 솔루션만큼 성능이 좋지는 않을 것 같지만, 제가 보기에는 꽤 반응성이 좋고 우아한 솔루션처럼 보입니다. 계속 진행한다면 최적의 경로를 추적하고 고귀한 기사가 이 사악한 던전을 통과하여 위험에 처한 포로를 구출하기 위해 이동해야 할 경로를 표시하는 것으로 돌아가고 싶을 겁니다! 보고 싶은 사람이 있으면 알려주세요.

로우코드에서 다양한 과제를 테스트하는 동안 함께 읽어주셔서 감사합니다. 다음에 해결하고 싶은 문제가 있나요? 연락해서 제안을 남겨주세요!

 

언어를 선택하세요