Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[03주차 김동주] 정사각형 크로스워드 (플래티넘 III) #20

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

hepheir
Copy link
Member

@hepheir hepheir commented Nov 5, 2023

🔎 문제 소개

  • 링크: https://boj.kr/2807
  • 제목: 정사각형 크로스워드
  • 분류:
    • 브루트포스
    • 방향그래프
    • 통계(순열,조합)

🖊️ 풀이

  • 시간 복잡도: $T(N) = O(N)+26^4$
  • 입력의 크기:
    • (예시) $N \leq 100,000$

모든 단어의 길이는 같고, 각 단어의 시작과 끝끼리 연결하며, 단어는 반드시 좌상단부터 읽습니다.

이 규칙을 이용해서, 각 단어의 시작과 끝의 알파벳을 정점으로 갖지며 단어가 각 정점간의 연결관계를 나타낸다고 보고 이를 방향그래프로 치환해서 풀었습니다.

가령 다음과 같은 예시가 있다면,

H L A D
S     E
I     D
N I V A

다음과 같이 치환 할 수 있습니다.

graph LR

H --> D
H --> N
D --> A
N --> A
Loading

각 단어들에서 중간에 위치한 글자들을 모두 지우고 보면 중복되는 간선들이 발생할 수도 있습니다. 가령 HLADHCBD가 있다면 둘은 모두 HD 로 치환이 되는 것이죠.

간선의 가중치를 해당 간선으로 치환된 단어의 개수로 두고 보아 이러한 점을 해결합니다.

따라서 다음과 같은 Weighted Directed Graph 가 나오게 되죠.

graph LR

H -- "2" --> D
H -- "2" --> N
D -- "1" --> A
N -- "4" --> A
Loading

이 때, 가능한 경우의 수는 각 간선들의 가중치의 곱과 같습니다.
$(2 \times 1) \times (2 \times 4)$

이와 같이 나올 수 있는 모든 방향가중치그래프의 경우의 수를 구하고(브루트포스), 약간의 중복 처리(${}_nC_r$)를 해주면 문제의 답을 구할 수 있습니다.


그래프를 어떻게 구성할 것인가...

정점 $V$에 대해여 $|V| = 26$입니다. (알파벳의 개수)

정점의 수가 충분히 적으므로, 이 정도면 인접행렬로 가중치를 표기해도 공간 제약을 충분히 여유롭게 지킬 수 있겠습니다.

adjMat: dict[str, dict[str, int]]

위와 같은 자료형으로 유사-인접행렬을 구현하겠습니다.

Python3의 경우 collections 모듈을 이용하면 좀 더 야매로 편하게 구현할 수 있습니다.

adjMat = collections.defaultdict(lambda: collections.defaultdict(lambda: 0))

그럼 시간복잡도를 구해봅시다.

시작 노드와 끝 노드가 있고, 중간에 하나의 노드를 경유하는 경로 쌍 2개를 구하면 됩니다.
따라서, (a) 문제에서 주어지는 입력을 받아 그래프를 만드는 시간 (b)시작 노드를 구하는 경우의 수, (c)마지막 노드를 구하는 경우의 수, (d) 두 개의 경유지를 고르는 경우의 수, (e) 선택한 경로에 대한 경우의 수를 구하는 시간...가 있을 때, $T(N) = (a) + (b) \times (c) \times (d) \times (e)$가 됩니다.

(a)는 $O(N)$ 입니다.

(b), (c)는 알파벳 글자의 개수와 같으므로 각각 $26$이죠.
(d)는 n개의 글자 중 r개를 선택하는 것이므로, ${}_nP_r$이라고 볼 때, $n = 26$, $p = 2$입니다. 따라서 $26 \times 25$이 되겠습니다.

(e) 는 4개의 간선과 이들의 가중치에 대한 단순한 산술연산으로 상수 시간 $O(1)$에 해결이 됩니다.

종합하면 약 $T(N) = O(N) + 26^4$ 정도가 되겠습니다.

Bruteforce, 방향그래프로 치환해서 풀이
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant