<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hardy</title>
    <link>https://hardy-android.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 6 Apr 2026 16:14:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hardy97</managingEditor>
    <image>
      <title>hardy</title>
      <url>https://tistory1.daumcdn.net/tistory/4937145/attach/11788821d41e4327b267b0bee97742ab</url>
      <link>https://hardy-android.tistory.com</link>
    </image>
    <item>
      <title>[ANDROID] MPAndroidChart Rounded Candle Stick Chart</title>
      <link>https://hardy-android.tistory.com/entry/ANDROID-MPAndroidChart-Rounded-Candle-Stick-Chart</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MPAndroidChart&amp;nbsp;Rounded&amp;nbsp;Candle&amp;nbsp;Stick&amp;nbsp;Chart&lt;br /&gt;&lt;br /&gt;canvas.drawRect -&amp;gt; canvas.drawRoundRect&lt;/p&gt;
&lt;pre id=&quot;code_1686622524795&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import android.graphics.Canvas
import android.graphics.Paint
import com.github.mikephil.charting.animation.ChartAnimator
import com.github.mikephil.charting.interfaces.dataprovider.CandleDataProvider
import com.github.mikephil.charting.interfaces.datasets.ICandleDataSet
import com.github.mikephil.charting.renderer.CandleStickChartRenderer
import com.github.mikephil.charting.utils.ColorTemplate
import com.github.mikephil.charting.utils.ViewPortHandler

class CustomCandleStickChartRender(
    chart: CandleDataProvider,
    animator: ChartAnimator,
    viewPortHandler: ViewPortHandler
) : CandleStickChartRenderer(chart, animator, viewPortHandler) {
    private var mRadius: Int = 0

    private val mShadowBuffers = FloatArray(8)
    private val mBodyBuffers = FloatArray(4)
    private val mRangeBuffers = FloatArray(4)
    private val mOpenBuffers = FloatArray(4)
    private val mCloseBuffers = FloatArray(4)

    fun setRadius(mRadius: Int) {
        this.mRadius = mRadius
    }

    override fun drawDataSet(c: Canvas, dataSet: ICandleDataSet) {
        val trans = mChart.getTransformer(dataSet.axisDependency)

        val phaseY = mAnimator.phaseY
        val barSpace = dataSet.barSpace
        val showCandleBar = dataSet.showCandleBar

        mXBounds[mChart] = dataSet

        mRenderPaint.strokeWidth = dataSet.shadowWidth

        // draw the body

        // draw the body
        for (j in mXBounds.min..mXBounds.range + mXBounds.min) {

            // get the entry
            val e = dataSet.getEntryForIndex(j) ?: continue
            val xPos = e.x
            val open = e.open
            val close = e.close
            val high = e.high
            val low = e.low
            if (showCandleBar) {
                // calculate the shadow
                mShadowBuffers[0] = xPos
                mShadowBuffers[2] = xPos
                mShadowBuffers[4] = xPos
                mShadowBuffers[6] = xPos
                if (open &amp;gt; close) {
                    mShadowBuffers[1] = high * phaseY
                    mShadowBuffers[3] = open * phaseY
                    mShadowBuffers[5] = low * phaseY
                    mShadowBuffers[7] = close * phaseY
                } else if (open &amp;lt; close) {
                    mShadowBuffers[1] = high * phaseY
                    mShadowBuffers[3] = close * phaseY
                    mShadowBuffers[5] = low * phaseY
                    mShadowBuffers[7] = open * phaseY
                } else {
                    mShadowBuffers[1] = high * phaseY
                    mShadowBuffers[3] = open * phaseY
                    mShadowBuffers[5] = low * phaseY
                    mShadowBuffers[7] = mShadowBuffers[3]
                }
                trans.pointValuesToPixel(mShadowBuffers)

                // draw the shadows
                if (dataSet.shadowColorSameAsCandle) {
                    if (open &amp;gt; close) mRenderPaint.color =
                        if (dataSet.decreasingColor == ColorTemplate.COLOR_NONE) dataSet.getColor(j) else dataSet.decreasingColor else if (open &amp;lt; close) mRenderPaint.color =
                        if (dataSet.increasingColor == ColorTemplate.COLOR_NONE) dataSet.getColor(j) else dataSet.increasingColor else mRenderPaint.color =
                        if (dataSet.neutralColor == ColorTemplate.COLOR_NONE) dataSet.getColor(j) else dataSet.neutralColor
                } else {
                    mRenderPaint.color =
                        if (dataSet.shadowColor == ColorTemplate.COLOR_NONE) dataSet.getColor(j) else dataSet.shadowColor
                }
                mRenderPaint.style = Paint.Style.STROKE
                c.drawLines(mShadowBuffers, mRenderPaint)

                // calculate the body
                mBodyBuffers[0] = xPos - 0.5f + barSpace
                mBodyBuffers[1] = close * phaseY
                mBodyBuffers[2] = xPos + 0.5f - barSpace
                mBodyBuffers[3] = open * phaseY
                trans.pointValuesToPixel(mBodyBuffers)

                // draw body differently for increasing and decreasing entry
                if (open &amp;gt; close) { // decreasing
                    if (dataSet.decreasingColor == ColorTemplate.COLOR_NONE) {
                        mRenderPaint.color = dataSet.getColor(j)
                    } else {
                        mRenderPaint.color = dataSet.decreasingColor
                    }
                    mRenderPaint.style = dataSet.decreasingPaintStyle
                    c.drawRoundRect(
                        mBodyBuffers[0], mBodyBuffers[3],
                        mBodyBuffers[2], mBodyBuffers[1],
                        mRadius.toFloat(), mRadius.toFloat(),
                        mRenderPaint
                    )
                } else if (open &amp;lt; close) {
                    if (dataSet.increasingColor == ColorTemplate.COLOR_NONE) {
                        mRenderPaint.color = dataSet.getColor(j)
                    } else {
                        mRenderPaint.color = dataSet.increasingColor
                    }
                    mRenderPaint.style = dataSet.increasingPaintStyle
                    c.drawRoundRect(
                        mBodyBuffers[0], mBodyBuffers[1],
                        mBodyBuffers[2], mBodyBuffers[3],
                        mRadius.toFloat(), mRadius.toFloat(),
                        mRenderPaint
                    )
                } else { // equal values
                    if (dataSet.neutralColor == ColorTemplate.COLOR_NONE) {
                        mRenderPaint.color = dataSet.getColor(j)
                    } else {
                        mRenderPaint.color = dataSet.neutralColor
                    }
                    c.drawLine(
                        mBodyBuffers[0], mBodyBuffers[1],
                        mBodyBuffers[2], mBodyBuffers[3],
                        mRenderPaint
                    )
                }
            } else {
                mRangeBuffers[0] = xPos
                mRangeBuffers[1] = high * phaseY
                mRangeBuffers[2] = xPos
                mRangeBuffers[3] = low * phaseY
                mOpenBuffers[0] = xPos - 0.5f + barSpace
                mOpenBuffers[1] = open * phaseY
                mOpenBuffers[2] = xPos
                mOpenBuffers[3] = open * phaseY
                mCloseBuffers[0] = xPos + 0.5f - barSpace
                mCloseBuffers[1] = close * phaseY
                mCloseBuffers[2] = xPos
                mCloseBuffers[3] = close * phaseY
                trans.pointValuesToPixel(mRangeBuffers)
                trans.pointValuesToPixel(mOpenBuffers)
                trans.pointValuesToPixel(mCloseBuffers)

                // draw the ranges
                var barColor: Int
                barColor =
                    if (open &amp;gt; close) if (dataSet.decreasingColor == ColorTemplate.COLOR_NONE) dataSet.getColor(
                        j
                    ) else dataSet.decreasingColor else if (open &amp;lt; close) if (dataSet.increasingColor == ColorTemplate.COLOR_NONE) dataSet.getColor(
                        j
                    ) else dataSet.increasingColor else if (dataSet.neutralColor == ColorTemplate.COLOR_NONE) dataSet.getColor(
                        j
                    ) else dataSet.neutralColor
                mRenderPaint.color = barColor
                c.drawLine(
                    mRangeBuffers[0], mRangeBuffers[1],
                    mRangeBuffers[2], mRangeBuffers[3],
                    mRenderPaint
                )
                c.drawLine(
                    mOpenBuffers[0], mOpenBuffers[1],
                    mOpenBuffers[2], mOpenBuffers[3],
                    mRenderPaint
                )
                c.drawLine(
                    mCloseBuffers[0], mCloseBuffers[1],
                    mCloseBuffers[2], mCloseBuffers[3],
                    mRenderPaint
                )
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1686622550044&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private fun setCandleStickRadius() {
        val barChartRenderer = CustomCandleStickChartRender(
            viewDataBinding.chart,
            viewDataBinding.chart.animator,
            viewDataBinding.chart.viewPortHandler
        )
        barChartRenderer.setRadius(8)

        viewDataBinding.chart.renderer = barChartRenderer
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;result&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi09yT/btsjNNUnkBJ/OEe8UrSgEr68RMXKthLKZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi09yT/btsjNNUnkBJ/OEe8UrSgEr68RMXKthLKZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi09yT/btsjNNUnkBJ/OEe8UrSgEr68RMXKthLKZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi09yT%2FbtsjNNUnkBJ%2FOEe8UrSgEr68RMXKthLKZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;409&quot; height=&quot;105&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;thinStick -&amp;gt; set&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;CandleDataSet.barSpace&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ANDROID</category>
      <category>candlestick</category>
      <category>CandleStickChart</category>
      <category>MPAndroidChart</category>
      <category>RoundedCandleStickChart</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/201</guid>
      <comments>https://hardy-android.tistory.com/entry/ANDROID-MPAndroidChart-Rounded-Candle-Stick-Chart#entry201comment</comments>
      <pubDate>Tue, 13 Jun 2023 11:20:22 +0900</pubDate>
    </item>
    <item>
      <title>[ANDORID] hilt를 왜 사용할까?</title>
      <link>https://hardy-android.tistory.com/entry/ANDORID-hilt%EB%A5%BC-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzluoH/btrUuPb9Buz/b0flC1ghz44SVXRgjK55nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzluoH/btrUuPb9Buz/b0flC1ghz44SVXRgjK55nK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzluoH/btrUuPb9Buz/b0flC1ghz44SVXRgjK55nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzluoH%2FbtrUuPb9Buz%2Fb0flC1ghz44SVXRgjK55nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;348&quot; height=&quot;145&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간단 정리&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나는 hilt를 왜 사용할까?&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 hilt는 의존성 주입을 도와주는 라이브러리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hilt의 장점은 &lt;b&gt;의존성 주입의 장점&lt;/b&gt;이라고도 할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주입받는 대상이 변하더라도 주입되는 객체의 구현에는 변화가 없다. 즉, 재사용성이 좋다&lt;/li&gt;
&lt;li&gt;의존성이 있는 객체를 찾기 쉽다. 즉, 가독성이 좋다&lt;/li&gt;
&lt;li&gt;객체를 붙였다 떼었다 하기가 쉽기 때문에 프로젝트 변화에 유연성이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dagger2나 Koin보다 hilt를 사용하는 이유는 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;dagger2&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;koin&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;hilt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;러닝커브&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;높다&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;낮다&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;낮다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;error 시점&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;compile time&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;runtime&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;compile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;java&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배우기가 쉽고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;error를 역 추적해야 하는 runtime에러보다 비교적 에러를 찾기 쉬운 compile time에 에러가 발생하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바를 지원한다.&lt;/p&gt;</description>
      <category>ANDROID</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/200</guid>
      <comments>https://hardy-android.tistory.com/entry/ANDORID-hilt%EB%A5%BC-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C#entry200comment</comments>
      <pubDate>Fri, 23 Dec 2022 21:20:56 +0900</pubDate>
    </item>
    <item>
      <title>[KOTLIN] 백준-2667번 단지번호붙이기</title>
      <link>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-2667%EB%B2%88-%EB%8B%A8%EC%A7%80%EB%B2%88%ED%98%B8%EB%B6%99%EC%9D%B4%EA%B8%B0</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;그림 1&amp;gt;과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. &amp;lt;그림 2&amp;gt;는 &amp;lt;그림 1&amp;gt;을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/42vaG/btrUi1QOMN4/NEPez5KPwc0peEIkwS0EU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/42vaG/btrUi1QOMN4/NEPez5KPwc0peEIkwS0EU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/42vaG/btrUi1QOMN4/NEPez5KPwc0peEIkwS0EU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F42vaG%2FbtrUi1QOMN4%2FNEPez5KPwc0peEIkwS0EU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;409&quot; height=&quot;192&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입력&lt;/h3&gt;
&lt;div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5&amp;le;N&amp;le;25)이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력&lt;/h3&gt;
&lt;div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1671635390326&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*
import java.util.*

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    var dx = arrayOf(0, 1, 0, -1)
    var dy = arrayOf(1, 0, -1, 0)

    val n = br.readLine().toInt()
    var board = Array(n, { Array(n, { 0 }) })
    var visited = Array(n, { Array(n, { false }) })

    var counts = mutableListOf&amp;lt;Int&amp;gt;()

    fun bfs(x: Int, y: Int) {
        visited[x][y] = true
        val q: Queue&amp;lt;Pair&amp;lt;Int, Int&amp;gt;&amp;gt; = LinkedList()
        q.add(Pair(x, y))
        var count = 1

        while (!q.isEmpty()) {
            val p = q.poll()
            repeat(4) { index -&amp;gt;
                val nextX = p.first + dx[index]
                val nextY = p.second + dy[index]
                if (nextX &amp;gt;= 0 &amp;amp;&amp;amp; nextX &amp;lt; n &amp;amp;&amp;amp; nextY &amp;gt;= 0 &amp;amp;&amp;amp; nextY &amp;lt; n &amp;amp;&amp;amp; !visited[nextX][nextY] &amp;amp;&amp;amp; board[nextX][nextY] == 1) {
                    visited[nextX][nextY] = true
                    q.add(Pair(nextX, nextY))
                    count += 1
                }
            }
        }

        counts.add(count)
    }

    // 채우기
    repeat(n) { i -&amp;gt;
        val line = br.readLine()
        line.forEachIndexed { j, c -&amp;gt;
            board[i][j] = Character.getNumericValue(c)
        }
    }

    repeat(n) { i -&amp;gt;
        repeat(n) { j -&amp;gt;
            if (!visited[i][j] &amp;amp;&amp;amp; board[i][j] == 1) {
                bfs(i, j)
            }
        }
    }

    counts.sort()

    bw.write(&quot;${counts.size}\n&quot;)
    counts.forEach { count -&amp;gt;
        bw.write(&quot;$count\n&quot;)
    }

    bw.flush()
    bw.close()
    br.close()
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 판을 채우고 모든 판을 검사한다. 만약 visited되지 않고 1인 곳이 있다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bfs를 돌아 연결되어있는 판의 크기를 구한다. 이때 들릴때마다 visited 처리를 해서 한번 더 들리지 못하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 판의 크기들을 리스트에 채운뒤 정렬하여 출력한다.&lt;/p&gt;</description>
      <category>ALGORITHM/BACKJOON</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/198</guid>
      <comments>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-2667%EB%B2%88-%EB%8B%A8%EC%A7%80%EB%B2%88%ED%98%B8%EB%B6%99%EC%9D%B4%EA%B8%B0#entry198comment</comments>
      <pubDate>Thu, 22 Dec 2022 00:11:49 +0900</pubDate>
    </item>
    <item>
      <title>[RxJava] RxJava에 대한 이해</title>
      <link>https://hardy-android.tistory.com/entry/RxJava-RxJava%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reactvie Programming?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;reactive-programming이란-데이터-흐름과-전달에-관한-프로그래밍-패러다임이다&quot; data-ke-size=&quot;size16&quot;&gt;Reactive Programming이란 데이터 흐름과 전달에 관한 프로그래밍 패러다임입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 주로 작성한 순서대로 실행되는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Imperative Programming&lt;/b&gt;(명령형 프로그래밍)을 한다. 반면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Reactive Programming&lt;/b&gt;이란 데이터의 흐름을 먼저 정의하고 데이터가 변경되었을 때 연관된 작업이 실행됩니다. 즉, 프로그래머가 어떠한 기능을 직접 호출해서 실행시키는 것이 아닌, 이벤트가 발생했을 때 알아서 처리되는 것이다.&lt;br /&gt;&lt;br /&gt;기존의 프로그래밍 방식을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Pull 방식&lt;/b&gt;, Reactive 프로그래밍 방식을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Push 방식&lt;/b&gt;이라고도 합니다.&lt;br /&gt;&lt;b&gt;Pull 방식&lt;/b&gt;은 데이터를 사용하는 곳(Consumer)에서 데이터를 직접 가져와서 사용한다면,&lt;br /&gt;&lt;b&gt;Push 방식&lt;/b&gt;은 데이터의 변화가 발생한 곳에서 새로운 데이터를 Consumer에게 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #343638;&quot;&gt;따라서 Reactive 프로그래밍은 주변 환경과 끊임없이 상호작용을 한다. 다만 프로그램이 주도하는 것이 아니라 환경이 변하면 이벤트를 받아 동작함으로써 상호작용한다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #343638;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;rxjava&quot; data-ke-size=&quot;size26&quot;&gt;RxJava&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #343638;&quot;&gt;RxJava는 ReactiveX의 Java 언어 라이브러리로, 2013년 2월 넷플릭스에서 처음 소개하였다. 2016년 10월 RxJava2를 발표하였으며 2020년 2월 RxJava3를 배포했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ReactiveX는 관찰가능한 절차를 통해 비동기, 이벤트 기반 프로그램을 구성하기 위한 라이브러리이다.&lt;/li&gt;
&lt;li&gt;Observer Pattern을 확장하며, Sequence를 조합할 수 있는 연산자를 지원한다.&lt;/li&gt;
&lt;li&gt;low-level Thread, 동기화, Thread 안전성, non-blocking I/O에 관한 우려를 줄인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #343638;&quot;&gt;RxJava는 러닝 커브가 가파르다. 전통적인 스레드 기반의 프로그래밍을 사용하는 자바와 접근 방식이 다르기 때문이다. 여러 스레드를 사용하는 경우 예상치 못한 문제가 발생할 수도 있고 디버깅하기도 어렵다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #343638;&quot;&gt;따라서 RxJava는 함수형 프로그래밍 방식을 도입하였다. 함수형 프로그래밍은 부수 효과가 없는 순수 함수를 지향하기 때문에 Thread-Safe하다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #343638;&quot;&gt;ReactiveX의 이러한 방식을 구성하게 해주는 핵심 요소가 바로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Observable&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #343638;&quot;&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Operator&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #343638;&quot;&gt;(연산자)이다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ANDROID/RXJAVA</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/197</guid>
      <comments>https://hardy-android.tistory.com/entry/RxJava-RxJava%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4#entry197comment</comments>
      <pubDate>Wed, 21 Dec 2022 21:16:35 +0900</pubDate>
    </item>
    <item>
      <title>[KOTLIN] 백준-14886 연산자 끼워넣기</title>
      <link>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-14886-%EC%97%B0%EC%82%B0%EC%9E%90-%EB%81%BC%EC%9B%8C%EB%84%A3%EA%B8%B0</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 N-1개의 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(&amp;times;), 나눗셈(&amp;divide;)으로만 이루어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 수와 수 사이에 연산자를 하나씩 넣어서, 수식을 하나 만들 수 있다. 이때, 주어진 수의 순서를 바꾸면 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 6개의 수로 이루어진 수열이 1, 2, 3, 4, 5, 6이고, 주어진 연산자가 덧셈(+) 2개, 뺄셈(-) 1개, 곱셈(&amp;times;) 1개, 나눗셈(&amp;divide;) 1개인 경우에는 총 60가지의 식을 만들 수 있다. 예를 들어, 아래와 같은 식을 만들 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1+2+3-4&amp;times;5&amp;divide;6&lt;/li&gt;
&lt;li&gt;1&amp;divide;2+3+4-5&amp;times;6&lt;/li&gt;
&lt;li&gt;1+2&amp;divide;3&amp;times;4-5+6&lt;/li&gt;
&lt;li&gt;1&amp;divide;2&amp;times;3-4+5+6&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;식의 계산은 연산자 우선 순위를 무시하고 앞에서부터 진행해야 한다.&lt;/b&gt; &lt;/span&gt;또, 나눗셈은 정수 나눗셈으로 몫만 취한다. 음수를 양수로 나눌 때는 C++14의 기준을 따른다. 즉, 양수로 바꾼 뒤 몫을 취하고, 그 몫을 음수로 바꾼 것과 같다.&amp;nbsp;이에 따라서, 위의 식 4개의 결과를 계산해보면 아래와&amp;nbsp;같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1+2+3-4&amp;times;5&amp;divide;6 = 1&lt;/li&gt;
&lt;li&gt;1&amp;divide;2+3+4-5&amp;times;6 = 12&lt;/li&gt;
&lt;li&gt;1+2&amp;divide;3&amp;times;4-5+6 = 5&lt;/li&gt;
&lt;li&gt;1&amp;divide;2&amp;times;3-4+5+6 = 7&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N개의 수와 N-1개의 연산자가 주어졌을 때, 만들 수 있는 식의 결과가 최대인 것과 최소인 것을 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;첫째 줄에 수의 개수 N(2 &amp;le; N &amp;le; 11)가 주어진다. 둘째 줄에는 A&lt;/span&gt;1&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;, A&lt;/span&gt;2&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;, ..., A&lt;/span&gt;N&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;이 주어진다. (1 &amp;le; A&lt;/span&gt;i&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;le; 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,&amp;nbsp;곱셈(&amp;times;)의 개수, 나눗셈(&amp;divide;)의 개수이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;첫째 줄에 만들 수 있는 식의 결과의 최댓값을, 둘째 줄에는 최솟값을 출력한다. 연산자를 어떻게 끼워넣어도&amp;nbsp;항상 -10억보다 크거나 같고, 10억보다 작거나 같은 결과가 나오는 입력만 주어진다. 또한, 앞에서부터 계산했을 때, 중간에 계산되는 식의 결과도 항상 -10억보다 크거나 같고, 10억보다 작거나 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1671545816574&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*
import kotlin.math.*

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    val n = br.readLine().toInt()
    val nums = br.readLine().split(&quot; &quot;).map { it.toInt() }.toMutableList()
    val ops = br.readLine().split(&quot; &quot;).map { it.toInt() }.toMutableList()

    var maxValue = Integer.MIN_VALUE
    var minValue = Integer.MAX_VALUE

    fun dfs(depth: Int, x: Int) {
        if (depth == n) {
            maxValue = max(maxValue, x)
            minValue = min(minValue, x)
            return
        }

        // 연산자 종류만큼 반복.
        repeat(4) { index -&amp;gt;
            if (ops[index] != 0) {
                ops[index] -= 1
                when (index) {
                    0 -&amp;gt; dfs(depth + 1, x + nums[depth])
                    1 -&amp;gt; dfs(depth + 1, x - nums[depth])
                    2 -&amp;gt; dfs(depth + 1, x * nums[depth])
                    3 -&amp;gt; dfs(depth + 1, x / nums[depth])
                }
                ops[index] += 1
            }
        }
    }

    dfs(1, nums[0])

    bw.write(&quot;$maxValue\n&quot;)
    bw.write(&quot;$minValue\n&quot;)

    bw.flush()
    bw.close()
    br.close()
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조합류 + n &amp;lt;= 20인 문제이기 때문에 dfs로 풀었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 조건중 연산의 우선순위 없이 순서대로 계산한다는 점을 파악해야 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 조합을 다 만들어보는 문제로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자 한번 연산한번 숫자 한번 연산 한번 dfs로 진행했습니다.&lt;/p&gt;</description>
      <category>ALGORITHM/BACKJOON</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/195</guid>
      <comments>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-14886-%EC%97%B0%EC%82%B0%EC%9E%90-%EB%81%BC%EC%9B%8C%EB%84%A3%EA%B8%B0#entry195comment</comments>
      <pubDate>Tue, 20 Dec 2022 23:17:26 +0900</pubDate>
    </item>
    <item>
      <title>[원티드 안드로이드 프리온보딩] 프리온보딩을 마치며</title>
      <link>https://hardy-android.tistory.com/entry/%E3%85%8E</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAFTJt/btrTUEB4Iz1/NBcCqRWHjxyJYRo8dgVeRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAFTJt/btrTUEB4Iz1/NBcCqRWHjxyJYRo8dgVeRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAFTJt/btrTUEB4Iz1/NBcCqRWHjxyJYRo8dgVeRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAFTJt%2FbtrTUEB4Iz1%2FNBcCqRWHjxyJYRo8dgVeRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;548&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;원티드 안드로이드 프리온보딩을 마치며&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(2022.12.3 ~ 2022.12.11)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;느낀점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 늦었지만 짧게 원티드 안드로이드 프리온보딩에 참여했던 소감을 말하고자합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 강의는 '자바에서 코틀린으로'라는 타이틀에 걸맞게 강의의 전체적인 진행 방향은 Java와 Kotlin의 차이를 이론과 코드를 통해 학습하고 자바에서는 존재하지 않는 Kotlin 만의 장점을 보여주고, 부각시켰습니다.또 좀 의외의 강조점은 강사님께서 매번 강의가 끝나는 부분에 '코틀린 멀티 플랫폼'에 대한 설명을 해주셨습니다. 저는 좀 중요하지 않다고 생각했지만 코틀린 멀티 플랫폼이라는 것을 처음 알게되었고, 최근 플루터나 리액트네이티브에 대해 관심이 좀 있었는데 코틀린으로도 멀티플랫폼 개발이 가능하다는 얘기에 흥미가 생겼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 시간이되면 코틀린으로 iOS 개발을 진행해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의에 대한 지식 재산권을 계속 강조하셔서 강의를 통해 공부한 내용을 블로그에 작성하진 못했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용은 처음에는 매우 기초부터 알려주셔서, 안들어도 괜찮지 않을까 했는데. 생각보다 기초적인 부분도 모르는게 많았고 처음보는 문법도 생각보다 많았습니다. 강사님께서도 이런 사소한 부분을 설명할줄 아는게 차이를 만든다고 하셨고 면접에서도 유리하게 작용한다고 하셨습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 4일의 세션을 모두 참여했고 큰 주제는 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kotlin, Java의 타입시스템과 Null&lt;/li&gt;
&lt;li&gt;Kotlin, Java의 흐름 제어와 클래스&lt;/li&gt;
&lt;li&gt;Kotlin의 interface, operator, 컬렉션&lt;/li&gt;
&lt;li&gt;Kotlin의 클래스 정의 및 활용, Scope 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의의 학습자료만 직접적으로만 안하면 것인지 잘 모르겠지만 강의 자료와 다른 예시들을 제가 적용하면서 저의 생각들을 포함해서 복습하는 과정을 블로그에 기록해야겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>EXTRACURRICULAR ACTIVITY/2022 원티드 안드로이드 프리온보딩</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/193</guid>
      <comments>https://hardy-android.tistory.com/entry/%E3%85%8E#entry193comment</comments>
      <pubDate>Sun, 18 Dec 2022 00:42:08 +0900</pubDate>
    </item>
    <item>
      <title>[KOTLIN] 백준-9663 N QEEN</title>
      <link>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-9663-N-QEEN</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;백준-9663 NQEEN&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9663&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/9663&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671290801485&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;9663번: N-Queen&quot; data-og-description=&quot;N-Queen 문제는&amp;nbsp;크기가 N &amp;times; N인 체스판 위에 퀸 N개를&amp;nbsp;서로 공격할 수 없게 놓는&amp;nbsp;문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/9663&quot; data-og-url=&quot;https://www.acmicpc.net/problem/9663&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/y0IC5/hyQUXrpv4d/3p2s6oqa8Y6Q6cSKs8hw2k/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9663&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/9663&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/y0IC5/hyQUXrpv4d/3p2s6oqa8Y6Q6cSKs8hw2k/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;9663번: N-Queen&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;N-Queen 문제는&amp;nbsp;크기가 N &amp;times; N인 체스판 위에 퀸 N개를&amp;nbsp;서로 공격할 수 없게 놓는&amp;nbsp;문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N-Queen 문제는&amp;nbsp;크기가 N &amp;times; N인 체스판 위에 퀸 N개를&amp;nbsp;서로 공격할 수 없게 놓는&amp;nbsp;문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입력&lt;/h3&gt;
&lt;div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N이 주어진다. (1 &amp;le; N &amp;lt; 15)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력&lt;/h3&gt;
&lt;div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는&amp;nbsp;경우의 수를 출력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1671290829673&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter

var n = 0
var visited = Array(0, { Array(0, { false }) })

var count = 0

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    n = br.readLine().toInt()
    visited = Array(n, { Array(n, { false }) })

    dfs(0)

    bw.write(&quot;$count&quot;)

    bw.flush()
    br.close()
    bw.close()
}

fun dfs(depth: Int) {
    if (depth == n) {
        count += 1
        return
    }

    repeat(n) { index -&amp;gt;
        if (!visited[depth][index] &amp;amp;&amp;amp; possible(depth, index)) {
            visited[depth][index] = true
            dfs(depth + 1)
            visited[depth][index] = false
        }
    }
}

fun possible(depth: Int, index: Int): Boolean {
    // 윗 대각선과 같은 윗 선에 있는지 체크.
    // 같은 가로에는 있을일이 없다. 없을 시 바로 depth + 1로 넘어가기 때문
    repeat(depth) { i -&amp;gt;
        if (visited[i][index]) return false
        if ((index - depth + i) &amp;gt;= 0 &amp;amp;&amp;amp; visited[i][index - depth + i]) return false
        if ((index + depth - i) &amp;lt; n &amp;amp;&amp;amp; visited[i][index + depth - i]) return false
    }
    return true
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;수&lt;/b&gt;&lt;/u&gt;나 여부 그리고 &lt;u&gt;&lt;b&gt;20이하의 조건&lt;/b&gt;&lt;/u&gt;이므로 DFS를 사용하여 푼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째줄부터 아래로 내려가면서 해당 줄에 퀸을 놓을 수 있는지를 완전 탐색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윗줄부터 내려오므로 현재 뎁스보다 밑에있는 줄에 퀸이 있을리가 없으므로 위만 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;possible함수를 사용해서 같은 열에 이미 퀸이 있는지, 대각선에 퀸이 있는지를 visited 배열로 검사한다.&lt;/p&gt;</description>
      <category>ALGORITHM/BACKJOON</category>
      <category>9663번</category>
      <category>nqeen</category>
      <category>백준</category>
      <category>엔퀸</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/192</guid>
      <comments>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-9663-N-QEEN#entry192comment</comments>
      <pubDate>Sun, 18 Dec 2022 00:30:15 +0900</pubDate>
    </item>
    <item>
      <title>[KOTLIN] 백준-13305 주유소</title>
      <link>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-13305-%EC%A3%BC%EC%9C%A0%EC%86%8C</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;백준-13305 주유소&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13305&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/13305&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1671287924621&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;13305번: 주유소&quot; data-og-description=&quot;표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 &amp;le; N &amp;le; 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/13305&quot; data-og-url=&quot;https://www.acmicpc.net/problem/13305&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/drqVML/hyQU78EJFX/E2lOC06je0gq6TY8eOWqmK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13305&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/13305&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/drqVML/hyQU78EJFX/E2lOC06je0gq6TY8eOWqmK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;13305번: 주유소&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 &amp;le; N &amp;le; 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 나라에 N개의 도시가 있다. 이 도시들은 일직선 도로 위에 있다. 편의상 일직선을 수평 방향으로 두자. 제일 왼쪽의 도시에서 제일 오른쪽의 도시로 자동차를 이용하여 이동하려고 한다. 인접한 두 도시 사이의 도로들은 서로 길이가 다를 수 있다. 도로 길이의 단위는 km를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 출발할 때 자동차에는 기름이 없어서 주유소에서 기름을 넣고 출발하여야 한다. 기름통의 크기는 무제한이어서 얼마든지 많은 기름을 넣을 수 있다. 도로를 이용하여 이동할 때 1km마다 1리터의 기름을 사용한다. 각 도시에는 단 하나의 주유소가 있으며, 도시 마다 주유소의 리터당 가격은 다를 수 있다. 가격의 단위는 원을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 이 나라에 다음 그림처럼 4개의 도시가 있다고 하자. 원 안에 있는 숫자는 그 도시에 있는 주유소의 리터당 가격이다. 도로 위에 있는 숫자는 도로의 길이를 표시한 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh8CTP/btrTVilhXTH/D0uVTlpE09gjHMwaUkTYNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh8CTP/btrTVilhXTH/D0uVTlpE09gjHMwaUkTYNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh8CTP/btrTVilhXTH/D0uVTlpE09gjHMwaUkTYNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh8CTP%2FbtrTVilhXTH%2FD0uVTlpE09gjHMwaUkTYNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;104&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 왼쪽 도시에서 6리터의 기름을 넣고, 더 이상의 주유 없이 제일 오른쪽 도시까지 이동하면 총 비용은 30원이다. 만약 제일 왼쪽 도시에서 2리터의 기름을 넣고(2&amp;times;5 = 10원) 다음 번 도시까지 이동한 후 3리터의 기름을 넣고(3&amp;times;2 = 6원) 다음 도시에서 1리터의 기름을 넣어(1&amp;times;4 = 4원) 제일 오른쪽 도시로 이동하면, 총 비용은 20원이다. 또 다른 방법으로 제일 왼쪽 도시에서 2리터의 기름을 넣고(2&amp;times;5 = 10원) 다음 번 도시까지 이동한 후 4리터의 기름을 넣고(4&amp;times;2 = 8원) 제일 오른쪽 도시까지 이동하면, 총 비용은 18원이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 도시에 있는 주유소의 기름 가격과, 각 도시를 연결하는 도로의 길이를 입력으로 받아 제일 왼쪽 도시에서 제일 오른쪽 도시로 이동하는 최소의 비용을 계산하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 &amp;le; N &amp;le; 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1개의 자연수로 주어진다. 다음 줄에는 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수로 주어진다. 제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수이다. 리터당 가격은 1 이상 1,000,000,000 이하의 자연수이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력&lt;/h3&gt;
&lt;div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 출력으로 제일 왼쪽 도시에서 제일 오른쪽 도시로 가는 최소 비용을 출력한다.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 싼 기름값을 저장해두고 다음 목적지까지 이동한다. 그리고 다음 목적지의 가격이 더 비싸다면 그 가격 그대로 다음 목적지로 이동하고 더 싸다면 기름값을 바꾼다.&lt;/p&gt;</description>
      <category>ALGORITHM/BACKJOON</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/191</guid>
      <comments>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-13305-%EC%A3%BC%EC%9C%A0%EC%86%8C#entry191comment</comments>
      <pubDate>Sat, 17 Dec 2022 23:40:15 +0900</pubDate>
    </item>
    <item>
      <title>[KOTLIN] 백준-1260 DFS와 BFS</title>
      <link>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80-BFS</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다.&amp;nbsp;정점 번호는 1번부터 N번까지이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;첫째 줄에 정점의 개수 N(1 &amp;le; N &amp;le; 1,000), 간선의 개수 M(1 &amp;le; M &amp;le; 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력&lt;/h3&gt;
&lt;div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1671197595042&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter
import java.util.LinkedList
import java.util.Queue

val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))

var board = Array(0, { Array(0, { 0 }) })
var visited = Array(0, { false })

var n = 0
var m = 0
var v = 0

fun main() {

    val (dn, dm, dv) = br.readLine().split(&quot; &quot;).map { it.toInt() }
    n = dn
    m = dm
    v = dv

    board = Array(dn + 1, { Array(dn + 1, { 0 }) })
    visited = Array(dn + 1, { false })

    repeat(m) {
        val (a, b) = br.readLine().split(&quot; &quot;).map { it.toInt() }
        board[a][b] = 1
        board[b][a] = 1
    }

    dfs(v, 1)
    visited = Array(dn + 1, { false })
    bw.write(&quot;\n&quot;)
    bfs(v)

    bw.flush()
    bw.close()
    br.close()
}

fun dfs(v: Int, depth: Int) {
    visited[v] = true
    bw.write(&quot;$v &quot;)
    if (depth == n) return // 목적지에 도착
    board[v].forEachIndexed { index, i -&amp;gt;
        if (index != 0 &amp;amp;&amp;amp; i != 0 &amp;amp;&amp;amp; !visited[index]) {
            dfs(index, depth + 1)
        }
    }
}

fun bfs(start: Int) {
    val q: Queue&amp;lt;Int&amp;gt; = LinkedList()
    visited[start] = true
    q.add(start)

    while (!q.isEmpty()) {
        val current = q.poll()!!
        bw.write(&quot;$current &quot;)
        board[current].forEachIndexed { index, i -&amp;gt;
            if (index != 0 &amp;amp;&amp;amp; i != 0 &amp;amp;&amp;amp; !visited[index]) {
                visited[index] = true
                val next = index
                q.add(next)
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ALGORITHM/BACKJOON</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/190</guid>
      <comments>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80-BFS#entry190comment</comments>
      <pubDate>Fri, 16 Dec 2022 22:33:59 +0900</pubDate>
    </item>
    <item>
      <title>[KOTLIN] 백준-1541 잃어버린 괄호</title>
      <link>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-1541-%EC%9E%83%EC%96%B4%EB%B2%84%EB%A6%B0-%EA%B4%84%ED%98%B8</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세준이는 양수와 +, -, 그리고 괄호를 가지고&amp;nbsp;식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;첫째 줄에 식이 주어진다. 식은 &amp;lsquo;0&amp;rsquo;~&amp;lsquo;9&amp;rsquo;, &amp;lsquo;+&amp;rsquo;, 그리고 &amp;lsquo;-&amp;rsquo;만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이&amp;nbsp;연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력&lt;/h3&gt;
&lt;div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 정답을 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1671181759644&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    var nums = mutableListOf&amp;lt;Int&amp;gt;()
    val m = br.readLine().split(&quot;-&quot;)
    m.forEach { it -&amp;gt;
        val p = it.split(&quot;+&quot;).map{ it.toInt() }
        val sum = p.sum()
        nums.add(sum)
    }

    var result = nums[0]
    nums.forEachIndexed { index, value -&amp;gt;
        if(index != 0) result -= value
    }

    bw.write(&quot;$result&quot;)
    br.close()
    bw.close()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덧셈들끼리 괄호로 묶고 빼는 것이 가장 작은 값이 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 처음에 - 로 나눴고 그 안에 정수들을 더했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 첫 숫자에서 합한 정수들을 빼주었다.&lt;/p&gt;</description>
      <category>ALGORITHM/BACKJOON</category>
      <author>hardy97</author>
      <guid isPermaLink="true">https://hardy-android.tistory.com/189</guid>
      <comments>https://hardy-android.tistory.com/entry/KOTLIN-%EB%B0%B1%EC%A4%80-1541-%EC%9E%83%EC%96%B4%EB%B2%84%EB%A6%B0-%EA%B4%84%ED%98%B8#entry189comment</comments>
      <pubDate>Fri, 16 Dec 2022 18:16:25 +0900</pubDate>
    </item>
  </channel>
</rss>