header-img
Info :

1. my code

trash ๊ฐ™์ด ํ’€์—ˆ์Œ. ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€๋ ค๊ณ  ๋…ธ๋ ฅํ•œ๊ฒŒ ๋” ๋ณต์žกํ•˜๊ฒŒ ํ’€๊ฒŒ ๋œ ๊ฒฐ๊ณผ.. ๊ณต๊ฐ„๋ณต์žก๋„ + ์‹œ๊ฐ„๋ณต์žก๋„ ๋งค์šฐ ์ข‹์ง€ ์•Š์Œ. 

์ผ๋‹จ ๋‚ด ์ƒ๊ฐ์œผ๋กœ๋Š” ๊ฐ ์ˆ˜์˜ ์ ˆ๋Œ€๊ฐ’์œผ๋กœ Map์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๊ฐ ๊ฐ’์˜ ๋ถ€ํ˜ธ์— ๋”ฐ๋ผ ์–‘์ˆ˜๋ฉด Pair์˜ first++, ์Œ์ˆ˜๋ฉด second++์„ ํ•ด์คŒ. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋งต์˜ ํ‚ค ๊ฐ’์œผ๋กœ ์ •๋ ฌ์„ ํ•ด์คŒ. answer์— ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ์กฐ๊ฑด์€ (a, b, c) ๋ชจ๋‘ ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์ด๋ฉด ๊ฐ™์€ ๋ถ€ํ˜ธ์ธ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” b < c๋ฅผ ํ•ด์คŒ. 

1. ํ‚ค ์ค‘ 0์ด ์žˆ๋‹ค๋ฉด ๋งต ์ค‘์—์„œ value์˜ first, second ๋‘˜ ๋‹ค 0์ด ์•„๋‹Œ ๊ฐ’์— ํ•œํ•ด์„œ answer์— ์ถ”๊ฐ€

2. ๋งต์—์„œ ์Œ์ˆ˜์ธ ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๋งต๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์Œ+์–‘+์–‘ ์กฐํ•ฉ ์ฐพ์Œ. ๋จผ์ € ์Œ์ˆ˜์ ˆ๋Œ€๊ฐ’ / 2๊ฐ€ ๋–จ์–ด์ง€๋ฉด ์Œ์ˆ˜์ ˆ๋Œ€๊ฐ’ / 2ํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด ์ถ”๊ฐ€. ๊ทธ๊ฒƒ์ด ์•„๋‹ ๋•Œ -> ์Œ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ปค์•ผ๋˜๋ฏ€๋กœ ์Œ-์–‘ >0 ์— ๋Œ€ํ•ด์„œ๋งŒ ์ ์šฉ. [์Œ-์–‘]์ด ํ‚ค๋กœ ๋˜๋Š” ๊ฐ’์˜ first(์–‘์ˆ˜์˜ ๊ฐœ์ˆ˜)๊ฐ€ ์กด์žฌํ•˜๋ฉด answer์— ์ถ”๊ฐ€. 

3. ์–‘, ์–‘, ์Œ ์กฐํ•ฉ์„ ์ฐพ๊ธฐ ์œ„ํ•ด 2๋ฒˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋˜ ์‚ฌ์šฉ

import kotlin.math.*

class Solution {
    fun threeSum(nums: IntArray): List<List<Int>> {
        val map = mutableMapOf<Int, Pair<Int, Int>>()
        nums.map {
            val absNum = abs(it)
            val (positiveCount, negativeCount) = map.getOrDefault(absNum, Pair(0, 0))

            if (it > 0) {
                map[absNum] = Pair(positiveCount + 1, negativeCount)
            } else if (it < 0) {
                map[absNum] = Pair(positiveCount, negativeCount + 1)
            } else {
                map[absNum] = Pair(positiveCount + 1, negativeCount)
            }
        }

        val answer = mutableSetOf<List<Int>>()
        map.toSortedMap()

        if ((map[0]?.first ?: 0) > 0) {
            val tmp = map.filter {
                it.value.first > 0 && it.value.second > 0
            }
            tmp.map {
                answer.add(listOf(it.key * -1, 0, it.key))
            }

            if ((map[0]?.first ?: 0) >= 3) {
                answer.add(listOf(0, 0, 0))
            }
            
            map.remove(0)
        }

        val minus = map.filter { it.value.second > 0 }
        val plus = map.filter { it.value.first > 0 }

        minus.forEach { (key, _) ->
            if (key % 2 == 0 && (map[key / 2]?.first ?: 0) >= 2) {
                answer.add(listOf(key * -1, key / 2, key / 2))
            }

            plus.map { (plusKey, _) ->
                if (plusKey >= key) {
                    return@map
                }

                if (plusKey * 2 != key && (map[key - plusKey]?.first ?: 0) > 0) {
                    answer.add(listOf(key * -1, min(plusKey, key - plusKey), max(plusKey, key - plusKey)))
                }
            }
        }

        plus.forEach { (key, _) ->
            if (key % 2 == 0 && (map[key / 2]?.second ?: 0) >= 2) {
                answer.add(listOf(key, -key / 2, -key / 2))
            }



            minus.map { (minusKey, _) ->
                if (minusKey >= key) {
                    return@map
                }

                if (minusKey * 2 != key && (map[key - minusKey]?.second ?: 0) > 0) {
                    answer.add(listOf(key, min(-minusKey, -key + minusKey), max(-minusKey, -key + minusKey)))
                }
            }
        }

        return answer.toList()
    }
}

 

2. others' code

๊ดœํžˆ ๊ผฌ์•„์„œ ์ƒ๊ฐํ•œ ๊ฒƒ ๊ฐ™์Œ. ์ผ๋‹จ ์ •๋ ฌ์„ ํ•ด์ฃผ๊ณ  ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์ž๊ธฐ ์ž์‹  ์•ž์˜ ์›์†Œ๋“ค์— ํ•œํ•ด์„œ ์ž๊ธฐ์ž์‹  + ์ž๊ธฐ์ž์‹  ์•ž์˜ ๋‘ ์›์†Œ์˜ ํ•ฉ = 0 ์ด ๋˜๋Š” ์กฐํ•ฉ์„ ์ฐพ๋Š”๊ฒŒ ๋งž์•˜์Œ. ์ด๋Ÿฌ๋ฉด ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด set์„ ์‚ฌ์šฉํ•  ํ•„์š”๋„ ์—†์—ˆ์Œ. 

์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Œ. 

  1. ์Œ์ˆ˜๋Š” ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜ ์ด์ƒ ์žˆ์–ด์•ผ ํ•˜๋‹ˆ ๊ธฐ์ค€์ ์ด ์–‘์ˆ˜๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„ ๋ฉˆ์ถ”๊ธฐ
  2. ์ค‘๋ณต์€ ํ•„์š” ์—†์œผ๋‹ˆ ์ด์ „ ๊ฐ’๊ณผ ํ˜„์žฌ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด continue
  3. ๋‚˜๋จธ์ง€์— ๋Œ€ํ•ด์„œ ์ „์ฒด ํƒ์ƒ‰์„ ํ•ด์ฃผ๋ฉด ๋จ. ๋‹จ ๊ฐ’์— ๋”ฐ๋ผ์„œ ๋” ํฐ ๊ฐ’์ด ํ•„์š”ํ•˜๋ฉด start++, ๋” ์ž‘์€ ๊ฐ’์ด ํ•„์š”ํ•˜๋ฉด end--๋ฅผ ํ•ด์ฃผ๋ฉด ๋จ. 
  4. ๊ณ„์† ์ฐพ๋‹ค๊ฐ€ start == end๊ฐ€ ๊ฐ™์•„์ง€๋Š” ์ˆœ๊ฐ„์ด ์˜ค๋ฉด ๋ฉˆ์ถ”๊ณ  ๋‹ค์Œ ์›์†Œ์— ๋Œ€ํ•ด 1๋ฒˆ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹คํ–‰. 
class Solution {
    fun threeSum(nums: IntArray): List<List<Int>> {
       nums.sort()
       val res = mutableListOf<List<Int>>( )
       for (i in 0 until nums.size) {
           if (nums[i] > 0) break
           if (i > 0 && nums[i - 1] == nums[i]) continue

           var start = i + 1
           var end = nums.size - 1

           while (start < end) {

               val sum = nums[start] + nums[end] + nums[i]
               if (sum < 0) {
                   start++
               } else if (sum > 0) {
                   end--
               } else {
                   res.add(listOf(nums[i], nums[start], nums[end]))
                   start++
                   end--
                   while (start < end && nums[start] == nums[start - 1]) {
                       start++
                   }
               }
           }
       }
       return res.toList()
    }
}

'Problem Solving > Leetcode' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

455. Assign Cookies  (0) 2023.08.23
168. Excel Sheet Column Title  (0) 2023.08.22
๋”๋ณด๊ธฐ
Problem Solving/Leetcode