diff --git "a/20230329\354\271\264\355\216\253/src/Solution.java" "b/20230329\354\271\264\355\216\253/src/Solution.java" new file mode 100644 index 00000000..1e8ddc0a --- /dev/null +++ "b/20230329\354\271\264\355\216\253/src/Solution.java" @@ -0,0 +1,40 @@ +public class Solution { + public void test() { + System.out.println(getBrown(3, 3) == 8); + System.out.println(getYellow(3, 3) == 1); + System.out.println(getYellow(4, 4) == 4); + } + + public int[] solution(int brown, int yellow) { + test(); + + int width = 3; + int height = 3; + + while (!(getBrown(width, height) == brown) && !(getYellow(width, height) == yellow)) { + width += 1; + + if (getBrown(width, height) > brown) { + height += 1; + width = height; + + continue; + } + + if ((getBrown(width, height) == brown) && (getYellow(width, height) != yellow)) { + height += 1; + width = height; + } + } + + return new int[]{width, height}; + } + + public int getBrown(int width, int height) { + return width * 2 + ((height - 2) * 2); + } + + public int getYellow(int width, int height) { + return (width - 2) * (height - 2); + } +} diff --git "a/20230329\354\271\264\355\216\253/\360\237\222\241-how-to-solve-it-.md" "b/20230329\354\271\264\355\216\253/\360\237\222\241-how-to-solve-it-.md" new file mode 100644 index 00000000..2b2a99dd --- /dev/null +++ "b/20230329\354\271\264\355\216\253/\360\237\222\241-how-to-solve-it-.md" @@ -0,0 +1,56 @@ +### 1. 이해 +> 아래의 질문에 대한 답변이 녹아 있어야 한다. + +- [ ] 모르는 것은 무엇인가? +- [ ] 주어진 것은 무엇인가? +- [ ] 자료는 무엇인가? +- [ ] 조건은 무엇인가? +- [ ] 조건은 알아내야 하는 것을 찾는데 충분한가? + +### 2. 계획 +> A) 계획을 세우기 전에 아래와 같은 질문을 던지면 굉장히 유용하다. + +- [ ] 관련된 문제를 알고 있는가? +- [ ] 모르는 부분이 유사한 다른 문제를 풀어 본 적이 있는가? +- [ ] 전에 풀어 본 문제를 활용하려면 어떤 보조 요소를 도입해야 되는가? +- [ ] 도움이 될 것 같은 어떤 사실이나 정리를 알고 있는가? (보통은 자료 구조나 수학적 공리 또는 정의가 해당됨) + +> B) 계획을 세운 뒤 아래 질문을 통해 한번 더 점검해보자. + +- [ ] 자료와 조건은 모두 활용 했는가? (Edge case가 될 조건을 꼭 확인해야 함) + +### 3. 실행 +> 코딩을 하는 단계! 무조건 Test case부터 먼저 작성해야 한다. +💡 TDD를 같이 하는 이유: Test code를 통해 각 단계가 올바르게 동작하는 것을 증명할 수 있다. + +- [ ] 각 단계가 올바른지 명확히 알 수 있는가? +- [ ] 그것이 옳다는 것을 설명할 수 있는가? + +### 4. 반성 +> 문제를 다 풀고 나서 회고하는 시간을 갖는다. 반성한 부분을 다음 문제 풀이에 반영한다. + +- [ ] 다른 방법으로 해결할 수는 없었는가? (이때 다른 사람의 풀이도 참고하면 좋음) +- [ ] 결과나 방법을 다른 문제에 활용할 수 있는가? (유용한 패턴은 따로 정리해두자) + +## [카펫](https://school.programmers.co.kr/learn/courses/30/lessons/42842?language=java) +갈색 격자의 수 brown 과 노란색 격자의 수 yellow가 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 반환해라. + +### 1. 이해 +- 갈색 격자의 수는 8이상 5000이하이다 +- 노란색 격자의 수는 1이상 2,000,0000 이하이다 +- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다. + +### 2. 계획 +- height 의 최소값은 3이다. +- 갈색 격자를 구하는 공식은 길이 * 2 + (높이 - 2) * 2 +- 노란 격자를 구하는 공식은 (길이 - 2) * (높이 - 2) * 2 +- height = 3, width = 3 부터 brown과 계산된 brown이 동일하거나 보다 많을 때 까지 width를 1씩 추가한다. +- 계산된 brown이 주어진 brown보다 크다면 height를 1 추가하고 width도 height과 같은 값으로 수정한다. +- brown이 계산된 값과 일치할 경우 계산된 yellow가 주어진 yellow와 동일한 경우 width와 height를 반환한다. +- 일치하지 않은 경우 height + 1 widht = height; + +### 3. 실행 +- + +### 4. 반성 +-