2024. 4. 16. 11:27, ๐กAlgorithm
๋ฐ์ํ
๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/131705
์ ๊ทผ
- ์ฃผ์ด์ง number ๋ฐฐ์ด์ ์์ ์ค ํฉ์ณค์ ๋ 0์ด ๋๋ ์ธ ์์ ๊ฐ์๋ฅผ ๋ฆฌํดํ๋ ๋ฌธ์ ๋ค.
- ๋ฐ๋ณต๋ฌธ์ ์ฌ๋ฌ ๊ฐ ์จ์ ์์ ์๋ฅผ ๋ํ๋ ๋ฐฐ์ด์ ๋ฃ๊ณ , ์์ ์๋ณด๋ค ์ ์ ๋๋ฒ์งธ ๊ฐ์ ์ฐพ์ ๋ํ๊ณ , ๋จ์ ๊ฐ๊ณผ ๊ฐ์ ์ธ๋ฒ์งธ๊ฐ์ ๋ํ๊ณ , ๋ฐฐ์ด์์ ํด๋น 1/2/3๋ฒ์งธ ๊ฐ์ ์ญ์ ๋ค(์ค๋ณต ์ ์ธ) count++ ๋ฅผ ํ๋ ๋ฐฉ์ ์ ๋๋ก๋ฐ์ ์๊ฐ์ด ์ ๋๋ค.
- ๋จธ๋ฆฌ๊ฐ ์์ ์ ๋์๊ฐ๋ ๋ฌธ์ ๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํจ์จ์ ์ธ ํจ์๊ฐ ์์๊น?
- ๋ฌธ์ ๋ฅผ ์๋ชป ๋ดค๋ค! ์ค๋ณต ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ ๋ฌธ์ ์๋ค.
์ฑ๊ณต ์ฝ๋
class Solution {
fun solution(number: IntArray): Int {
var answer = 0
for(i in 0 until number.size - 2){
for (j in i+1 until number.size - 1){
for (k in j+1 until number.size){
if(number[i] + number[j] + number[k] == 0) answer ++
}
}
}
return answer
}
}
์ค๋ช
๋ฑํ ๋ค๋ฅธ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ดํ๋ ๋ฌธ์ ๊ฐ ์๋์๋ค. ์ผ์ค ์กฐ๊ฑด๋ฌธ์ ์ด์ฉํ์ฌ ํ ์ ์์๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ ํ์ด๋ฅผ ๋ณด๋ฉด์ '์ ๋ ๊ฒ ๊ตฌํํ๋ฉด ์ธ ์์ ๊ตฌํํ ๋ ์ค๋ณต๋ ์์๊ฐ ๋ค์ด๊ฐ๋ ๊ฒ ์๋๊ฐ?' ์๋ฌธ์ด ๋ค์๋๋ฐ, ์ ์ด์ ์ค๋ณต์ด ๊ฐ๋ฅํ ๋ฌธ์ ์๋ค. ๋ฐ๋ฌธ์ ์ ๋๋ก ๋ณด์.
- ์ฒซ ๋ฒ์งธ ์๋ ์ธ๋ฑ์ค 0๋ถํฐ ๋ค์์ 2๋ฒ์งธ๊น์ง ๋ฐ๋ณตํ๋ค.
- ๋ ๋ฒ์งธ ์๋ ์ธ๋ฑ์ค ์ฒซ ๋ฒ์งธ ์+1๋ถํฐ ๋ค์์ 1๋ฒ์งธ๊น์ง ๋ฐ๋ณตํ๋ค.
- ์ธ ๋ฒ์งธ ์๋ ์ธ๋ฑ์ค ๋ ๋ฒ์งธ ์+1๋ถํฐ ๋งจ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- ์ด๋ ๊ฒ 3์ค for๋ฌธ์ ๊ตฌ์ฑํ๋ฉฐ ์ธ ์๋ฅผ ํฉ์ณ์ 0์ด ๋ ๋๋ง๋ค answer์ ์ซ์๋ฅผ 1๊ฐ์ฉ ์ฌ๋ฆฐ๋ค.
- ๋ชจ๋ for๋ฌธ์ด ์๋ฃ๋์์ผ๋ฉด answer๋ฅผ ๋ฆฌํดํ๋ค.
์ฌ์ ํ ๋จ์ ๊ถ๊ธ์ฆ์ด ์๋ค.
- (1) ๋ง์ฝ ์ค๋ณต๋ ์์๋ก ์์ ๋ง๋ค ์ ์์ ๋ ์ด๋ป๊ฒ ๊ตฌํํ๋๊ฐ?
- (2) ์ผ๋ฐ์ ์ผ๋ก ์๋ ค์ง ํด๋ฆฐ์ฝ๋๋ฅผ ์ํ depth๋ ์ต๋ 2์ด๋ค. ์ด ๋ฌธ์ ์์๋ depth๋ฅผ ์ด๋ป๊ฒ ์ค์ฌ์ผ ํ ๊น?
(1) ์ค๋ณต๋์ง ์์ ์์๋ก๋ง ์กฐํฉํ๊ธฐ
fun funSolution(number: IntArray): Int {
var answer: Int = 0
val sumMap = HashMap<Int, HashSet<Pair<Int, Int>>>()
for (i in 0 until number.size - 1) {
for (j in i + 1 until number.size) {
val sum = number[i] + number[j]
val pair = Pair(number[i], number[j])
if (sumMap.containsKey(-sum)) {
val pairs = sumMap[-sum]!!
for (existingPair in pairs) {
if (existingPair.first != number[i] && existingPair.second != number[i] &&
existingPair.first != number[j] && existingPair.second != number[j]
) {
answer++
}
}
}
sumMap.computeIfAbsent(sum) { HashSet() }.add(pair)
}
}
return answer
}
- ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ๊ณ์ฐํ ์กฐํฉ์ ์ ์ฅํ๊ณ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด ์ด๋ฏธ ๊ณ์ฐํ ์กฐํฉ์ ์ ์ฅํ๋ HashSet์ด๋ HashMap์ ์ฌ์ฉํ ์ ์๋ค. - ์ด ์ฝ๋๋ ๋จผ์ ๋ ์์์ ํฉ์ ๊ณ์ฐํ๊ณ , ์ด๋ฅผ Key๋ก ํด์๋งต์์ ์ฐพ๋๋ค.
๋ง์ฝ ํด๋น ํฉ์ ๋ฐ๋๊ฐ์ด ์ด๋ฏธ ํด์๋งต์ ์๋ ๊ฒฝ์ฐ, ๊ทธ ํฉ์ ๋ง๋ค ์ ์๋ ์์๋ค์ ์กฐํฉ์ ์ฐพ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํตํด ์ธ ๊ฐ์ ์์๋ก ๊ตฌ์ฑ๋ ์กฐํฉ์ ์ฐพ๊ฒ ๋๋ค. - ์์ง ์์ธํ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์ด๋ฐ ๋ฐฉ๋ฒ์ด ์๋ค ์ ๋๋ก ์ฐพ์๋ณด์๋ค.
(2) Depth ๋ฎ์ถ๊ธฐ
- ๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ ๋ฑํ depth๋ฅผ ๋ฎ์ถ ๊ฒ ๋ณด์ด์ง ์๋๋ค.
์ด ๋ฌธ์ ์ ์ ๋ต์ ๊ตฌํํ๊ธฐ ์ํด์ ํ์ฐ์ ์ผ๋ก ๋์ depth๊ฐ ํ์ํ ๊ฑธ๊น?
๋ค๋ฅธ ๋ฐฉ๋ฒ
class Solution {
fun solution(number: IntArray) = number.indices.sumOf { i1 ->
(i1 + 1 until number.size).sumOf { i2 ->
(i2 + 1 until number.size).count { i3 ->
number[i1] + number[i2] + number[i3] == 0
}
}
}
}
- number.indices
- number ๋ฐฐ์ด์ ์ธ๋ฑ์ค ๋ฒ์๋ฅผ ๋ฐํํ๋ค. ์ด๋ 0๋ถํฐ number.size - 1๊น์ง์ ๋ฒ์๋ฅผ ๋ํ๋ธ๋ค. - sumOf { i1 -> ... }
- ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค i1์ ๋ํ ์ธ๋ฑ์ค ๋ฒ์์ ํฉ์ ๊ณ์ฐํ๋ค. ์ด ํฉ์ ๋ ๋ฒ์งธ ๊ณ ์ฐจ ํจ์ ๋ด์์ ์ฌ์ฉ๋๋ค. - (i1 + 1 until number.size)
- ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค i1 ๋ค์๋ถํฐ number ๋ฐฐ์ด์ ๋๊น์ง์ ์ธ๋ฑ์ค ๋ฒ์๋ฅผ ๋ฐํํ๋ค. - sumOf { i2 -> ... }
- ๋ ๋ฒ์งธ ์ธ๋ฑ์ค i2์ ๋ํ ์ธ๋ฑ์ค ๋ฒ์์ ํฉ์ ๊ณ์ฐํ๋ค. ์ด ํฉ์ ์ธ ๋ฒ์งธ ๊ณ ์ฐจ ํจ์ ๋ด์์ ์ฌ์ฉ๋๋ค. - (i2 + 1 until number.size)
- ๋ ๋ฒ์งธ ์ธ๋ฑ์ค i2 ๋ค์๋ถํฐ number ๋ฐฐ์ด์ ๋๊น์ง์ ์ธ๋ฑ์ค ๋ฒ์๋ฅผ ๋ฐํํ๋ค. - count { i3 -> ... }
- ์ธ ๋ฒ์งธ ์ธ๋ฑ์ค i3์ ๋ํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค. - number[i1] + number[i2] + number[i3] == 0
์ ํํ ์ธ ๊ฐ์ ์ซ์์ ํฉ์ด 0์ด ๋๋์ง ํ์ธํ๋ค. ๋ง์ฝ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ํด๋น ์์๋ count๋๋ค.
๋ฐ์ํ
๐ฌ C O M M E N T