From a4c656ae767e6c5ff58b6ba3b0b75e1cd6abfc73 Mon Sep 17 00:00:00 2001 From: usktea Date: Tue, 25 Jul 2023 11:16:15 +0900 Subject: [PATCH] =?UTF-8?q?20230725=20-=20=EB=91=98=EB=A7=8C=EC=9D=98=20?= =?UTF-8?q?=EC=95=94=ED=98=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pair와 mutableMap 중 어떤 것을 선호해야할까 --- ...230\354\225\224\355\230\270.kotlin_module" | Bin 0 -> 24 bytes .../src/Solution.kt" | 46 ++++++++++ .../src/SolutionTest.kt" | 82 ++++++++++++++++++ .../\360\237\222\241-how-to-solve-it-.md" | 53 +++++++++++ 4 files changed, 181 insertions(+) create mode 100644 "20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/out/production/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/META-INF/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270.kotlin_module" create mode 100644 "20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/src/Solution.kt" create mode 100644 "20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/src/SolutionTest.kt" create mode 100644 "20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/\360\237\222\241-how-to-solve-it-.md" diff --git "a/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/out/production/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/META-INF/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270.kotlin_module" "b/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/out/production/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/META-INF/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270.kotlin_module" new file mode 100644 index 0000000000000000000000000000000000000000..1e9f2ca4d180a083a06174d407c30581ce729120 GIT binary patch literal 24 YcmZQzU|?ooU| acc + c } + } + + fun addIndex(asciiCodes: List, toSkip: Set, index: Int): List { + return asciiCodes.map { + val toSkips = calculateToSkips(it, toSkip) + + it + index + toSkips + }.map { + if (it / 'z'.code >= 1) { + 'a'.code + it % 'z'.code + } else it + } + } + + fun calculateToSkips(asciiCode: Int, toSkip: Set): Int { + return toSkip.fold(mutableMapOf("asciiCode" to asciiCode, "toSkip" to 0)) { acc, i -> + println(acc["asciiCode"]) + println(i) + if (acc["asciiCode"] == i) { + acc["asciiCode"] = acc["asciiCode"]!! + 1 + acc["toSkip"] = acc["toSkip"]!! + 1 + } + + if (acc["asciiCode"]!! > 'z'.code) { + acc["asciiCode"] = 'a'.code + acc["asciiCode"]!! % 'z'.code + } + + acc + }["toSkip"]!! + } + + fun toSet(skip: String): Set { + return skip.toCharArray().map { it.code }.toSet() + } + + fun toAsciiCodes(s: String): List { + return s.toCharArray().map { it.code } + } +} \ No newline at end of file diff --git "a/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/src/SolutionTest.kt" "b/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/src/SolutionTest.kt" new file mode 100644 index 00000000..f6f97c9a --- /dev/null +++ "b/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/src/SolutionTest.kt" @@ -0,0 +1,82 @@ +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +class SolutionTest { + + @Test + fun solution() { + val solution = Solution() + val result = solution.solution("aukks", "wbqd", 5) + + assertEquals("happy", result) + } + + @Test + fun solution2() { + val solution = Solution() + val result = solution.solution("a", "wbqd", 5) + + assertEquals("h", result) + } + + + @Test + fun toAsciiCodes() { + val solution = Solution() + val asciiCodes = solution.toAsciiCodes("ab") + + assertEquals(listOf(97, 98), asciiCodes) + } + + @Test + fun toSet() { + val solution = Solution() + val set = solution.toSet("ab") + + assertEquals(setOf(97, 98), set) + } + + @Test + fun addIndex() { + val solution = Solution() + val added = solution.addIndex( + asciiCodes = listOf(97), + toSkip = setOf(99), + index = 1 + ) + + assertEquals(listOf(98), added) + } + + @Test + fun addIndexWhenHaveToSkip() { + val solution = Solution() + val added = solution.addIndex( + asciiCodes = listOf(97), + toSkip = setOf(98), + index = 1 + ) + + assertEquals(listOf(99), added) + } + + @Test + fun addIndexWhenHavOutOfRange() { + val solution = Solution() + val added = solution.addIndex( + asciiCodes = listOf(122), + toSkip = setOf(97), + index = 1 + ) + + assertEquals(listOf(98), added) + } + + @Test + fun calculateToSkips() { + val solution = Solution() + val toSkips = solution.calculateToSkips(122, setOf(122)) + + assertEquals(1, toSkips) + } +} diff --git "a/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/\360\237\222\241-how-to-solve-it-.md" "b/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/\360\237\222\241-how-to-solve-it-.md" new file mode 100644 index 00000000..936f2234 --- /dev/null +++ "b/20230725-\353\221\230\353\247\214\354\235\230\354\225\224\355\230\270/\360\237\222\241-how-to-solve-it-.md" @@ -0,0 +1,53 @@ +### 1. 이해 +> 아래의 질문에 대한 답변이 녹아 있어야 한다. + +- [ ] 모르는 것은 무엇인가? +- [ ] 주어진 것은 무엇인가? +- [ ] 자료는 무엇인가? +- [ ] 조건은 무엇인가? +- [ ] 조건은 알아내야 하는 것을 찾는데 충분한가? + +### 2. 계획 +> A) 계획을 세우기 전에 아래와 같은 질문을 던지면 굉장히 유용하다. + +- [ ] 관련된 문제를 알고 있는가? +- [ ] 모르는 부분이 유사한 다른 문제를 풀어 본 적이 있는가? +- [ ] 전에 풀어 본 문제를 활용하려면 어떤 보조 요소를 도입해야 되는가? +- [ ] 도움이 될 것 같은 어떤 사실이나 정리를 알고 있는가? (보통은 자료 구조나 수학적 공리 또는 정의가 해당됨) + +> B) 계획을 세운 뒤 아래 질문을 통해 한번 더 점검해보자. + +- [ ] 자료와 조건은 모두 활용 했는가? (Edge case가 될 조건을 꼭 확인해야 함) + +### 3. 실행 +> 코딩을 하는 단계! 무조건 Test case부터 먼저 작성해야 한다. +💡 TDD를 같이 하는 이유: Test code를 통해 각 단계가 올바르게 동작하는 것을 증명할 수 있다. + +- [ ] 각 단계가 올바른지 명확히 알 수 있는가? +- [ ] 그것이 옳다는 것을 설명할 수 있는가? + +### 4. 반성 +> 문제를 다 풀고 나서 회고하는 시간을 갖는다. 반성한 부분을 다음 문제 풀이에 반영한다. + +- [ ] 다른 방법으로 해결할 수는 없었는가? (이때 다른 사람의 풀이도 참고하면 좋음) +- [ ] 결과나 방법을 다른 문제에 활용할 수 있는가? (유용한 패턴은 따로 정리해두자) + +## [둘만의 암호](https://school.programmers.co.kr/learn/courses/30/lessons/155652) +문자열 s와 skip 그리고 자연수 index가 주어질 때 규칙에 따라 s를 변환해 결과를 반환해라 + +### 1. 이해 +- s에 포함된 문자는 index 만큼 뒤의 알파벳으로 바꿔준다. s = "a", index = 1, 결과 = "b" +- skip 에 포함된 문자열은 건너 뛴다. s = "a", index = 1, skip = "b" 결과 = "c' +- index 만큼 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아간다 + +### 2. 계획 +- s 문자열을 ascii code들로 변경한다. +- 변경된 code를 index 만큼 code에 수를 더한다 +- index가 추가된 code가 z의 code 보다 클 경우 % zcode의 값으로 변경한다 +- code들을 문자열배열로 변환한다 + +### 3. 실행 +- + +### 4. 반성 +-