코딩테스트/구현
프렌즈4블록
수타.
2023. 6. 28. 18:00
https://school.programmers.co.kr/learn/courses/30/lessons/17679?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제요약:
사각형으로 4개가 같은 문자일때 사라지고 전부 사라지고 나면 비어있는곳은 위에있는것들로 채워진다.(퍼즐게임)
총 없어진 퍼즐은?
소요시간:
20분
코딩:
def find_del(n,m,board):
ans = []
dy = [0,1,0,1]
dx = [0,0,1,1]
num = 0
#모든 board를 돌면서 왼쪽위 꼭지점 기준으로 4개가 같은 지점들 수집
for y in range(n-1):
for x in range(m-1):
piv = board[y][x]
for i in range(1,4):
if piv != board[y+dy[i]][x+dx[i]]:
break
else:#4개가 다 같다
for i in range(4):
ans.append([y+dy[i],x+dx[i]])
#4개가 다 같다면 지우면서 중복되지 않은것 즉 실제로 지워진것만 개수 세기
for y,x in ans:
if board[y][x] != 0:
board[y][x] = 0
num +=1
return board , num
def move_down(n,m,board):
#x를 먼저돌고 y를 아래부터 돌면서
for x in range(m):
for y in range(n-2,-1,-1):
#빈곳이 있을때까지 즉 내릴수 있을때까지 내린다.
for z in range(n):
if y+z+1<n and board[y+z][x] != 0 and board[y+z+1][x]== 0:
board[y+z+1][x] = board[y+z][x]
board[y+z][x] = 0
else:
break
return board
def solution(n,m, board):
board = [list(i) for i in board]
ans = 0
while True:
board,num= find_del(n,m,board)
ans +=num
if num ==0 :
return ans
board = move_down(n,m,board)
그냥 단순하게 구현 문제입니다. 4개 연속인것을 찾고, 개수 세고 지운다음 while문을 통해 빈곳이 있을 때 까지 내립니다.
물론 옛날에 한번풀고 한번 더 풀어본 문제 이지만 그래도 20분내에 깔끔하게 구현했다고 생각한다 다음과 같이 알고리즘이 크게 필요없는 이런문제는 30분내로 빠르고 정확하게 구현하려는 연습이 필요할거같다.