알고리즘 10일차

Panther·2021년 7월 22일
0

Algorithm

목록 보기
8/15

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/42842

  1. 노란색을 기준으로 갈색이 둘러싸고 있는 형태인데, 노란색을 기준으로 생각하기 시작했습니다.
  2. 그런데 노란색의 개수가 네 개라면, 노란색의 1 X 4를 둘러싸고 있는 갈색의 개수는 열 개가 되고, 노란색의 2 X 2를 둘러싸고 있는 갈색의 개수는 열 두 개가 됩니다. 갈색의 개수는 매개변수로 주어지기 때문에 고정값이라 이 풀이는 가능하지 않습니다. 즉 노란색의 배열 형태에 따라 갈색의 개수가 달라질 수 있기 때문입니다.
  3. 갈색을 기준으로 생각했을 때 아래와 같은 모습을 생각할 수 있습니다. 즉 내부의 노란색의 세로가 한 개에서부터 시작하는 것입니다.
// 111111111111...
// 100000000000...
// 111111111111...
  1. 노란색의 세로 개수 기준으로 확장한다고 생각하면, 두 개에서 시작할 때 아래와 같습니다.
// 111111111111...
// 100000000000...
// 100000000000...
// 111111111111...
  1. 먼저 갈색을 2로 나누면 다음의 형태라고 생각할 수 있습니다. 위의 절반과 아래의 절반입니다.
// 111111111111
// 1
//            1
// 111111111111
  1. 노란색의 세로 개수는 최소 1이 되어야 하므로, 갈색의 세로 최소 개수는 3개입니다. 바꿔서 표현하면 노란색 세로 최소 1개를 둘러쌀 수 있는 갈색의 세로 개수입니다.

  2. 갈색의 세로 개수를 한 개씩 늘리면서 가로 개수는 한 개씩 줄여간다고 하겠습니다. 전체 가로 개수에서 둘을 제외하고 전체 세로 개수에서 둘을 제외한 곱이 노란색의 개수와 같아질 때까지 세로 개수를 늘리고 가로 개수를 줄이면 됩니다.

func solution(_ brown:Int, _ yellow:Int) -> [Int] {
    
    var count = 0
    var halfBrown = brown / 2
    var vertical = (2 + count)
    var horizontal = (halfBrown-1-count)
    
    while (vertical - 1) * (horizontal - 2) != yellow {
        count += 1
        vertical = (2 + count)
        horizontal = (halfBrown - 1 - count)
    }
    
    return [horizontal, vertical+1]
    
}

0개의 댓글