요약 | 위 그림처럼 노란 타일을 갈색 타일이 둘러싸는 구조일때, 노란 타일의 개수와 갈색 타일의 개수를 받아 전체 카펫의 크기를 구하여라.
Int
Int
- yellow의 길이가 brown보다 길 수 있다. brown은 테두리 타일이기 때문에 카펫의 크기가 커지면 안에 들어가는 yellow 타일의 개수가 더 많아질 수도 있다.
- yellow의 길이가 최대 200만이므로 혹시라도 yellow와 brown을 서로 곱한다거나.. 아니면 이중 for문으로 각 타일을 순회한다거나 하는 식의 풀이는 지양해본다.
IntArray
계산식을 저렇게 한 이유는 그림을 그려보면 간단히 이해할 수 있다. brown=24, yellow=24 라는 값이 들어온다고 가정해보자.
4-6 쌍일 때, 즉 yellow 타일의 크기가 세로 4, 가로 6일 때 yellow를 둘러싸는 brown 타일의 크기와 맞아 떨어지게된다.
이렇게되면 yellow의 크기가 확보되는 것이므로, brown의 개수는 yellow를 둘러싸고 있는 크기만큼을 계산해주면 된다.
brown 세로 개수 : yellow 세로 크기에 2를 더하고, 그 값에 2를 곱한다. 이때 2를 더하는 이유는 모서리 타일 때문이다.
brown 가로 개수 : 이미 모서리 타일은 위에서 계산이 되었기 때문에 yellow 가로 크기에 2를 곱한다.
MutableList
yellow의 약수를 저장할 때 보다 쉽게 데이터를 추가할 수 있다.
인덱스로 바로 접근하여 데이터를 쉽게 찾을 수 있다.
데이터 삭제, 정렬, 중간에 끼워넣기를 하지 않을 것이므로 사용하는 데에 적합하다는 생각이 들었다.
class Solution { fun solution(brown: Int, yellow: Int): IntArray { var answer = intArrayOf() var list = mutableListOf<Int>() for (i in 1 .. yellow) { if ( yellow % i == 0 ) { list.add(i) } } var last = list.size - 1 for (i in 0 until (list.size/2)+1) { if ((list[i] + 2) * 2 + list[last] * 2 == brown) { answer += list[last] + 2 answer += list[i] + 2 break } last-- } return answer } }
[TIL-240402]