GitHub ID : soohyun-dev
윤수현의 개발 공간
GitHub ID : soohyun-dev
전체 방문자
오늘
어제
  • 분류 전체보기 (918)
    • 성장기록 (49)
      • 성장기록 (3)
      • 우아한테크코스 (16)
      • 프로젝트 (15)
      • TIL (14)
      • 테오의 스프린트 (1)
    • 프로그래밍언어 (88)
      • C언어 (14)
      • HTML\CSS (12)
      • JavaScript (7)
      • React (23)
      • Python (11)
      • JAVA (14)
      • TypeScript (6)
    • 알고리즘 공부 (736)
      • 코드업 - 파이썬 (108)
      • 백준 - 파이썬 (468)
      • 백준 - 자바스크립트 (125)
      • 프로그래머스 - 파이썬 (1)
      • 프로그래머스 - 자바스크립트 (34)
    • 책 리뷰 (9)
      • 프로그래밍 (3)
      • 독서 (6)
    • 전자기기 (1)
    • 일상, 일기 (18)
    • 기술 세미나 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • PYTHON
  • 영어독해
  • 파이썬
  • 코딩테스트
  • 프론트엔드
  • 코딩
  • javascript
  • 코테
  • 백준풀이
  • 프로그래머스풀이
  • 백준파이썬
  • 백준
  • 프로그래밍언어
  • 프로그래머스
  • 영어
  • 코드업
  • 코드업파이썬
  • 프로그래머스자바스크립트
  • 독해
  • 자바스크립트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
GitHub ID : soohyun-dev

윤수현의 개발 공간

백준/ Gold 4 문제 , 백준 파이썬 11559 , Puyo Puyo [BFS]
알고리즘 공부/백준 - 파이썬

백준/ Gold 4 문제 , 백준 파이썬 11559 , Puyo Puyo [BFS]

2022. 8. 12. 16:27

백준/ Gold 4 문제 , 백준 파이썬 11559 , Puyo Puyo [BFS]

 

 

 

 

Check Point !   ( 해당사항 ✓체크 )

1. 막힘 없이 수월하게 풀린 문제인가?

2. 1시간이내로 풀렸던 문제인가?

3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

4. 시간을 써도 도무지 풀 수 없는 문제인가?

5. 솔루션을 찾아봤는가?

-------------------------------------------------------------------------------------------
난이도 체감
1. 최상
2. 상
3. 중
4. 하


<이해도>
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함


<덧붙일 말>
터트리고 칸 내리는 과정이 진짜 Fucking Hell 이였다. 그래도 혼자 해결 성공

 

 

문제 출처

https://www.acmicpc.net/problem/11559

 

11559번: Puyo Puyo

총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.

www.acmicpc.net

 

 

 

반례

 

RRRRRR
RRRRRR
RRRRRR
RRRRRR
RRRRRR
RRRRRR
RRRRRR
RRRRRR
RRRRGG
RRRRRR
RRRRGG
RRRRRR

 

정답 : 2

 

 

 

......
......
......
......
......
......
......
......
.Y....
RY....
RRYG..
RYYGG.

 

 

정답 : 2

 

 

......
......
......
......
......
......
......
......
......
......
......
......

정답 : 0

 

 

......
......
......
......
......
......
.G....
RR....
RY....
RYG...
RRY...
RYYGG.

정답 : 3

 

 

 

풀이

 

 

1. 기본 세팅

1. 상하좌우

 

2. 12행의 MAP 리스트 입력받기

 

 

2. BFS

 

특별한건 없는 BFS 함수이다. 그냥 인접한게 4개 이상인지 확인하고 맞다면 모두 터트려준다.

 

터트렸다면 True 리턴 아니라면 False 리턴이다.

 

 

3. BFS 호출 및 리스트 재배열 ★

 

터트리는건 쉬운데 이후 밑으로 리스트들을 재 구성하는 것이 진짜 어려웠다.

 

초반에 0행부터 잘못돌려서 다시 짜고 tmp=0 으로 만드는 부분을 j 재할당 이전에 써서 값이 틀리고 등등...

이 부분 코드짜는데 머리에 과부하가 걸렸음.

 

 

밑에서 부터 위로 쭉 확인해가면서 . 위에 문자가 있다면 밑으로 쫙 내려주고 다시 위로 올라가며 확인하는 과정을 거쳐야 한다.

 

 

중요한 점은 초반에 터트릴수 있는건 연쇄작용으로 다 터트려야 하기 때문에 이 부분도 카운트 잘해주자.

 

 

 

 

 

 

 

정답

 

 

 

from collections import deque
import sys
input=sys.stdin.readline

dr=[(1,0),(0,1),(-1,0),(0,-1)]

MAP=[list(input().rstrip()) for _ in range(12)]

def bfs(T,x,y):
    dq=deque()
    dq.append([x,y])
    store=[(x,y)]
    visited=[[0 for _ in range(12)] for _ in range(12)]
    visited[x][y]=1
    cnt=1
    while dq:
        X,Y=dq.popleft()
        for a,b in dr:
            mx,my=X+a,Y+b
            if 0<=mx<12 and 0<=my<6:
                if MAP[mx][my]==T and not visited[mx][my]:
                    store.append((mx,my))
                    cnt+=1
                    dq.append([mx,my])
                    visited[mx][my]=1
    if cnt>=4:
        for n,m in store:
            MAP[n][m]='.'
        return True
    return False

C=0
while True:
    L=[]
    check=False
    for i in range(11,-1,-1):
        for j in range(6):
            if MAP[i][j]!='.':
                result=bfs(MAP[i][j],i,j)
                if result==True:
                    check=True
    for i in range(6):
        tmp=0
        CK=False
        j=11
        while True:
            if MAP[j][i]=='.':
                tmp+=1
                CK=True
                j-=1
            else:
                if CK==True:
                    MAP[j][i],MAP[j+tmp][i]=MAP[j+tmp][i],MAP[j][i]
                    j=j+tmp
                    tmp=0
                    CK=False
                else:
                    j-=1
            if j==-1:
                break
    if check==False:
        print(C)
        break
    C+=1
반응형

'알고리즘 공부 > 백준 - 파이썬' 카테고리의 다른 글

백준/ Gold 5 문제 , 백준 파이썬 22352 , 항체 인식 [BFS]  (0) 2022.08.12
백준/ Gold 5 문제 , 백준 파이썬 18405 , 경쟁적 전염 [BFS]  (0) 2022.08.12
백준/ Gold 4 문제 , 백준 파이썬 5427 , 불 [BFS]  (0) 2022.08.12
백준/ Gold 2 문제 , 백준 파이썬 16946 , 벽 부수고 이동하기 4 [BFS]  (0) 2022.08.12
백준/ Bronze 3 문제 , 백준 파이썬 16479 , 컵라면 측정하기  (0) 2022.08.12
    '알고리즘 공부/백준 - 파이썬' 카테고리의 다른 글
    • 백준/ Gold 5 문제 , 백준 파이썬 22352 , 항체 인식 [BFS]
    • 백준/ Gold 5 문제 , 백준 파이썬 18405 , 경쟁적 전염 [BFS]
    • 백준/ Gold 4 문제 , 백준 파이썬 5427 , 불 [BFS]
    • 백준/ Gold 2 문제 , 백준 파이썬 16946 , 벽 부수고 이동하기 4 [BFS]
    GitHub ID : soohyun-dev
    GitHub ID : soohyun-dev
    환영합니다!😊 이곳은 저의 개발에 관한 내용들을 정리하는 공간입니다. 알고리즘 풀이에도 관심이 많아요. 좋은 하루 되세요~! github : soohyun_dev

    티스토리툴바