{"id":300906,"date":"2022-11-28T11:31:01","date_gmt":"2022-11-28T10:31:01","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kotlin\/2021\/07\/advent-of-code-in-idiomatic-kotlin\/"},"modified":"2022-11-28T12:01:50","modified_gmt":"2022-11-28T11:01:50","slug":"advent-of-code-in-idiomatic-kotlin","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/ko\/kotlin\/2022\/11\/advent-of-code-in-idiomatic-kotlin\/","title":{"rendered":"\uad00\uc6a9\uc801 Kotlin\uc73c\ub85c Advent of Code \ud37c\uc990 \ud480\uae30"},"content":{"rendered":"<p>\ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83 \uc678\uc5d0 \uc5b8\uc5b4\ub97c \ubc30\uc6b0\ub294 \uac00\uc7a5 \uc88b\uc740 \ubc29\ubc95\uc740 \ubb34\uc5c7\uc77c\uae4c\uc694? <a href=\"https:\/\/adventofcode.com\/\" target=\"_blank\" rel=\"noopener\">Advent of Code<\/a>\uc640 \uac19\uc740 \uc7ac\ubbf8\uc788\uace0 \uc9e7\uc740 \uacfc\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uac83 \ub610\ud55c \uc5b8\uc5b4 \ub2a5\ub825\uc744 \ud5a5\uc0c1\uc2dc\ud0a4\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\uc744 \ubfd0\ub9cc \uc544\ub2c8\ub77c, \ub3d9\uc77c\ud55c \ubb38\uc81c\ub97c \ub2e4\ub978 \uc0ac\ub78c\uc774 \ud574\uacb0\ud55c \ubc29\ubc95\uacfc \uc790\uc2e0\uc758 \ubc29\ubc95\uc744 \ube44\uad50\ud574 \ubcf4\uba74\uc11c \ub9ce\uc740 \uac83\uc744 \ubc30\uc6b8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Kotlin \ud300\uc744 \ud3ec\ud568\ud558\uc5ec \uc804 \uc138\uacc4\uc758 \ub9ce\uc740 \uac1c\ubc1c\uc790\ub4e4\uc774 <a href=\"https:\/\/twitter.com\/ericwastl\" target=\"_blank\" rel=\"noopener\">Eric Wastl<\/a>\uc774 \ub9cc\ub4e0 Advent of Code \ucc4c\ub9b0\uc9c0\uc5d0 \ucc38\uc5ec\ud569\ub2c8\ub2e4. Advent of Code\ub294 \ub9e4\ub144 12\uc6d4\uc5d0 \uac8c\uc2dc\ub418\ub294 \uc77c\ub828\uc758 \uacfc\uc81c\ub85c, \uacfc\uc81c\ub97c \ud574\uacb0\ud558\uace0 \ub2e4\ub978 \uc0ac\ub78c\uacfc \uacbd\uc7c1\ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc9c0\uae08\uc740 \ud06c\ub9ac\uc2a4\ub9c8\uc2a4\uc640 \uc0c8\ud574\ub97c \uae30\ub150\ud560 \ucd5c\uace0\uc758 \uac15\ub9bc\uc808 \uc2dc\uae30\uc785\ub2c8\ub2e4!<\/p>\n<p>\ucee4\ubba4\ub2c8\ud2f0\uc5d0 \uad00\uc6a9\uc801 Kotlin\uc744 \ubc30\uc6b0\uace0\uc790 \ud558\ub294 \ubd84\uc704\uae30\ub97c \ud655\uc0b0\ud558\uace0 \uc55e\uc73c\ub85c \ub354 \ub9ce\uc740 \uac1c\ubc1c\uc790\uac00 Kotlin\uc744 \uc0ac\uc6a9\ud558\uc5ec Advent of Code \uacfc\uc81c\ub97c \ud480\uc5b4 \ubcfc \uc218 \uc788\ub3c4\ub85d, JetBrains\ub294 Advent of Code 2020 \uacfc\uc81c\uc758 \uc194\ub8e8\uc158\uc744 \uc900\ube44\ud558\uae30\ub85c \uacb0\uc815\ud588\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc774 \uc774\ubbf8 \uc774\uc804\uc5d0 \uc774 \ubb38\uc81c\ub97c \ud480\uc5c8\uac70\ub098, \uc9c0\uae08 \uc774 \ubb38\uc81c\ub97c \ud480 \uc900\ube44\uac00 \ub418\uc5c8\uac70\ub098, \ub2e8\uc9c0 \ud480\uc774 \uacfc\uc815\uc744 \ud655\uc778\ud574\ubcf4\uace0 \uc2f6\uc740 \ubaa8\ub4e0 \ubd84\ub4e4\uaed8 \uc720\uc6a9\ud558\uae30\ub97c \ubc14\ub78d\ub2c8\ub2e4. \ubb3c\ub860, \uc774 \uae00\uc744 \uc77d\uae30 \uc804\uc5d0 \ud574\ub2f9 \uacfc\uc81c\ub97c \uc2a4\uc2a4\ub85c \ud574\uacb0\ud574 \ubcf4\ub294 \uac83\uc774 \uac00\uc7a5 \uc88b\uc2b5\ub2c8\ub2e4!<\/p>\n<p><\/p>\n<p>\uccab \ubc88\uc9f8 \uacfc\uc81c\uc5d0 \ub300\ud55c \ud480\uc774 \uacfc\uc815\uacfc \ub3d9\uc601\uc0c1\uc740 \uc544\ub798\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694. \ub3d9\uc601\uc0c1\uc5d0\ub294 <strong>\ud55c\uad6d\uc5b4 \uc790\ub9c9\uc774 \ud3ec\ud568<\/strong>\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7f0 \ud615\ud0dc\uc758 \uc790\ub8cc\uac00 \uc720\uc775\ud558\ub2e4\uace0 \uc0dd\uac01\ud558\uace0, \uc774 \uc678\uc5d0 \uc5ec\ub7ec \uacfc\uc81c\uc5d0 \ub300\ud55c \ud480\uc774 \uacfc\uc815\uc744 \uc6d0\ud558\uc2dc\uba74 \uc544\ub798 \ub313\uae00\uc5d0 \uc758\uacac\uc744 \ub0a8\uaca8 \uc8fc\uc138\uc694.<\/p>\n<p><iframe loading=\"lazy\" title=\"YouTube \ub3d9\uc601\uc0c1 \ud50c\ub808\uc774\uc5b4\" src=\"https:\/\/www.youtube.com\/embed\/o4emra1xm88\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<h2>1\uc77c \ucc28. Report Repair(\ubcf4\uace0\uc11c \uc218\uc815)<\/h2>\n<p>\uacbd\ube44 \ubcf4\uace0\uc11c\ub97c \uc218\uc815\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4! <a href=\"https:\/\/adventofcode.com\/2020\/day\/1\" target=\"_blank\" rel=\"noopener\">https:\/\/adventofcode.com\/2020\/day\/1<\/a>\uc5d0\uc11c \uc804\uccb4 \uacfc\uc81c \uc124\uba85\uc744 \ud655\uc778\ud558\uc138\uc694.*<\/p>\n<p>\uc22b\uc790 \ubaa9\ub85d\uc5d0\uc11c \ud569\uc774 2020\uc774 \ub418\ub294 2\uac1c\uc758 \uc22b\uc790(\ub450 \ubc88\uc9f8 \ubd80\ubd84\uc5d0\uc11c\ub294 3\uac1c)\ub97c \ucc3e\uc740 \uadf8 2\uac1c \uc22b\uc790(\ub610\ub294 3\uac1c)\ub97c \uacf1\ud569\ub2c8\ub2e4.<\/p>\n<h3 id=\"how-to-solve\">\uacfc\uc81c \ud574\uacb0 \ubc29\ubc95<\/h3>\n<p><a href=\"https:\/\/adventofcode.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/adventofcode.com\/<\/a>\uc5d0\uc11c \ub4f1\ub85d\ud558\uace0 <a href=\"https:\/\/adventofcode.com\/2020\/day\/1\" target=\"_blank\" rel=\"noopener\">https:\/\/adventofcode.com\/2020\/day\/1<\/a>\uc5d0\uc11c \uacfc\uc81c\ub97c \uc5f4\uc5b4 Kotlin\uc73c\ub85c \ud574\uacb0 \ubc29\ubc95\uc744 \uc791\uc131\ud55c \ub2e4\uc74c, \uc0ac\uc774\ud2b8\uc5d0\uc11c \uacb0\uacfc\ub97c \ud655\uc778\ud558\uc138\uc694. Kotlin \ucf54\ub4dc\ub294 <a href=\"https:\/\/play.kotlinlang.org\/\" target=\"_blank\" rel=\"noopener\">\uc628\ub77c\uc778<\/a>\uc5d0\uc11c \uc791\uc131\ud558\uac70\ub098 IDE\uc5d0\uc11c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.jetbrains.com\/ko-kr\/idea\/download\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a>\uc758 \ubb34\ub8cc Community Edition\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/jvm-get-started.html\" target=\"_blank\" rel=\"noopener\">Kotlin \ud504\ub85c\uc81d\ud2b8<\/a>\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.<\/li>\n<li>\uc5ec\uae30\uc11c \ud574\ub2f5\uc744 \uc791\uc131\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc790\uc2e0\uc758 \ud574\ub2f5\uc744 \uc544\ub798\uc758 \ud574\ub2f5\uacfc \ube44\uad50\ud569\ub2c8\ub2e4.<\/p>\n<p>\ucf54\ub4dc\ub97c \ubc14\ub85c \ub123\uc744 \uc218 \uc788\uac8c <code>src<\/code> \ud3f4\ub354\ub97c \uc18c\uc2a4 \uc138\ud2b8\ub85c <a href=\"https:\/\/github.com\/svtk\/advent-of-code-2020\/blob\/master\/build.gradle.kts\" target=\"_blank\" rel=\"noopener\">\ud45c\uc2dc<\/a>\ud588\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\ub97c \uc704\ud574 <code>src\/day1\/input.txt<\/code>\uc640 \uac19\uc740 \uc785\ub825 \ud30c\uc77c\uc744 \uc18c\uc2a4 \ud3f4\ub354\uc5d0 \ubcf5\uc0ac\ud588\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/Kotlin-hands-on\/advent-of-code-2020\" target=\"_blank\" rel=\"noopener\">\uc774 \ud504\ub85c\uc81d\ud2b8<\/a>\uc5d0\uc11c \ud574\ub2f5\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\ud574\uc124<\/h3>\n<p>\ub2e4\uc74c\uc740 \uc608\uc81c\uc785\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n1721\n979\n366\n299\n675\n1456\n<\/pre>\n\n\n<p>\uba3c\uc800, \uc785\ub825\uc744 \uc77d\uace0 \uc774\ub97c \ubd84\uc11d\ud574\uc57c \ud569\ub2c8\ub2e4. Kotlin <code>readLines()<\/code> \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc8fc\uc5b4\uc9c4 \ud30c\uc77c\uc5d0\uc11c \uc904 \ubaa9\ub85d\uc744 \uc77d\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nFile(&quot;src\/day1\/input.txt&quot;).readLines()\n<\/pre>\n\n\n<p><code>readLines()<\/code>\ub294 \ubb38\uc790\uc5f4 \ubaa9\ub85d\uc744 \ubc18\ud658\ud558\uace0 \uc774\ub97c \uc22b\uc790 \ubaa9\ub85d\uc73c\ub85c \ubcc0\ud658\ud569\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nimport java.io.File\nfun main() {\n   val numbers = File(&quot;src\/day1\/input.txt&quot;)\n       .readLines()\n       .map(String::toInt)\n\n\n}\n<\/pre>\n\n\n<p>\uc774 \ucf54\ub4dc\ub97c \ud504\ub85c\uadf8\ub7a8\uc758 \uc9c4\uc785\uc810\uc778 <code>main<\/code> \ud568\uc218 \uc548\uc5d0 \ub123\uc2b5\ub2c8\ub2e4. \uc785\ub825\uc744 \uc2dc\uc791\ud558\uba74 IntelliJ IDEA\uac00 <code>java.io.File<\/code>\uc744 \uc790\ub3d9\uc73c\ub85c \uac00\uc838\uc635\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \ubaa9\ub85d\uc744 \ubc18\ubcf5\ud558\uace0 \uac01 \uc22b\uc790\uc5d0 \ub300\ud574 \ubc18\ubcf5 \uc2e4\ud589\uc744 \uc218\ud589\ud558\uc5ec \ud569\uacc4\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfor (first in numbers) {\n   for (second in numbers) {\n       if (first + second == 2020) {\n           println(first * second)\n           return\n       }\n   }\n}\n<\/pre>\n\n\n<p>\uc774 \ucf54\ub4dc\ub97c <code>main<\/code> \uc548\uc5d0 \ub123\uc73c\uba74 \ud544\uc694\ud55c \uc22b\uc790\uac00 \ubc1c\uacac\ub418\uc5c8\uc744 \ub54c <code>main<\/code>\uc5d0\uc11c <code>return<\/code>\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub9c8\ucc2c\uac00\uc9c0\ub85c 3\uac1c \uc22b\uc790\uc758 \ud569\ub3c4 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfor (first in numbers) {\n   for (second in numbers) {\n       for (third in numbers) {\n           if (first + second + third == 2020) {\n               println(first * second * third)\n               return\n           }\n       }\n   }\n}\n<\/pre>\n\n\n<p>\uc774 \ucf54\ub4dc\ub97c \uc2e4\ud589\ud558\uace0 \uc8fc\uc5b4\uc9c4 \uc785\ub825 \uac12\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uc0c1 \uc785\ub2c8\ub2e4! \uccab \ubc88\uc9f8 \uacfc\uc81c\ub294 \uc815\ub9d0 \uac04\ub2e8\ud569\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub7ec\ub098 \uc774 \ubc29\ubc95\uc740 \uac01 \uc694\uc18c\uc5d0 \ub300\ud574 \ub3d9\uc77c\ud55c \ubaa9\ub85d\uc744 \ubc18\ubcf5\ud574\uc11c \uc2e4\ud589\ud569\ub2c8\ub2e4. \ub450 \uac1c\uc758 \uc22b\uc790\ub97c \ucc3e\uae30 \uc704\ud55c \ub450 \uac1c\uc758 \uc911\ucca9 \ub8e8\ud504\uac00 \uc788\uc73c\uba74 N<sup>2<\/sup>\ud68c\uc758 \uc5f0\uc0b0\uc774 \uc774\ub8e8\uc5b4\uc9d1\ub2c8\ub2e4. \uc5ec\uae30\uc11c N\uc740 \uc694\uc18c\uc758 \uc218\uc785\ub2c8\ub2e4. 3\uac1c\uc758 \uc22b\uc790\ub97c \ucc3e\uc544\uc57c \ud558\ub294 \uacbd\uc6b0, 3\uac1c\uc758 \uc911\ucca9 \ub8e8\ud504\uc640 N<sup>3<\/sup>\ud68c\uc758 \uc5f0\uc0b0\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc22b\uc790 \ubaa9\ub85d\uc774 \ud070 \uacbd\uc6b0\uc5d0\ub294 \uc774 \ubc29\ubc95\uc740 \uc774\ub7ec\ud55c \uc720\ud615\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uac00\uc7a5 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc774 \uc544\ub2d9\ub2c8\ub2e4. \ubd84\uba85 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774 \uc788\uc9c0 \uc54a\uc744\uae4c\uc694?<\/p>\n<p>\ub124, \ub2f9\uc5f0\ud788 \ub354 \ud6a8\uacfc\uc801\uc778 \ubc29\ubc95\uc774 \uc788\uace0 Kotlin \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \uc774\ub97c \uac04\uacb0\ud558\uac8c \ud45c\ud604\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae34 \uacc4\uc0b0\uc744 \uacb0\uacfc\ub97c \ucc3e\ub294 \ub370 \uc0ac\uc6a9\ub418\ub294 \uc77c\uc885\uc758 \uc2a4\ub9c8\ud2b8 \uc2a4\ud1a0\ub9ac\uc9c0\ub85c \ub300\uccb4\ud560 \uc218 \uc788\uace0, \uc2e4\uc81c \ub9ce\uc774 \uadf8\ub807\uac8c \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\ub450 \uc22b\uc790\uc5d0 \ub300\ud55c \uacfc\uc81c \ud574\uacb0\ud558\uae30<\/h3>\n<p>\uba3c\uc800 \uc22b\uc790 &#8220;\ubcf4\uc218&#8221;\uc5d0 \ub300\ud55c \ub9f5\uc744 \uc791\uc131\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ubcf4\uc218\ub294 \uc8fc\uc5b4\uc9c4 \uc22b\uc790\uc640 \ud569\ud558\uc5ec 2020\uc774 \ub418\ub294 \uc22b\uc790\ub97c \ub9d0\ud569\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nval complements = numbers.associateBy { 2020 - it }\n<\/pre>\n\n\n<p>Kotlin <code>associateBy<\/code> \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub9f5\uc744 \uc791\uc131\ud569\ub2c8\ub2e4. \uadf8 \ub78c\ub2e4 \uc778\uc218\ub294 \ubaa9\ub85d \uc694\uc18c\ub97c \uc800\uc7a5\ud558\ub294 \uc774 \ub9f5\uc758 \ud0a4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc0d8\ud50c \uc785\ub825\uc758 \uacbd\uc6b0 \ub2e4\uc74c \ub9f5\uc774 \ub429\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nnumbers: [1721, 979, 366, 299, 675, 1456]\ncomplements map: {299=1721, 1041=979, 1654=366, 1721=299, 1345=675, 564=1456}<\/pre>\n\n\n<p>\uc774 \uc808\ucc28\uac00 \ub05d\ub098\uba74 \ub2f5\uc744 \uba85\ud655\ud558\uac8c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4! \ubaa9\ub85d\uc758 \uccab \ubc88\uc9f8 \uc22b\uc790 <code>1721<\/code>\uc740 <code>\ubcf4\uc218<\/code> \ub9f5\uc5d0 <code>1721=299<\/code> \ud0a4\ub85c \ud45c\uc2dc\ub429\ub2c8\ub2e4. \uc989, \uc774\uac83\uc774 \uc22b\uc790 <code>299<\/code>\uc5d0 \ub300\ud55c \ubcf4\uc218\uc774\uace0 \ud569\uacc4\ub294 <code>2020<\/code>\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uc815\ubcf4\ub97c \ub9f5\uc5d0 \uc800\uc7a5\ud558\uba74 \uc774 \ub9f5\uc5d0 \ubaa9\ub85d\uc758 \uc22b\uc790\uc5d0 \ubcf4\uc218\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \ucf54\ub4dc\ub294 \uae30\uc874 \ubcf4\uc218\uac00 \uc788\ub294 \uccab \ubc88\uc9f8 \uc22b\uc790\ub97c \ucc3e\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nval pair = numbers.mapNotNull { number -&gt;\n   val complement = complements[number]\n   if (complement != null) Pair(number, complement) else null\n}.firstOrNull()\n<\/pre>\n\n\n<p>\uac01 \uc22b\uc790\ub97c \uc22b\uc790\uc640 \uadf8 \ubcf4\uc218(\ubcf4\uc218\uac00 \uc874\uc7ac\ud558\ub294 \uacbd\uc6b0)\ub85c \uad6c\uc131\ub41c \uc30d\uc73c\ub85c \ubcc0\ud658\ud55c \ub2e4\uc74c \uccab \ubc88\uc9f8 null\uc774 \uc544\ub2cc \uacb0\uacfc\ub97c \ucc3e\uc2b5\ub2c8\ub2e4.<\/p>\n<p><code>mapNotNull<\/code>\uc744 \uc0ac\uc6a9\ud558\uc5ec \ubaa9\ub85d\uc758 \uac01 \uc694\uc18c\ub97c \ubcc0\ud658\ud558\uace0 \ubaa8\ub4e0 <code>null<\/code> \uacb0\uacfc\ub97c \ud544\ud130\ub9c1\ud569\ub2c8\ub2e4. \uc774\ub294 \uccab \ubc88\uc9f8 <code>map<\/code>\uc744 \ud638\ucd9c\ud55c \ub2e4\uc74c \uacb0\uacfc\uc5d0 \ub300\ud574 <code>filterNotNull<\/code>\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc744 \ub2e8\ucd95\ud55c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p><code>firstOrNull<\/code>\uc740 \ubaa9\ub85d\uc758 \uccab \ubc88\uc9f8 \uc694\uc18c\ub97c \ubc18\ud658\ud558\uac70\ub098 \ubaa9\ub85d\uc774 \ube44\uc5b4 \uc788\uc73c\uba74 <code>null<\/code>\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. Kotlin \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \uc885\uc885 <code>OrNull<\/code> \uc811\ubbf8\uc0ac\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2e4\ud328 \uc2dc \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uace0 <code>null<\/code>\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218\ub97c \ud45c\uc2dc\ud569\ub2c8\ub2e4(\uc608: <code>elementAtOrNull<\/code>, <code>singleOrNull&lt; \/0&gt; \ub610\ub294 <code>maxOrNull<\/code>).<br>\n<\/code><\/p>\n<p>\nKotlin 1.5.0\ubd80\ud130 \ub450 \uac1c\uc758 \uacb0\uacfc\uc801 \uc5f0\uc0b0\uc778 <code>mapNotNull<\/code> \ubc0f <code>first(OrNull)<\/code>\uc744 \ud558\ub098\uc758 \ud568\uc218 \ud638\ucd9c <code>firstNotNullOf(OrNull)<\/code><!--0 -->\ub85c \ubc14\uafc0 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubcf4\uc870\uc801\uc778 \uad6c\uc870\ub97c \uad6c\ucd95\ud55c \ud6c4, \uc774\uc804\ucc98\ub7fc N<sup>2<\/sup>\uc774 \uc544\ub2cc N \uc5f0\uc0b0\uc758 \uacb0\uacfc\ub85c \ud569\uc774 2020\uc774 \ub418\ub294 2\uac1c\uc758 \uc22b\uc790\ub97c \ucc3e\uc744 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4!<\/p>\n<p>\uc774 2\uac1c\uc758 \uc22b\uc790\ub97c \uacf1\ud574\uc57c \ud558\ubbc0\ub85c \ub9c8\uc9c0\ub9c9 \ub2e8\uacc4\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nprintln(pair?.let { (a, b) -&gt; a * b })\n<\/pre>\n\n\n<p><code>pair<\/code> \ubcc0\uc218\ub294 \ub450 \uc22b\uc790\uc758 nullable <code>Pair<\/code>\ub97c \ud3ec\ud568\ud558\uac70\ub098,  \ucd08\uae30 \ubaa9\ub85d\uc5d0\uc11c \ud569\uc774 2020\uc774 \ub418\ub294 \uc22b\uc790\uac00 \uc5c6\uc73c\uba74 <code>null<\/code>\uc785\ub2c8\ub2e4. \uc548\uc804\ud55c \uc561\uc138\uc2a4 <code>?.<\/code>\ub97c <code>let<\/code> \ud568\uc218\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud558\uace0 <code>pair<\/code>\uac00 <code>null<\/code>\uc774 \uc544\ub2cc \uacbd\uc6b0 \uacb0\uacfc\ub97c \ud45c\uc2dc\ud558\uae30 \uc704\ud574 \ub78c\ub2e4 \uad6c\ubb38\uc758 \uad6c\uc870 \ubd84\ud574\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<h3>\uc138 \uac1c\uc758 \uc22b\uc790\uc5d0 \ub300\ud55c \uacfc\uc81c \ud574\uacb0\ud558\uae30<\/h3>\n<p>\ub2e4\uc74c \ub2e8\uacc4\ub294 \uc138 \uac1c\uc758 \uc22b\uc790\uc5d0 \ub300\ud574 \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc9c0\uae08\uae4c\uc9c0 \uc218\ud589\ud55c \uc791\uc5c5\uc744 \uc7ac\uc0ac\uc6a9\ud558\uace0 \ud569\ud558\uc5ec \uc8fc\uc5b4\uc9c4 \uc22b\uc790\uac00 \ub418\ub294 \uc22b\uc790 \uc30d\uc744 \ucc3e\ub294 \ub17c\ub9ac\ub97c \ubcc4\ub3c4\uc758 \ud568\uc218\ub85c \ucd94\ucd9c\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun List&lt;Int&gt;.findPairOfSum(sum: Int): Pair&lt;Int, Int&gt;? {\n   \/\/ Map: sum - x -&gt; x\n   val complements = associateBy { sum - it }\n   return firstNotNullOfOrNull { number -&gt;\n       val complement = complements[number]\n       if (complement != null) Pair(number, complement) else null\n   }\n}\n<\/pre>\n\n\n<p><code>firstNotNullOfOrNull<\/code> \ud568\uc218\ub3c4 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c <code>findPairOfSum<\/code>\uc744 \uc0ac\uc6a9\ud558\uc5ec \uac01 \uc22b\uc790 \ubc0f \uc774 \uc22b\uc790\uc640 \ud568\uaed8 \ud569\uc774 2020\uc774 \ub418\ub294 \ubcf4\uc218\uc758 <em>\uac12 \uc30d<\/em>\uc744 \uc800\uc7a5\ud558\ub294 \ubcf4\uc870 \ub9f5\uc744 \uc791\uc131\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n\/\/ Map: x -&gt; (y, z) where y + z = 2020 - x\nval complementPairs: Map&lt;Int, Pair&lt;Int, Int&gt;?&gt; =\n   numbers.associateWith { numbers.findPairOfSum(2020 - it) }\n<\/pre>\n\n\n<p>\ub3d9\uc77c\ud55c \ucd08\uae30 \uc785\ub825\uc5d0 \ub300\ud574 \ubcf4\uc218 \uc30d \ub9f5\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nnumbers: [1721, 979, 366, 299, 675, 1456]\ncomplement pairs: {1721=null, 979=(366, 675), 366=(979, 675), 299=null, 675=(979, 366), 1456=null}<\/pre>\n\n\n<p>\uc774\uc804\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c \ub2f5\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4! \ub9f5\uc5d0\uc11c null\uc774 \uc544\ub2cc \uc30d\uc5d0 \ud574\ub2f9\ud558\ub294 \uc22b\uc790\uc785\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub7ec\ub098 \uc2e4\uc81c\ub85c \uc804\uccb4 \ub9f5\uc744 \uc791\uc131\ud560 \ud544\uc694\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. null\uc774 \uc544\ub2cc \uc30d\uc5d0 \ud574\ub2f9\ud558\ub294 \uccab \ubc88\uc9f8 \uc22b\uc790\ub9cc \ucc3e\uc73c\uba74 \ub429\ub2c8\ub2e4! \uc774\ubbf8 \ub9ce\uc740 \ubd84\ub4e4\uc5d0\uac8c \uce5c\uc219\ud55c <code>firstNotNullOfOrNull<\/code> \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \ucc3e\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun List&lt;Int&gt;.findTripleOfSum(): Triple&lt;Int, Int, Int&gt;? =\n   firstNotNullOfOrNull { x -&gt;\n       findPairOfSum(2020 - x)?.let { pair -&gt;\n           Triple(x, pair.first, pair.second)\n       }\n   }\n<\/pre>\n\n\n<p>Kotlin\uc758 \uac04\uacb0\ud55c \uad6c\ubb38\uc5d0 \uc8fc\ubaa9\ud558\uc138\uc694. \ud568\uc218\ub294 \ud45c\ud604\uc2dd\uc744 \uc9c1\uc811 \ubc18\ud658\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub9c8\uc9c0\ub9c9 \ub2e8\uacc4\ub294 \uc774\uc804\uc5d0 \ud588\ub358 \uac83\uacfc \uac19\uc774 \uc138 \uac1c\uc758 \uc22b\uc790 \uacb0\uacfc \uac12\uc774 null\uc774 \uc544\ub2cc \uacbd\uc6b0 \uc774\ub97c \uacf1\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nprintln(triple?.let { (x, y, z) -&gt; x * y * z} )\n<\/pre>\n\n\n<p>\uc774\uc0c1\uc785\ub2c8\ub2e4!<\/p>\n<p>\ub2e4\uc74c \uae00\uc5d0\uc11c\ub294 2\uc77c\ucc28 \uacfc\uc81c\ub97c \ud574\uacb0\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc774 \uc720\uc6a9\ud558\ub2e4\uace0 \uc0dd\uac01\ub418\uace0 \ub354 \ub9ce\uc740 \uacfc\uc81c\uc5d0 \ub300\ud55c \ud480\uc774\ub97c \uc6d0\ud55c\ub2e4\uba74 \uc800\ud76c\uc5d0\uac8c \uc54c\ub824\uc8fc\uc138\uc694!<\/p>\n<p>\u2014<\/p>\n<p>*<a href=\"https:\/\/adventofcode.com\/\" target=\"_blank\" rel=\"noopener\">Advent of Code<\/a>(<a href=\"https:\/\/twitter.com\/ericwastl\" target=\"_blank\" rel=\"noopener\">Eric Wastl<\/a>)\uc758 \ud5c8\ub77d \ud558\uc5d0 \uc0ac\uc6a9\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n<p><em>\uac8c\uc2dc\ubb3c \uc6d0\ubb38 \uc791\uc131\uc790<\/em><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":964,"featured_media":162256,"comment_status":"open","ping_status":"closed","template":"","categories":[89],"tags":[63,91,3682],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/300906"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/964"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=300906"}],"version-history":[{"count":11,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/300906\/revisions"}],"predecessor-version":[{"id":314290,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/300906\/revisions\/314290"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/162256"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=300906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=300906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=300906"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=300906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}