[4코1파] 4명의 안드로이드 개발자와 1명의 파이썬 개발자의 코딩 테스트 서막 : 4코1파

Rule :

하루에 1문제씩 풀기.
한 문제당 30분씩은 고민하기.
왜 그렇게 풀었는지 공유하기.
하루라도 놓친다면 벌금은 1,000원

START :

[3코1파] 2023.01.04~ (85일차)
[4코1파] 2023.01.13~ (76일차)

Today :

2023.03.29 [85일차]

프로그래머스 LV 2
[1차] 프렌즈4블록
https://school.programmers.co.kr/learn/courses/30/lessons/17679

문제 설명

블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.

만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다.

블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다.

만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다.

위 초기 배치를 문자로 표시하면 아래와 같다.

TTTANT
RRFACC
RRRFCC
TRRRAA
TTMMMF
TMMTTJ

각 문자는 라이언(R), 무지(M), 어피치(A), 프로도(F), 네오(N), 튜브(T), 제이지(J), 콘(C)을 의미한다
입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.

입력 형식

입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다.
2 ≦ n, m ≦ 30
board는 길이 n인 문자열 m개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.

출력 형식

입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.

입출력 예제

예제에 대한 설명

입출력 예제 1의 경우, 첫 번째에는 A 블록 6개가 지워지고, 두 번째에는 B 블록 4개와 C 블록 4개가 지워져, 모두 14개의 블록이 지워진다.
입출력 예제 2는 본문 설명에 있는 그림을 옮긴 것이다. 11개와 4개의 블록이 차례로 지워지며, 모두 15개의 블록이 지워진다.

문제 풀이 방법

첫번째는 움직이는 좌표를 왼,오,위,아래,위대각,아래대각 즉 8개의 좌표로 두고
board를 돌면서 체킹하고, 옮겨서 위로 땡기는 작업을 하고 있었는데..
도저히... 구현 불가 데스...

이게 어떻게 해야하는지는 감이 오는데 구현으로 탈락
일단은 체킹을 하고나서, 바로 터트리지 않고 좌표를 저장하는 set까지는 왔지만 그 이후에 set에 있는 수를 세고 땡기는 작업을 아래에서 부터 하려다가 실패했던 것이다...
땡기는 것은 맨 아래줄에서 한칸 띄어진 곳에서부터 시작하면 될일 이었음..
하.. 존나게 어렵네

보다가 queue를 쓴게 좋아보여서 뽀려옴..
다른 사람 코드 좀 여러개 보면서... 두뇌 풀가동 해야겠음

내 코드

from collections import deque

def solution(m, n, board):
    answer= 0
    board = [list(_) for _ in board]
    tmp_set = set()

    while True:
        for i in range(m-1):
            for j in range(n-1):
                b = board[i][j]
                if b ==[]:
                    continue
                if board[i][j+1] == b and board[i+1][j] ==b and board[i+1][j+1] == b:
                    tmp_set.add((i,j))
                    tmp_set.add((i,j+1))
                    tmp_set.add((i+1,j))
                    tmp_set.add((i+1,j+1))
        if tmp_set:
            answer += len(tmp_set)
            for t_i,t_j in tmp_set:
                board[t_i][t_j] = []
            tmp_set = set()
        else:
            return answer

        while True:
            moved = 0
            for i in range(m-1):
                for j in range(n):
                    if board[i][j] and board[i+1][j] == []:
                        board[i+1][j] = board[i][j]
                        board[i][j] = []
                        moved = 1
            if moved==0:
                break
              

증빙

다른 사람 풀이

쥰나게 참고할게 많네...
하루 정도 써서 좀 참고해야할듯..

여담

어렵잖아... 짱나잖아...

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글