그냥 하는 노트와 메모장

온코더 제12회차 3번 문제 '격자 칠하기' 풀이 본문

Solved problems

온코더 제12회차 3번 문제 '격자 칠하기' 풀이

coloredrabbit 2019. 11. 12. 20:28

* 온코더 제12회차 3번 문제 '격자 칠하기' 풀이

[ 분류 : 구현/조합/확률 ]


  예전에 못풀었던걸 최근에 확률 공부하다가 생각나서 풀어봤는데 풀려서 기분이 좋다 ㅎㅎ


  문제 요약) N x M 격자에서 총 K번의 연산을 수행한다. 연산은 격자 내부에서 두 칸을 선택하여 두 칸을 양끝으로 하는 사각형 내부에 색을 칠한다. 이 때 칸을 선택하는 확률은 모두 동일하며, 다른 칸을 선택하는 확률과 독립적이다. K번 연산을 모두 끝낸 뒤 칠해진 1 x 1 칸의 개수의 기댓값은 얼마인가?



  해설)

  [확률]

  연산 한 번에 대해서 생각해보자. N x M 격자에서 하나의 칸을 선택하는 경우의 수는 NM 임은 쉽게 알 수 있다. 또한 두 개의 칸을 선택하는 경우의 수는 (NM)^2 이다. 이는 칸 선택이 서로 독립적이기 때문에 바로 구할 수 있다.


  확률론에서 기댓값은 E[X]로 표현한다. 기댓값 자체는 변수로 표현하지 않는 불변량이다. 이 문제의 의도에 맞게 확률 변수 X를

  X = K번 연산 후에 색칠된 칸의 수

로 표현할 수 있다.


  확률 변수 Y(x, y) = K번 연산 이후에 (x, y) 칸이 칠해질 사건 으로 정의하자. 칠해지면 1, 아니면 0으로 보자(단, ).

  X의 기댓값에 대해서 아래와 같이 정리할 수 있으므로 각 칸에 대해서 생각해 볼 필요가 있다.


  확률 p(x, y)를 "1번 연산에서 (x, y)가 포함되는 사각형을 선택할 확률"이라고 하자. 확률 변수 Z(x, y)="K번 연산을 걸쳐 (x, y) 칸이 칠해지는 횟수"라고 하면 Z(x, y)는 이항 분포를 가지게 된다. 동전 앞뒤 나오는 방식과 동일하다고 보면 쉽게 생각할 수 있다.


 우리는 Y(x, y)를 보고 있고, K번 중 단 한 번만 등장해도 된다. 따라서 수식을 아래처럼 정리할 수 있다.

  마지막 식으로 배반 사건을 이용하여 간단하게 구할 수 있다.



  [조합과 구현]

  이제 p(x, y)를 구하러 갑시다. 여기가 구현부분에서 가장 까다로운 부분이 아닐 수 없어요, 조합을 깐깐하게 따져야 합니다.

  사각형을 만들 때 사용되는 두 점을 A, B라고 하면 아래와 같은 상황 모두 따져야 합니다. 같은 크기, 같은 위치의 사각형이라도 그 사각형을 만들 수 있는 경우의 수는 4가지 또는 2가지 또는 1가지로 나올 수 있습니다. 정리하자면 선택된 사각형의 높이가 1보다 크고 너비가 1보다 크면 경우의 수가 4가지 됩니다. 높이와 너비 둘 중 하나만 1보다 큰 상태라면 경우의 수는 2가지 됩니다. A와 B가 완벽하게 같으면 1가지가 나옵니다.



           


[ 그림 - 같은 크기, 같은 위치를 같은 사각형이 선택되는 경우의 수 ]


 (1)

 (2)

 (3)

 (4)

 (5)

 (6)

 (7)

 (8)

 (9)

[그림 -  칸에 대한 구역 설정]


  를 포함하는 사각형을 만들기 위한 경우의 수를 구역 별로 나눠봅시다. 구역 별로 두 점을 가져온다면,

  4가지 일 때 = (1) x ((5) + (6) + (8) + (9))

                    + (2) x ((6) + (9))

                    + (4) x ((8) + (9))

                    + (5) x (9)

  2가지 일 때 + 1가지 일 때 = 2가지 x (

                      ((2) + (5)) * ((5) + (8))

                      + ((4) + (5)) * ((5) + (6))

                      ) - 3

  로 정리할 수 있습니다.

  -3을 해주는 이유는 사각형 선택 범위에서 각각 하나를 중복해서 선택하게 되고 이를 2를 곱하기 때문에 "1가지 일 때"의 경우가 4번이나 중첩됩니다. 그래서 -3을 빼주어 계산해줍니다.


- 구현


'Solved problems' 카테고리의 다른 글

BOJ 1056 - 수  (2) 2020.01.20
BOJ 12977 - 원 위의 점  (0) 2019.11.22
BOJ 2176 합리적인 이동경로  (0) 2019.08.07
BOJ 17242 Kaka & Bebe  (0) 2019.06.24
BOJ 1866 - 택배  (2) 2019.03.27
Comments