Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- boj
- 딥러닝
- 오블완
- 파이썬
- 자바스크립트
- 힙큐
- cs공부
- re_lunchu
- Algorithm
- 백준
- 티스토리챌린지
- Python
- Java
- 현대
- 자바
- cim
- 스마트팩토리
- JavaScript
- heapq
- 프로그래머스
- 탐욕법
- Baekjoon
- GAN
- 알고리즘
- softeer
- 토이프로젝트
- programmers
- 소프티어
- 현대자동차
- alogorithm
Archives
- Today
- Total
eaz_coding
[Programmers] 프렌즈4블록 본문
문제
요약
블록이 2x2 형태로 4개가 붙어 있을 경우 사라지면서 점수를 얻는다.
블록이 사라진 자리는 위의 블록이 아래로 내려와 채우게 된다.
사라지는 블록 개수를 구하는 문제
출처
https://school.programmers.co.kr/learn/courses/30/lessons/17679
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
지우는 방향을 오른쪽으로 돌리는게 풀이의 첫 단추인 것 같다.
보통 배열의 크기를 줄 때, 행을 n, 열을 m으로 주는 데
반대로 m,n으로 주길래 어색했는데 오른쪽으로 돌리라고 반대로 줬나보다.
2x2블록이 완성된 데에서 바로 지워버릴까 했는데
그러면 2x3이나 약간 겹쳐있는 부분을 못찾기 때문에 다 찾은 뒤에 지우는 방식으로 했다.
그리고 앞에서부터 블록을 지워 그 뒤의 블록이 앞으로 오게 되면 지우지 말아야 할 블록을 지우기 때문에
열을 내림차순하여 맨 뒤 블록부터 지워줬다.
def solution(m, n, board):
answer = 0
# 배열로 만들기
arr = [list(board[i]) for i in range(m)]
# 오른쪽으로 돌리기
arr = list(map(list, zip(*arr[::-1])))
# 지워지는 블록이 있는지 확인하는 용도
check = True
# 2x2에서 오른쪽 상단에서 비교
directions = [(0,-1), (1,-1), (1,0)]
while check:
check = False
tmp = set()
for i in range(n-1):
for j in range(m-1, 0, -1):
# 이미 지워진 곳은 확인 X
if arr[i][j] != '':
for di, dj in directions:
if arr[i+di][j+dj] != arr[i][j]:
break
else:
# 지워지는 블록 있음.
check = True
tmp.add((i, j))
for di, dj in directions:
tmp.add((i+di, j+dj))
# 블록의 위, 오른쪽부터 지워가기
for i, j in sorted(list(tmp), key = lambda x:(x[0], -x[1])):
arr[i] = arr[i][:j] + arr[i][j+1:] + [""]
answer += 1
return answer
'eaz_algorithm' 카테고리의 다른 글
[Programmers] 큰 수 만들기 (0) | 2024.05.23 |
---|---|
[Programmers] 숫자 변환하기 (0) | 2024.05.17 |
[Programmers] 예상 대진표 (0) | 2024.04.17 |
[Programmers] 단어 변환 (0) | 2024.03.29 |
[Programmers] 전화번호 목록 (0) | 2024.03.28 |