Carpet

Sett·2021년 7월 21일
1

문제

https://programmers.co.kr/learn/courses/30/lessons/42842

문제 접근

  1. 가운데 있는 노랑을 어떻게 표현할까.. 갈색을 1 노랑을 0으로 해서
  2. 갈색이 8 노랑이 1인 경우 [1,1,1,1,0,1,1,1,1]
  3. 뭐 이런식으로 접근했는데 가운데 쯔음 있네... 이 정도 외에는 별다른 소득이 없었다. 근데 이것도 24, 24 적용하니까 좀 아닌 거 같고...
  4. 약수로 구해서 만약 12면 1,2,3,4,6,12 이런식으로 해서 뭘 해봐야 하나 하다가 결론을 도출할 때 약수의 가운데 부분을 뽑아서 큰 수로 정렬하면 얼추 맞더라.
  5. 그래서 가운데, 가운데 + 1 인덱스 값 (홀수일 경우 가운데 값 두번) 가져와서 풀어 봄.
  6. 테스트 케이스 3개 틀림. 다 틀릴 줄 알았는 데 놀람.
  7. 다시 살펴보니까 외곽의 브라운의 개수는 배치에 따라 달라지고 가로 세로 길이의 곱으로 알 수 있다고 생각해서
  8. 배치한 약수를 가우스의 덧셈 방식으로 두개 뽑아서 브라운 타일의 개수와 비교하였다.
  9. (2 X 가로) + (2 X 세로) - 4 = 브라운 타일이 만족하면 값을 반환하였다. (여기서 -4를 해주는 이유는 대각선 모서리 끝의 타일이 겹쳐서 한번 더 계산되기 때문)

소스 코드

func solution(_ brown:Int, _ yellow:Int) -> [Int] {
    let total = brown + yellow
    var i = 1
    var tiles: [Int] = []
    var result: [Int] = []
    while i <= total {
        if total % i == 0 {
            tiles.append(i)
        }
        i += 1
    }
    for i in 0...tiles.count {
        let index = (tiles.count - 1) - i
        if (tiles[index] * 2) + (tiles[i] * 2) - 4 == brown {
            result.append(tiles[index])
            result.append(tiles[i])
            return result
        }
    }
    return result
}
profile
안녕하세요

0개의 댓글

관련 채용 정보