중간 정도의 난이도에 도전하다
이전 게시물에서 저는 로우코드가 단순한 단일 형태 솔루션 이상임을 증명하기 위해 leetcode.com 문제를 완료하는 과제를 맡았습니다. 로우코드는 더 어려운 기술 문제도 해결하는 데 필요한 유연성을 갖추고 있습니다. 제가 선택한 것은 Two Sum으로, 사이트의 첫 번째 과제이자 "쉬운" 과제 중 하나입니다(여기서 모든 내용을 읽을 수 있습니다).
이번에는 조금 더 어려운 문제를 다루려고 합니다. 11번째 도전 과제 - “물이 가장 많이 담긴 용기” – 중간 난이도의 도전입니다. 이 문제는 기둥 높이의 배열을 취하고 가장 많은 물을 담을 수 있는 용기를 형성하는 기둥 쌍을 찾아내는 것입니다. 또는 그 사이에 가장 큰 직사각형 면적을 갖는 기둥 쌍을 찾아내는 것입니다.
“가장 많은 물이 담긴 용기” – 어디서부터 시작해야 할까
지난 도전에서 우리는 도전을 그대로 받아들이고 공평한 경쟁 환경에서 접근하는 지점에서 시작해서 가능한 한 기본적인 접근 방식을 사용한 다음, 로우코드에서 어떻게 해야 하는지에 기대었습니다. 이번에는 건너뛰고 바로 로우코드에서 이 문제를 해결해 보겠습니다.
먼저, 데이터가 필요합니다. 결과를 저장할 엔티티와 "타워" 데이터를 생성할 자식 엔티티를 만들 것입니다.
이렇게 하면 무작위로 일련의 값을 생성하고 이를 정해진 순서대로 배치하고 이를 그룹화하여 시도 결과를 저장할 수 있는 공간이 생깁니다. 그러나 무작위로 데이터 세트를 생성하기 전에 예제를 기반으로 값 목록을 만드는 것이 가장 좋습니다. 로우코드로 이를 수행하는 것은 특별히 우아하지는 않지만 간단합니다. 각 항목을 한 번에 하나씩 만들고, 시도에 연결하고, "Attempt" 엔터티를 반환하기만 하면 됩니다.
보기 좋지는 않지만 우리가 가야 할 곳으로 안내해줍니다. 오른쪽 차트는 우리가 방금 만든 데이터에서 렌더링한 것입니다.
첫 번째 시도 - 무차별 대입
우리는 무차별 대입 시도로 기본을 시작할 것입니다. 이것이 최상의 해결책이 되지 않을 것이라는 것은 확실하지만, 더 효율적인 버전으로 넘어갈 때 답을 확인할 수 있도록 주어진 배열에 대한 올바른 답을 찾는 것은 항상 가치가 있습니다. 이를 위해 중첩 루프를 사용할 것입니다. 첫 번째 루프는 모든 Towers를 통과하고 두 번째 루프는 외부 루프에서 현재 반복자를 따르는 모든 Tower를 통과합니다.
Microflow에서 볼 수 있듯이 효율성은 O(n2)로 그리 높지 않지만, 올바른 답이 나오는지 확인해 보겠습니다.
결과 표에서 볼 수 있듯이, 우리는 올바른 결론에 도달했습니다. 대단합니다. 다음 단계에서는 더 효율적인 방식으로 할 수 있는지 알아보겠습니다.
다음 시도 - 효율성을 향해 나아가자
그렇게 하려면 컨테이너를 찾는 가장 빠른 방법이 무엇인지 알아내야 하는데, 이는 마지막 예제와 마찬가지로 포인터를 사용하는 것입니다.
양쪽 끝에서 시작해서 안쪽으로 이동하면서 쌍에서 가장 높은 타워를 유지하고 다른 포인터를 이동합니다. 각 볼륨을 확인하고 로그를 유지한 다음 정렬하여 가장 큰 볼륨을 찾아야 합니다. 이런 식으로 반복하면 가장 큰 너비에서 가장 큰 높이로 이동하고 볼륨을 계산하기 위한 모든 최상의 조합을 확인합니다.
이를 위해 마지막 연습의 단점을 해결하겠습니다. Mendix, 기본적으로 인덱스로 메모리 내 목록의 요소를 검색하는 것을 허용하지 않습니다. 데이터베이스에서 끌어올 때 쉽게 할 수 있지만 그다지 효율적이지 않습니다. 이를 수정하려면 간단한 Java 작업을 만들 수 있습니다.
기능 확장 Mendix Java 작업으로
실제 장점 중 하나는 Mendix 도구 상자에 있는 도구로만 플랫폼에 제한되지 않는다는 것입니다. 마켓플레이스에서 무언가를 가져오거나 사용자 정의 Java 작업을 만들어 기능을 빠르고 쉽게 확장할 수 있습니다! 우리의 경우 이 함수를 만들고, 목록을 전달한 다음 인덱스를 전달한 다음 적절한 객체를 반환하는 것은 매우 간단합니다.
이제 우리는 대부분의 프로그래밍 언어에서와 마찬가지로 목록에 액세스할 때 포인터를 사용할 수 있습니다. 효율적인 패스를 위해, 양쪽 끝에서 체크를 추적하기 위한 두 개의 정수 포인터와 결과를 넣을 목록이 필요합니다.
그런 다음 While 루프를 시작하고 두 포인터가 하나의 Tower에서 만날 때까지 반복을 계속합니다. 이 지점에서 멈춰야 한다는 것을 알게 됩니다. 이 루프 안에서 각 포인터에 대한 Tower를 가져오고 Tower 사이에 포함될 수 있는 볼륨을 계산합니다. 루프를 돌면서 Attempt 엔터티에서 앞서 추가한 속성에서 찾은 가장 큰 볼륨도 추적합니다. 이렇게 하면 가장 큰 볼륨이 무엇인지, 그리고 어떤 두 Tower가 그 볼륨을 만드는지 알 수 있습니다.
루프 반복을 끝내고 다음으로 넘어가기 전에, 방금 비교한 두 개의 타워 중 어느 것이 더 높은지 확인해보겠습니다. 타워 1이라면 포인터 2를 줄이고, 타워 2라면 포인터 1을 늘립니다. 이렇게 하면 포인터가 같은 타워에서 만나서 While 루프 이스케이프 절을 만족할 때까지 포인터가 들어옵니다. 모두 이렇게 생겼습니다...
효율성 시도의 결과
마지막에 몇 가지 커밋을 해서 시도를 추적하면 끝입니다. 그런 다음 새 프로세스를 실행하고 결과를 볼 수 있습니다.

여기서 우리는 무차별 대입 방식으로 36번 시도한 것과는 달리 단 6번의 시도로 올바른 결론에 도달했다는 것을 알 수 있습니다. 이는 삶을 조금 더 쉽게 만들기 위해 소량의 코드를 추가하여 로우코드로 성공적으로 완료한 또 다른 과제를 의미합니다.








