안녕하세요. 이번에는 프로그래머스 카펫 문제를 풀어보려고 합니다.
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Problem
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해 주세요.
[제한 사항]
○ 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
○ 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
○ 카펫의 가로길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

Solution
class Solution {
fun solution(brown: Int, yellow: Int): IntArray {
var answer = intArrayOf()
var sum = brown + yellow
for (h in 3..sum) {
var w = sum / h
var row = w * 2 + 2 * (h - 2)
var col = (h - 2) * (w - 2)
if(brown == row && yellow == col) {
answer += w
answer += h
break
}
}
return answer
}
}
이번 문제는 테두리는 브라운, 중앙은 노란색을 하기 위해서 기본적으로 i를 3으로 시작하도록 하였습니다. 왜냐하면 i가 2이면 중앙에 노란색을 할 수 없기 때문입니다. 그리고 row값과 col값을 구하는 식을 작성하였습니다.
row 구하는 식
row는 맨 위와 맨 아래는 모두 브라운이기 때문에
w * 2
그다음 가운데는 양쪽 끝에만 브라운이기 때문에
2개에 맨 위 맨 아래를 제외한 높이를 곱해주면 됩니다.
2 * (h - 2)
최종식
var row = w * 2 + 2 * (h - 2)
col 구하는 식
col는 맨 위와 맨 아래를 제외해야 되기 때문에
(h - 2)
그리고 양쪽 끝을 제외한 가운데는 다 노란색이기 때문에
(w - 2)
최종식
var col = (h - 2) * (w - 2)
으로 코드를 작성하여 문제를 해결하였습니다.
1. 다른 사람 코드
class Solution {
fun solution(brown: Int, yellow: Int): IntArray {
return (1..yellow)
.filter { yellow % it == 0 }
.first { brown == (yellow / it * 2) + (it * 2) + 4 }
.let { intArrayOf(yellow / it + 2, it + 2) }
}
}
저의 코드와 다르게 Kotlin 스럽게 해결한 문제를 공부용으로 가져와보았습니다. 코드를 한번 분석해 보겠습니다.
코드 분석
class Solution {
fun solution(brown: Int, yellow: Int): IntArray {
return (1..yellow)
// filter을 통해서 yellow 격자를 다 사용 가능한지 체크해 줍니다.
.filter { yellow % it == 0 }
// first를 통해서 yellow / it * 2는 yellow가 들어가는 가운뎃줄의 양쪽 테두리를 구하는 코드입니다.
// it * 2는 yellow 위아래는 테두리입니다.
// 4는 사각형 꼭짓점의 수입니다.
.first { brown == (yellow / it * 2) + (it * 2) + 4 }
// let을 통해서 brown의 수는 yellow / it + 2와 yellow의 수는 it + 2을 출력해줍니다.
.let { intArrayOf(yellow / it + 2, it + 2) }
}
}
Performance
1. 내가 작성한 코드 | 2. 다른 사람 코드 |
![]() |
![]() |
'프로그래머스 Algorithm' 카테고리의 다른 글
[프로그래머스] 가장 가까운 같은 글자 Kotlin (0) | 2023.12.13 |
---|---|
[프로그래머스] 숫자 문자열과 영단어 Kotlin (0) | 2023.12.12 |
[프로그래머스] 최소직사각형 Kotlin (0) | 2023.12.10 |
[프로그래머스] 시저 암호 Kotlin (0) | 2023.12.09 |
[프로그래머스] 피보나치 수 Kotlin (2) | 2023.12.08 |