코딩테스트

[프로그래머스] 카펫_42842

라임온조 2023. 7. 16. 15:38

문제 및 코드

1. 생각 도출

// 조건
    // 가로는 세로와 같거나 세로보다 더 길다
// 생각
    // yellow의 약수를 구해서 약수 짝끼리 yellow 모양이라고 가정하고 가로, 세로, brwon을 구해본다
    // yellow의 약수를 모두 구해서 약수 짝끼리 살펴 봐야 하니 완전탐색이 아닐까

// yellow보다 작은 수를 돌면서 약수를 구한다
    // 약수가 1이다
        // 가로 = yellow + 2, 세로 = 3
        // 해당 가로세로의 넓이에서 yellow를 뺀 후 brown을 구한다
        // 구한 brown이 주어진 brown과 같으면
            // 더 긴 걸 가로로 하고 작은 걸 세로로 한 후 종료한다
    // 약수가 1이 아니다
        // 첫 번째 약수 + 2, 두 번째 약수 + 2 중 더 긴 것이 가로, 짧은 것이 세로
        // 해당 가로세로 넓이에서 yellow를 뺀 후 brown을 구한다
        // 구한 brown이 주어진 brown과 같으면
            // 더 긴 걸 가로로 하고 작은 걸 세로로 한 후 종료한다
            
-------

// 가로가 더 길거나 같다
// 생각
    // yellow를 어떻게 배치하냐에 따라 brown의 개수가 달라진다
    // 주어진 yellow를 배치할 수 있는 각 방법에 따라 brown 개수를 구한 후 주어진 거라 비교해본다
// 구현
    // yellow를 돌면서 yellow의 약수를 구한다
    // 약수와 약수로 나눈 수 중 큰 수를 가로로 놓고, 작은 수를 세로로 놓는다
    // 해당 가로와 세로에 따른 brown의 개수를 구한다
        // 가로*2 + 세로 *2 + 4
    // 위에서 구한 거와 주어진 brown을 비교해서 같으면 
        // 가로 = 위에서 구한 yellow 가로 + 2, 세로 = 위에서 구한 yellow 세로 + 2

2. 회고

  • 맨 처음에는 이게 왜 완전탐색이지? 어리둥절 했는데 좀만 그리면서 생각해보니까 yellow의 가로 세로는 yellow의 약수짝끼리 형성되고, 이렇게 형성된 yellow 모양에 따라 brown의 개수, 가로, 세로가 결정된다. 그러니 이 문제는 yellow의 약수를 완전 탐색하면서 살펴봐서 brown을 구하고 해당 brown이 주어진 brown에 맞는 경우의 가로 세로를 리턴하면 되는 것이다.
  • 떠오른 것을 직관적으로 코드로 구현하느라 코드가 좀 길어졌는데 약간의 수정을 거치면 코드를 더 줄일 수 있을 것 같다.
  • 그래도 혼자 풀어내서 뿌듯하다...

-----

  • 몇 케이스 직접 그려보니 yellow 모양에 따라 brown의 개수가 달라짐을 확인할 수 있었고, yellow의 모양은 yellow의 약수로 구분할 수 있음을 깨달을 수 있었음. 그래서 yellow의 약수를 완전탐색하면서 brown의 개수를 구하고 주어진 brown과 비교하는 과정을 거침
  • 이제는 쉽게 느껴진다

 

3. 체크

풀이 횟수 시간 정답 여부 참고 여부
2 50분 O  
3 20분 O