일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- OPENHACK
- API
- 코딩테스트
- Ground Truth
- Tensorflow 2.0
- entity
- Speech
- 스터디 잼
- 머신러닝
- re:Invent
- ainize
- Conference
- 구글스타트업캠퍼스
- Qwik Start
- GDG Campus
- aws
- Community Day
- seq2seq
- 오픈소스해커톤
- Open Hack
- rl
- BOAZ
- CSIP
- gcp
- kakao
- SW중심대학
- 뉴비톤
- 해커톤
- SageMaker
- Backend.AI
- Today
- Total
pizzaplanet
[Quiz] 프렌즈4블록 - KAKAO BLIND RECRUITMENT 본문
https://programmers.co.kr/learn/courses/30/lessons/17679?language=python3
블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 “프렌즈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가 사용된다.
출력 형식
입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.
입출력 예제
m | n | board | answer |
---|---|---|---|
4 | 5 | [“CCBDE”, “AAADE”, “AAABF”, “CCBBF”] | 14 |
6 | 6 | [“TTTANT”, “RRFACC”, “RRRFCC”, “TRRRAA”, “TTMMMF”, “TMMTTJ”] | 15 |
예제에 대한 설명
- 입출력 예제 1의 경우, 첫 번째에는 A 블록 6개가 지워지고, 두 번째에는 B 블록 4개와 C 블록 4개가 지워져, 모두 14개의 블록이 지워진다.
- 입출력 예제 2는 본문 설명에 있는 그림을 옮긴 것이다. 11개와 4개의 블록이 차례로 지워지며, 모두 15개의 블록이 지워진다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def solution(m, n, board): score = 0 # str to list b = [] for i in range(m): temp = [] for j in range(n): temp.append((board[i][j])) b.append(temp) while True: b,sustainable = block_check(m, n, b) score,b=score_check(m,n,b,score) if not sustainable: break item_pull_down(m,n,b) return score | cs |
5 - 10 line: 입력을 str type로 받았다. 개인적으로 list에서의 연산이 편해 list로 전환해주었다.
12 line: 게임이 끝날때까지 지속
13 line: 4개로 이루어진 블록들은 소문자로 변환 후 b에 저장. 변환된 블록이 있다면 sustainable은 1을 갖는다.
14 line: 지울 수 있는 블록의 스코어를 score에 담는다. 지울 수 있는 블록은 None로 변환 후 b에 덮어쓴다.
15 - 16 line: 만약 13 line에서 sustainable이 0이 되었다면 더 이상 게임을 진행할 수 없음으로 판단하고 현재의 score 반환
17 line: b에서 None의 자리를 위에 있던 블록들로 대체한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def block_check(m,n,board): sustainable=0 for i in range(m-1): for j in range(n-1): if board[i][j]==None or board[i+1][j]==None or board[i + 1][j+1]==None or board[i][j+1]==None: pass else: check=[] check.append(board[i][j].lower() == board[i][j + 1].lower()) check.append(board[i][j].lower() == board[i + 1][j].lower()) check.append(board[i][j].lower() == board[i + 1][j + 1].lower()) if sum(check)==3: sustainable=1 board[i][j] = board[i][j].lower() board[i][j+1] = board[i][j+1].lower() board[i+1][j] = board[i+1][j].lower() board[i+1][j+1] = board[i+1][j+1].lower() return board, sustainable | cs |
1 2 3 4 5 6 7 8 9 | def score_check(m, n, b,score): for i in range(m): for j in range(n): if b[i][j]==None: pass elif (b[i][j].islower())==True: score+=1 b[i][j]=None return score,b | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 | def item_pull_down(m,n,b): for i in range(n): for j in range(m - 1, -1, -1): temp = b[j][i] if temp == None: for k in range(j, -1, -1): if b[k][i] == None: pass else: b[j][i] = b[k][i] b[k][i] = None break return b | cs |
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | def block_check(m,n,board): sustainable=0 for i in range(m-1): for j in range(n-1): if board[i][j]==None or board[i+1][j]==None or board[i + 1][j+1]==None or board[i][j+1]==None: pass else: check=[] check.append(board[i][j].lower() == board[i][j + 1].lower()) check.append(board[i][j].lower() == board[i + 1][j].lower()) check.append(board[i][j].lower() == board[i + 1][j + 1].lower()) if sum(check)==3: sustainable=1 board[i][j] = board[i][j].lower() board[i][j+1] = board[i][j+1].lower() board[i+1][j] = board[i+1][j].lower() board[i+1][j+1] = board[i+1][j+1].lower() return board, sustainable def score_check(m, n, b,score): for i in range(m): for j in range(n): if b[i][j]==None: pass elif (b[i][j].islower())==True: score+=1 b[i][j]=None return score,b def item_pull_down(m,n,b): for i in range(n): for j in range(m - 1, -1, -1): temp = b[j][i] if temp == None: for k in range(j, -1, -1): if b[k][i] == None: pass else: b[j][i] = b[k][i] b[k][i] = None break return b def solution(m, n, board): score = 0 # str to list b = [] for i in range(m): temp = [] for j in range(n): temp.append((board[i][j])) b.append(temp) while True: b,sustainable = block_check(m, n, b) score,b=score_check(m,n,b,score) if not sustainable: break item_pull_down(m,n,b) return score | cs |
'ETC' 카테고리의 다른 글
금융권? 대기업? IT기업? 스타트업? 능력자가 아닌 일반 졸업예정자의 고민 (5) | 2019.01.09 |
---|---|
Jupyter와 PySpark 연동 및 외부에서 Jupyter 접속하기 (0) | 2018.10.03 |
데브옵스 DevOps(Development + Operations) (1) | 2018.10.01 |
[Quiz] 캐시 - KAKAO BLIND RECRUITMENT (0) | 2018.09.12 |
[Quiz] 뉴스 클러스터링 - KAKAO BLIND RECRUITMENT (0) | 2018.09.12 |