2024. 3. 14. 10:13, ๐กAlgorithm
๋ฐ์ํ
๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/76501
์ ๊ทผ
- ๋จผ์ absoulutes[i] ๊ฐ์ signs[i]์ ๋ถํธ๊ฐ์ ๋ํ ๋ฐฐ์ด์ ๋ง๋ ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ง๋ค์ด์ง ๋ฐฐ์ด ์์์ ํฉ์ ๊ตฌํ๊ณ ์ถ๋ ฅํ๋ฉด ๋๋ค๊ณ ์๊ฐํ๋ค.
//์ค๋ฅ ์ฝ๋
// 1. absoulutes[i] ๊ฐ์ signs[i]์ ๋ถํธ๊ฐ์ ๋ํ ๋ฐฐ์ด์ ๋ง๋ฆ
// 2. ํด๋น ๋ฐฐ์ด ์์์ ํฉ์ ๊ตฌํ๊ณ ์ถ๋ ฅ
class Solution {
fun solution(absolutes: IntArray, signs: BooleanArray): Int {
var sumArray = intArrayOf()
for(i in 0..absolutes.size){
if(signs[i] == true) sumArray += absolutes[i]
else sumArray += -absolutes[i]
}
return sumArray.sum()
}
}
- ์ค๋ฅ: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
- absolutes.size ๋งํผ for๋ฌธ์ ๋ฐ๋ณตํ๋ฉด ๋ง์ง๋ง์ ์ธ๋ฑ์ค ์ต๋๊ฐ์ ์ด๊ณผํ๋ฏ๋ก, -1์ ํด์ฃผ๋ฉด ๋๋ค.
์ฑ๊ณต ์ฝ๋
class Solution {
fun solution(absolutes: IntArray, signs: BooleanArray): Int {
var sumArray = intArrayOf()
for(i in 0..absolutes.size-1){
if(signs[i] == true) sumArray += absolutes[i]
else sumArray += -absolutes[i]
}
return sumArray.sum()
}
}
์ค๋ช
- ๊ฒฐ๊ณผ๊ฐ์ ๋ฃ์ ๋ฐฐ์ด์ ๋ง๋ ๋ค.
- absolutes ๋ฐฐ์ด์ ๊ธธ์ด - 1๋งํผ for๋ฌธ์ ๋ฐ๋ณตํด์ฃผ๋ฉด์, absolutes ๊ฐ ์์์ ๋ถํธ๋ฅผ ๋ถ์ฌ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ฃ๋๋ค.
- ๊ฒฐ๊ณผ ๋ฐฐ์ด ์์์ ํฉ์ .sum()์ผ๋ก ์ถ๋ ฅํ๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ
class Solution {
fun solution(absolutes: IntArray, signs: BooleanArray): Int {
val array = IntArray(signs.size)
repeat(signs.size) {
if(signs[it]) array[it] = absolutes[it]
else array[it] = -(absolutes[it])
}
return array.sum()
}
}
- for๋ฌธ ๋์ repeat๋ฅผ ์ด์ฉํ ํ์ด์ด๋ค.
class Solution {
fun solution(absolutes: IntArray, signs: BooleanArray) =
absolutes.foldIndexed(0) { idx, acc, num -> acc + if (signs[idx]) num else -num }
}
- foldIndexed()๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ ์ธ ํ์ด๋ค.
- foldIndexed ํจ์
- foldIndexed ํจ์๋ ์ปฌ๋ ์ ์ ๊ฐ ์์์ ๋ํด ์ง์ ๋ ์ด๊ธฐ๊ฐ๊ณผ ๋๋ค ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ฐ์ ์ํํจ
- ๋๋ค ํจ์์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์ธ๋ฑ์ค, ๋ ๋ฒ์งธ๋ ๋์ฐ๊ธฐ(accumulator), ์ธ ๋ฒ์งธ๋ ์ปฌ๋ ์ ์ ํ์ฌ ์์ - acc + if (signs[idx]) num else -num
- ์ด ๋ถ๋ถ์ ๊ฐ ์์์ ๋ํ ์ฐ์ฐ์ ์ํ
- if ํํ์์ ์ฌ์ฉํ์ฌ signs[idx]์ ๊ฐ์ ๋ฐ๋ผ num์ ๋ํ ์ง ๋นผ์ค์ง๋ฅผ ๊ฒฐ์
- signs[idx]๊ฐ true์ด๋ฉด num์ ๋ํจ
- signs[idx]๊ฐ false์ด๋ฉด num์ ๋บ - ์ ์ฒด ํํ์ ์ค๋ช
- foldIndexed ํจ์๋ ์ฃผ์ด์ง ์ด๊ธฐ๊ฐ์ธ 0๋ถํฐ ์์ํ์ฌ ๋ฐฐ์ด absolutes์ ๊ฐ ์์์ ๋ํด ๋๋ค ํจ์๋ฅผ ์คํ
- ๊ฐ ์์์ ๋ํด ์ฐ์ฐ์ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๋์ฐ๊ธฐ์ ๋ํ์ฌ ์ต์ข ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
- ์ต์ข ์ ์ผ๋ก ๋ฐํ๋๋ ๊ฐ์ ๋ชจ๋ ์์์ ๋ํด acc + if (signs[idx]) num else -num ์ฐ์ฐ์ ์ํํ ๊ฒฐ๊ณผ
๐ก fold() ํจ์
val absolutes = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val sumNumber = absolutes.fold(100) { sum, element ->
sum + element
}
println(sumNumber) // ์ถ๋ ฅ๊ฐ: 155
// ์ด๊ธฐ๊ฐ 100์ absolutes ๋ฐฐ์ด์ element ๋ค์ ํฉ 55๊ฐ ๋ํด์ง ๊ฐ 155๊ฐ ์ถ๋ ฅ
- ์ฃผ์ด์ง Int๋ก๋ง ๊ตฌ์ฑ๋ Array ํน์ Collection ์ ๋ชจ๋ element๋ค์ ์ฐ์์ ์ผ๋ก ๋ถ๋ฌ์ ๊ณ์ฐ
- fold ํจ์๋ ํ๋ผ๋ฏธํฐ๋ก initial๊ฐ(์ด๊ธฐ๊ฐ)์ ๋ฐ์
๐ก foldIndexed() ํจ์
val absolutes = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val signs = booleanArrayOf(false, false, true, true, false, false, true, true, true, true)
val sumWithIndex = absolutes.foldIndexed(0) {
idx, sum, element ->
println("index::: $idx \nsum::: $sum \nelement::: $element")
sum + if (signs[idx]) element else -element
}
- ๋ค๋ฅธ ๊ฑด fold()ํจ์์ ๋๊ฐ๊ณ , index๋ฅผ ๊ฐ์ด ๊ฐ์ ธ์จ๋ค๋ ๊ฒ์ด fold ํจ์์ ๋ค๋ฅธ ์
๋ฐ์ํ
๐ฌ C O M M E N T