로우코드를 사용하여 코딩 챌린지를 완료할 수 있나요? 물론이죠! 하지만 왜 그럴까요?
소프트웨어 엔지니어링 일자리에 지원할 때 현재 준비의 추세는 "LeetCode" 챌린지를 완료하는 것입니다. LeetCode는 소프트웨어 엔지니어가 잠재적인 면접 질문에 대비할 수 있도록 특별히 설계된 문제로 구성된 사이트입니다. 현재 2,000개가 넘는 챌린지가 있으며, 모두 후보자의 효율성, 패턴 및 문제 해결에 대한 지식을 테스트하도록 설계되었습니다.
그래서 여기에는 여러 언어로 코딩 기술을 테스트하기 위해 특별히 설계된 코딩 챌린지로 가득 찬 전체 사이트가 있습니다. C#과 JavaScript에서 시간을 보낸 저는 그 언어 중 하나를 사용하여 이러한 문제를 쉽게 해결해 볼 수 있었지만, 더 이상 그렇게 하지 않습니다. 저는 이제 로우코드 전도사입니다. 확실히 로우코드로 이러한 문제를 해결해 보아야 할까요?
물론 로우코드는 이런 종류의 문제를 위해 특별히 설계된 것은 아닙니다. 이것은 문제 해결을 위한 것이 아니라 비즈니스 애플리케이션을 구축하기 위한 플랫폼이며, 매우 효율적인 것에 초점을 맞춥니다. 그러나 이러한 과제가 후보자를 테스트하는 데 사용되는 데에는 이유가 있습니다. 실제 애플리케이션에 적용할 수 있기 때문입니다. 따라서 이 과제에 도전하여 완료할 수 있는지 확인해 보겠습니다. 그런 다음 이것이 실제 애플리케이션에 어떻게 적용될 수 있는지, 그리고 Mendix 그것을 만드는 데 사용될 수도 있습니다.
도전 과제 1: 두 가지 합계
이 과제는 숫자 배열을 취하고 두 숫자를 더했을 때 목표 값이 되는 인덱스를 찾는 것입니다. 표면적으로 보면 과제는 간단합니다. 배열을 가져와서 반복한 다음 각 값에 대해 다시 반복하여 목표 값을 만드는 데 필요한 값을 찾습니다. 비효율적이지만 간단합니다. 그래서 여기서 시작하겠습니다.
먼저, 배열을 나타내는 문자열, 대상 값을 나타내는 정수 속성, 조건을 만족하는 항목의 인덱스를 저장하는 데 필요한 몇 가지 값을 가져오는 간단한 엔티티를 만듭니다(아래에 표시). 효율성을 추적하기 위해 시작/종료 시간도 추가합니다.
이 엔티티를 만든 후에는 값을 입력하고 도전의 세부 정보를 추적하기 위한 양식을 만들 수 있습니다. 별 것 아닙니다. 여기서 핵심은 실용성입니다. 보시다시피, 마이크로플로우를 실행하기 위한 버튼도 추가해야 합니다. (마이크로플로우는 Mendix 함수를 호출합니다.)
문제 1: 문자열 배열. Mendix 문자열 배열에서 작동하도록 설계된 것은 아닙니다. 실제 솔루션에서 이 문제를 해결하려면 작업할 객체 목록이 있어야 합니다. 이 시점에서는 약간 부정행위처럼 느껴지므로 지금은 문자열로 작업해 보겠습니다.
커뮤니티 커먼즈 모듈은 다음에서 사용 가능합니다. Mendix Marketplace는 문자열을 목록으로 분할하는 데 사용할 수 있는 함수를 제공하며, 각 항목에 인덱스를 편리하게 레이블로 지정합니다. 그러나 값을 정수로 변환하지 않으므로 즉석에서 처리해야 합니다.
이제 값의 목록이 생겼으므로 목록 1을 반복하고, 첫 번째 값이 대상을 초과하지 않는다고 가정하고, 다시 반복하여 대상을 형성할 만큼 합산되는 다른 값이 있는지 확인하기만 하면 됩니다.
이런 식으로 설정하면 될 듯하니, 한 번 시도해 볼까요.
완벽해요! 완벽하게 작동합니다. 완료되었죠? 아니요. 그렇지 않습니다. 또 다른 과제가 있습니다. O(n2) 시간 복잡도보다 작은 알고리즘을 생각해 낼 수 있나요?
우리 솔루션에 중첩 루프가 있다는 점을 감안하면, 이것은 분명히 가장 효율적인 방법이 아닙니다. 그렇다면, 무엇이 가장 효율적인 방법일까요? 포인터입니다. 목록을 정렬한 다음 포인터를 시작 부분에, 포인터를 끝에 놓습니다. 두 항목의 합을 확인하고 너무 낮으면 첫 번째 포인터를 목록 위로 옮기고 너무 높으면 마지막 포인터를 목록 아래로 옮깁니다. 솔루션을 찾거나 목록이 부족해질 때까지 반복합니다.
이를 수행하려면 몇 가지 주요 과제가 있습니다. 첫째, 정렬된 목록입니다. 목록은 문자열로 저장되므로 값으로 정렬하는 것은 작동하지 않습니다. 루프를 실행하고 각 값을 정수로 변환해야 합니다.
다음으로 인덱스 값을 사용하여 목록에 액세스할 수 없습니다. Mendix 그래서 우리는 두 개의 인덱스 포인터를 가질 수 없습니다. 하지만 간단한 해결책이 있는데, 목록 작업 "Head" 액션을 사용하여 목록에서 첫 번째 객체를 가져옵니다. 그런 다음 목록의 두 사본을 보관할 수 있습니다. 하나는 오름차순으로 정렬하고 하나는 내림차순으로 정렬합니다. 목록을 살펴보면서 현재 확인 중인 항목이 너무 높거나 너무 낮으면 해당 목록에서 제거하기만 하면 됩니다.
이 애플리케이션은 의도한 대로 작동하지만 작은 숫자 목록에 대한 두 개의 루프의 무차별 대입 접근 방식보다 덜 효율적입니다. 그러나 값의 개수가 늘어나면 훨씬 더 효율적이 됩니다.
이는 전통적인 코드에서 하는 일이 약간의 창의적인 사고를 통해 로우코드에서도 가능하다는 것을 보여줍니다. 이제 한 단계 더 나아가, 이것이 실제 비즈니스 문제라면 어떨까요?
우리는 제품을 포장하는 회사에서 일하고 있으며, 상자에 두 개를 포장하고 싶다고 가정해 보겠습니다. 하지만 상자의 무게 제한과 일치해야 합니다. 더 높거나 낮을 수는 없습니다. 이를 위해 우리는 함께 포장했을 때 목표 값과 일치하는 두 개의 제품을 재고에서 찾아야 합니다. 익숙한 이야기인가요?
먼저 이것을 해보자 Mendix 방법을 선택하고 처음부터 적절한 엔터티에 데이터를 로드합니다. 무작위 값 목록을 생성하고 이전에 만든 결과 엔터티에 연결합니다. 또한 제품을 추적할 수 있도록 지속 가능하게 만듭니다.
이제 시작할 목록이 있으므로 두 번째 시도에서 얻은 코드를 리팩토링할 수 있습니다. 원래 Microflow의 이 섹션은 하위 Microflow로 쉽게 추출하여 원래 함수와 새 함수 모두에서 사용할 수 있습니다.
이제 데이터를 처리하는 세 가지 방법이 있습니다(숫자 목록이 생성되면 문자열 배열도 채워지므로 처음 두 함수는 계속 작동합니다).
이렇게 하면 첫 번째 정확한 일치 항목을 찾을 수 있습니다. 어떤 제품이 포장되었고 어떤 제품과 페어링되었는지 추적할 방법이 필요합니다. 이를 수행할 수 있는 방법은 많지만, 제품에 자체 연결을 사용할 것입니다. 이렇게 하면 필요할 경우 제품 간에 쉽게 이동할 수 있습니다. 또한 엔터티 간의 연결을 설정하여 메인 배치가 삭제되면 모든 제품을 자동으로 삭제하고, 엔터티의 이름을 "배치"와 "제품"으로 변경하여 명확하게 유지하려고 했습니다.
또한 Microflow가 일치 항목을 찾는 방식을 변경해야 합니다. 더 이상 하나의 정확한 일치 항목만 찾는 것이 아니기 때문입니다. 이제 모든 정확한 일치 항목을 찾고 싶습니다. 목록을 정렬하는 작업을 다시 데이터베이스에 넣어서 최적화를 추가할 수도 있습니다.
보시다시피, 이제 매치가 발견되면 두 제품을 서로 연결한 다음 검사 중인 목록에서 제거합니다. 그런 다음 다음 두 제품으로 이동합니다.
완성된 애플리케이션의 스크린샷은 아래와 같습니다. 표시된 배치에서 764개 제품을 페어링하는 데 성공한 것을 볼 수 있습니다. 이것은 데이터를 보여주는 가장 좋은 방법은 아니며, 연관성의 각 측면에서 표시되기 때문에 모든 제품을 효과적으로 두 번 보여주지만 작동한다는 것을 보여줍니다!
어떤 것이든, 이 데이터를 구조화하는 가장 좋은 방법은 아마도 "Box"의 세 번째 엔터티를 갖고 거기에서 두 제품과 연관시키는 것이라는 사실을 강조합니다. 그런 다음 고유한 상자 ID를 생성하고 각 제품을 한 번만 표시할 수 있습니다.
여기서부터는 몇 단계만 거치면 고객, 택배 배달원, 심지어 매장까지 연결할 수 있습니다. Mendix 이러한 애플리케이션을 빌드하는 데 쉽게 사용할 수 있습니다. 비용 양식이나 휴가 요청 시스템뿐만 아니라요. 저희는 "로우코드" 플랫폼일 수 있지만, 복잡한 문제를 해결하는 애플리케이션을 빌드하는 데 사용할 수 없다는 것은 아닙니다. 로우코드로는 충분하지 않을 수 있지만, Java 작업으로 애플리케이션을 확장할 수 있는 기능이 항상 있습니다.
계속 지켜봐 주시기 바랍니다 내 다음 포스트 여기서 저는 가장 어려운 과제 중 하나인 "가장 많은 물을 담을 수 있는 용기"에 도전했습니다. 이는 여러 기둥 높이의 배열을 사용하여 어느 쌍의 기둥이 가장 많은 물을 담을 수 있는 용기를 형성하거나 그 사이에 가장 큰 직사각형 면적을 갖는지 알아내는 것입니다.












