코딩테스트/구현

프렌즈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분내로 빠르고 정확하게 구현하려는 연습이 필요할거같다.