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์ ์ฌ์ฉํ ํ์๋ ์์์.
์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์.
- ์์๋ ๋ฌด์กฐ๊ฑด ํ๋ ์ด์ ์์ด์ผ ํ๋ ๊ธฐ์ค์ ์ด ์์๊ฐ ๋๋ ์๊ฐ ๋ฉ์ถ๊ธฐ
- ์ค๋ณต์ ํ์ ์์ผ๋ ์ด์ ๊ฐ๊ณผ ํ์ฌ ๊ฐ์ด ๊ฐ๋ค๋ฉด continue
- ๋๋จธ์ง์ ๋ํด์ ์ ์ฒด ํ์์ ํด์ฃผ๋ฉด ๋จ. ๋จ ๊ฐ์ ๋ฐ๋ผ์ ๋ ํฐ ๊ฐ์ด ํ์ํ๋ฉด start++, ๋ ์์ ๊ฐ์ด ํ์ํ๋ฉด end--๋ฅผ ํด์ฃผ๋ฉด ๋จ.
- ๊ณ์ ์ฐพ๋ค๊ฐ 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 |