Skip to content

[W1] Puyo Puyo #2

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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

[W1] Puyo Puyo #2

wants to merge 1 commit into from

Conversation

dev-hjJoo
Copy link
Owner

@dev-hjJoo dev-hjJoo commented Apr 22, 2025

To-do

  • 코드 리뷰를 위한 파이썬 코드 파일(code.py) 작성
  • 알고리즘에 대한 설명 및 히스토리 작성을 위한 문서 파일(description.py) 작성

알고리즘 흐름

  1. 배열의 인덱스 접근을 편안하게 하기 위해 배열을 시계 방향으로 90도 회전
    • 제거되는 줄이 하나의 배열로 구성
    • 블럭들이 제거된 후 내려오는 위치가 0번 방향으로 진행
  2. 방문 여부 판단 배열 visited를 체크, 방문하지 않은 색상 블럭에 대해 BFS 함수 수행
  3. BFS는 인접한 동일 색상을 탐색한 후 인접 동일 색상 블럭의 개수를 반환
  4. 반환값이 4 이상인 경우 제거하기 위해 remove_coords 에 추가
  5. remove_coord가 비어있지 않은 경우 제거 과정 후 다시 2번 과정 수행
  6. remove_coords가 비어있는 경우 총 연쇄 횟수 반환 후 종료

시간 복잡도

  1. BFS 탐색 → 2차원 배열을 돌면서 탐색을 수행하므로 O(n^2)을 수행한다.
  2. 반환값이 4 이상인 색상 블록 제거 -> O(n^2) (가장 큰 차수)
    • 항목 추가(리스트의 extends 메소드 사용) → 추가하는 개수만큼의 시간복잡도 소모
    • 배열을 돌면서 제거 배열에 포함되지 않은 경우에만 리스트에 추가하므로 O(n^2)
    • 빈 칸은 ljust 함수를 이용하여 전체 12칸을 채우되, 빈 칸은 '.'으로 채워주었으므로 O(n)
  3. 위 과정을 While 문을 통해 반복하므로 n번 반복한다고 볼 수 있다. 최종적으로 O(n^3) 의 시간 복잡도를 갖는다.

문제점 및 고민 방향

  1. 메모리 효율성 개선: visited, remove_coords, queue 등 크기가 큰 자료구조가 많이 선언되어 메모리가 많이 소모됨
  2. 블록 제거 시 시간 효율성 개선: 제거 시 전체 배열을 돌기 때문에 시간 복잡도 측면에서 비효율적임

@dev-hjJoo dev-hjJoo added the enhancement New feature or request label Apr 22, 2025
@dev-hjJoo dev-hjJoo self-assigned this Apr 22, 2025
@dev-hjJoo dev-hjJoo requested a review from LeeSongMi April 23, 2025 03:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant