Swift Coding Test Course, Finding Parenthesis Arrangement to Make Minimum Value

Problem: Finding Parentheses Arrangement that Minimizes Value

Algorithm problems play an important role in coding tests, and especially problems related to parentheses are often presented. In this article, we will address the challenge of finding the minimum value by considering all possible parentheses arrangements for a given expression. We will explain the theories and algorithms necessary to solve this problem in detail.

Problem Description

There is a string composed of given numbers and operators. This string can be calculated by placing parentheses in various ways. Our goal is to find the minimum value that can be obtained by placing parentheses.

Input: “1+2*3-4*5”
Output: -1

Approach to the Problem

This problem can be solved using Dynamic Programming. We need to consider all possible placements of parentheses for the given expression, so the Divide and Conquer technique will also be utilized.

1. Parsing the Expression

First, we need to separate the numbers and operators from the expression and store them in arrays. For example, we will convert the string “1+2*3-4*5” into the following format.

    Number array: [1, 2, 3, 4, 5]
    Operator array: ['+', '*', '-', '*']
    

2. Defining Dynamic Programming

Dynamic programming is a method that stores the results of each subproblem through several auxiliary arrays for future use. By using memoization, we can reduce time complexity by reusing results that have already been calculated.

3. Implementing the Recursive Function

We will calculate all possible combinations through a recursive function. This function divides based on the given index and calculates by placing parentheses differently for each side.

Swift Implementation

Below is the complete code implemented in the Swift programming language.


    func minValue(expression: String) -> Int {
        var numbers: [Int] = []
        var operators: [Character] = []
        
        // Step 1: Parse the expression
        var currentNumber = ""
        for char in expression {
            if char.isNumber {
                currentNumber.append(char)
            } else {
                numbers.append(Int(currentNumber)!)
                operators.append(char)
                currentNumber = ""
            }
        }
        numbers.append(Int(currentNumber)!)
        
        // Step 2: Create a memoization table
        var memo: [[Int?]] = Array(repeating: Array(repeating: nil, count: numbers.count), count: numbers.count)
        
        // Step 3: Define a recursive function
        func compute(_ left: Int, _ right: Int, _ op: Character) -> Int {
            switch op {
            case '+': return left + right
            case '-': return left - right
            case '*': return left * right
            default: fatalError("Unknown operator")
            }
        }

        // Recursive function for minimum value
        func findMinValue(left: Int, right: Int) -> Int {
            if left == right {
                return numbers[left]
            }
            if let result = memo[left][right] {
                return result
            }

            var result = Int.max
            for i in left..<right {="" let="" leftvalue="findMinValue(left:" left,="" right:="" i)="" rightvalue="findMinValue(left:" i="" +="" 1,="" right)="" computedvalue="compute(leftValue," rightvalue,="" operators[i])="" result="min(result," computedvalue)="" }="" memo[left][right]="result" return="" calculate="" the="" minimum="" value="" for="" whole="" expression="" findminvalue(left:="" 0,="" numbers.count="" -="" 1)="" <="" code=""></right>
<h3>Time Complexity Analysis</h3> <p>The time complexity of this algorithm is O(N^3). N is the number of digits, as we need to evaluate the operators for each combination of two digits. However, due to the use of memoization, we do not recalculate the same subproblems repeatedly.</p> <h3>Conclusion</h3> <p>In this lecture, we covered the problem of "Finding Parentheses Arrangement that Minimizes Value" and explored the process of solving the problem and its implementation in Swift. I hope you achieve good results in coding tests through various approaches and optimization techniques to algorithm problems. Thank you!</p> <p></p> <div id="jp-relatedposts" class="jp-relatedposts"> <h3 class="jp-relatedposts-headline"><em>관련</em></h3> </div>
<footer class="entry-footer"> <span class="byline"><span class="author vcard"><img alt="" src="https://secure.gravatar.com/avatar/5b7f47db621d1eab02540d35048be506?s=49&amp;d=mm&amp;r=g" srcset="https://secure.gravatar.com/avatar/5b7f47db621d1eab02540d35048be506?s=98&amp;d=mm&amp;r=g 2x" class="avatar avatar-49 photo" height="49" width="49" decoding="async"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://atmokpo.com/w/en/author/root/">root</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://atmokpo.com/w/34872/" rel="bookmark"><time class="entry-date published" datetime="2024-11-01T09:32:59+00:00">2024/11/01</time><time class="updated" datetime="2024-11-01T11:26:10+00:00">2024/11/01</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://atmokpo.com/w/category/swift-coding-test/" rel="category tag">Swift Coding Test</a></span> </footer><!-- .entry-footer -->
<nav class="navigation post-navigation" aria-label="Posts"> <h2 class="screen-reader-text">Post navigation</h2> <div class="nav-links"><div class="nav-previous"><a href="https://atmokpo.com/w/34870/" rel="prev"><span class="meta-nav" aria-hidden="true">Previous</span> <span class="screen-reader-text">Previous post:</span> <span class="post-title">Swift Coding Test Course, Finding Minimum Value 2</span></a></div><div class="nav-next"><a href="https://atmokpo.com/w/34874/" rel="next"><span class="meta-nav" aria-hidden="true">Next</span> <span class="screen-reader-text">Next post:</span> <span class="post-title">Swift Coding Test Course, Finding the Longest Common Subsequence</span></a></div></div> </nav>
<aside id="secondary" class="sidebar widget-area"> <section id="block-2" class="widget widget_block widget_search"><form role="search" method="get" action="https://atmokpo.com/w/en/" class="wp-block-search__button-outside wp-block-search__text-button wp-block-search"><label class="wp-block-search__label" for="wp-block-search__input-1">Search</label><div class="wp-block-search__inside-wrapper "><input class="wp-block-search__input" id="wp-block-search__input-1" placeholder="" value="" type="search" name="s" required=""><button aria-label="Search" class="wp-block-search__button wp-element-button" type="submit">Search</button></div></form></section><section id="block-10" class="widget widget_block"><ul class="wp-block-page-list"><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/c-coding-test-tutorials/">C++ Coding Test Tutorials</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/collection-of-c-coding-test-tutorials/">Collection of C# Coding Test Tutorials</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/deep-learning-automated-trading/">Deep learning Automated trading</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/deep-learning-natural-language-processing/">Deep learning natural language processing</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/english-sentence-study/">English sentence study</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/flutter-course/">Flutter course</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/gan-deep-learning-course/">GAN deep learning course</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/java-android-app-development/">Java Android app development</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/java-coding-test/">Java Coding Test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/javascript-coding-test/">Javascript Coding Test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/kotlin-android-app-development/">Kotlin Android app development</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/kotlin-coding-test/">Kotlin coding test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/python-auto-trading/">Python Auto Trading</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/python-coding-test/">Python Coding Test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/python-study/">Python Study</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/pytorch-study/">PyTorch Study</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/react-basics-course/">React basics course</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/spring-boot-backend-development/">Spring Boot backend development</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/swift-coding-test/">Swift Coding Test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/swift-iphone-app-development-swiftui/">Swift iPhone app development (SwiftUI)</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/swift-iphone-app-development-uikit/">Swift iPhone app development (UIKit)</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/unity-basic/">Unity Basic</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/using-hugging-face/">Using Hugging Face</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/uwp-programming/">UWP Programming</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/wpf-programming/">WPF Programming</a></li></ul></section><section id="listcategorypostswidget-3" class="widget widget_listcategorypostswidget"><h2 class="widget-title">Category Post List</h2><ul class="lcp_catlist" id="lcp_instance_listcategorypostswidget-3"><li><a href="https://atmokpo.com/w/34776/">Swift Coding Test Course, Making Maximum Value by Grouping Numbers</a></li><li><a href="https://atmokpo.com/w/34774/">Swift Coding Test Course, Sorting Numbers 2</a></li><li><a href="https://atmokpo.com/w/34772/">Swift Coding Test Course, Sorting Numbers 1</a></li><li><a href="https://atmokpo.com/w/34770/">Swift Coding Test Course, Sorting Numbers</a></li><li><a href="https://atmokpo.com/w/34768/">Swift Coding Test Course, Finding Prime Numbers</a></li><li><a href="https://atmokpo.com/w/34766/">Swift Coding Test Course, Finding the Minimum Among Prime &amp; Palindrome Numbers</a></li><li><a href="https://atmokpo.com/w/34764/">Swift Coding Test Course, Salesman’s Concerns</a></li><li><a href="https://atmokpo.com/w/34762/">Swift Coding Test Course, Segment Tree</a></li><li><a href="https://atmokpo.com/w/34760/">Swift Coding Test Course, Selection Sort</a></li><li><a href="https://atmokpo.com/w/34758/">Swift Coding Test Course, Determining Line Segment Intersection</a></li></ul><ul class="lcp_paginator"><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=7#lcp_instance_listcategorypostswidget-3" title="7" class="lcp_prevlink">&lt;&lt;</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=1#lcp_instance_listcategorypostswidget-3" title="1">1</a></li><span class="lcp_elipsis">...</span><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=3#lcp_instance_listcategorypostswidget-3" title="3">3</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=4#lcp_instance_listcategorypostswidget-3" title="4">4</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=5#lcp_instance_listcategorypostswidget-3" title="5">5</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=6#lcp_instance_listcategorypostswidget-3" title="6">6</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=7#lcp_instance_listcategorypostswidget-3" title="7">7</a></li><li class="lcp_currentpage">8</li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=9#lcp_instance_listcategorypostswidget-3" title="9">9</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=10#lcp_instance_listcategorypostswidget-3" title="10">10</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=11#lcp_instance_listcategorypostswidget-3" title="11">11</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=12#lcp_instance_listcategorypostswidget-3" title="12">12</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=13#lcp_instance_listcategorypostswidget-3" title="13">13</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=14#lcp_instance_listcategorypostswidget-3" title="14">14</a></li><li><a href="https://atmokpo.com/w/34872/?lcp_pagelistcategorypostswidget-3=9#lcp_instance_listcategorypostswidget-3" title="9" class="lcp_nextlink">&gt;&gt;</a></li></ul></section><section id="block-3" class="widget widget_block"> <div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"> <h3 class="wp-block-heading">최신 글</h3> <ul class="wp-block-latest-posts__list wp-block-latest-posts"><li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37979/">Unity 2D Game Development, Create a Platform Game Including Jumps, Obstacles, and Enemies.</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37977/">Unity 2D Game Development, Adding Effects Using Particle System Implementing visual effects such as explosions and flames using the particle system.</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37973/">Unity 2D Game Development, Touch Input and Mobile Game Development Creation of 2D games utilizing touch input on mobile devices.</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37975/">Unity 2D Game Development, Power-Up and Buff System Creating a power-up system that temporarily enhances the player’s abilities.</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37971/">Unity 2D Game Development, Quest and Mission System Creating a quest system where rewards are given for achieving specific goals.</a></li> </ul></div></div> </section> </aside><!-- .sidebar .widget-area -->
<footer id="colophon" class="site-footer"> <div class="site-info"> <span class="site-title"><a href="https://atmokpo.com/w/en/" rel="home">라이브스마트</a></span> <a href="https://wordpress.org/" class="imprint"> Proudly powered by WordPress </a> </div><!-- .site-info --> </footer><!-- .site-footer -->
<link rel="stylesheet" id="lcp_paginator-css" href="https://atmokpo.com/w/wp-content/plugins/list-category-posts//lcp_paginator.css?ver=6.7.2" media="all"> <script src="https://atmokpo.com/w/wp-content/plugins/collapse-magic/js/collapse-magic.js?x=214&amp;ver=1.0" id="claps-main-js"></script> <script defer="" src="https://atmokpo.com/w/wp-content/plugins/koko-analytics/assets/dist/js/script.js?ver=1.6.4" id="koko-analytics-js"></script> <script src="https://atmokpo.com/w/wp-content/plugins/responsive-accordion-and-collapse/js/accordion-custom.js?ver=6.7.2" id="call_ac-custom-js-front-js"></script> <script src="https://atmokpo.com/w/wp-content/plugins/responsive-accordion-and-collapse/js/accordion.js?ver=6.7.2" id="call_ac-js-front-js"></script> <script src="https://stats.wp.com/e-202515.js" id="jetpack-stats-js" data-wp-strategy="defer"></script> <script id="jetpack-stats-js-after"> _stq = window._stq || []; _stq.push([ "view", JSON.parse("{\"v\":\"ext\",\"blog\":\"238449126\",\"post\":\"34872\",\"tz\":\"0\",\"srv\":\"atmokpo.com\",\"j\":\"1:14.2.1\"}") ]); _stq.push([ "clickTrackerInit", "238449126", "34872" ]); </script> <script> document.querySelectorAll("code").forEach(function(codeBlock) { // 내용에 '<'나 '>'가 포함된 경우에만 변환 if (codeBlock.innerHTML.includes("<") && codeBlock.innerHTML.includes(">")) { codeBlock.textContent = codeBlock.innerHTML; } }); </script>