본문 바로가기
알고리즘

2018 카카오 신입 공채 1차 블라인드 코딩테스트 문제 06

by Gom Guard 2018. 1. 17.


2018 카카오 블라인드 코딩 1차 

  • http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/

  • 카카오 에서는 블라인드 전형으로 공채 채용을 하고 있는데요, 이번 포스팅에선 2018년 1차 문제에 대해 살펴보겠습니다. 1차 문제는 총 7문제로 구성되어 있는데요, 5시간동안 4문제 이상 풀어내면 합격이라고 합니다. 언어는 어떤 언어든 상관 없으며 C, C++, JAVA, PYTHON 등 다양한 언어가 사용되었다고 합니다.


6. 프렌즈 4블록 - 문제 

  • 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 “프렌즈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가 사용된다.



출력 형식 

  • 입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.



입출력 예제 




예제에 대한 설명 

  • 입출력 예제 1의 경우, 첫 번째에는 A 블록 6개가 지워지고, 두 번째에는 B 블록 4개와 C 블록 4개가 지워져, 모두 14개의 블록이 지워진다.

  • 입출력 예제 2는 본문 설명에 있는 그림을 옮긴 것이다. 11개와 4개의 블록이 차례로 지워지며, 모두 15개의 블록이 지워진다.



곰가드의 코드 


import re
def value_input(lst=[]):
    m = int(input('m = '))
    n = int(input('n = '))
    for i in range(m):
        while True:
            value = input('{} 째 라인. {} 개 대문자 :'.format(i+1,n))
            value = re.sub('[^A-Z]', '', value)
            if len(value) == n:
                lst.append(value)
                break
            print('wrong value')
    return lst

def convert_table(lst):
    res_table = [[] for i in range(len(lst[0]))]
    for i in range(len(lst[0])):
        for j in range(len(lst)):
            res_table[i].append(lst[len(lst)-1-j][i])
    return res_table

def checker(lst):
    res = []
    for i in range(len(lst)-1):
        for j in range(len(lst[i])-1):
            try:
                if lst[i][j] == lst[i+1][j] == lst[i][j+1] == lst[i+1][j+1]:
                    res += [(i,j), (i+1,j), (i, j+1), (i+1,j+1)]
            except:
                pass
    res = sorted(list(set(res)), reverse = True)
    [lst[i[0]].pop(i[1]) for i in res]
    return lst, len(res)
        
#lst = ['TTTANT', 'RRFACC', 'RRRFCC', 'TRRRAA', 'TTMMMF', 'TMMTTJ']
#lst = ['CCBDE', 'AAADE', 'AAABF', 'CCBBF']
lst = value_input()
convert_lst = [convert_table(lst), '']

result = 0
while True:
    if convert_lst[1] == 0:
        break
    convert_lst = checker(convert_lst[0])
    result += convert_lst[1]
print(result)
   

  • value_input 메소드는 m, n, list 값을 입력 받는 메소드 입니다.

  • convert_table 메소드는 리스트에서 값을 삭제할 경우 쉽게 하기 위해 입력받은 list 값을 전치행렬 모양으로 변경해주는 메소드 입니다.

  • checker 메소드는 현재 상태에서 4개씩 모여있는 부분이 있는지 검사하고 모여있는 좌표를 반환해주는 메소드 입니다.

  • 실행 부의 while 루프는 checker 메소드를 제거할 블록이 없을 때까지 실행 시킨 뒤 지워지는 블록의 총 개수를 알려줍니다.








부족한 블로그에 방문해 주셔서 감사합니다.

잘못된 부분이나 질문이 있으시면 

댓글로 말씀해주세요.


금방 확인하고 피드백 드리겠습니다.


좋은 하루 되세요. ^^



댓글2

  • superkong1 2018.01.17 09:42 신고

    오... 좋은 정보 감사합니다!
    답글

  • 나그네 2019.05.21 17:40

    [lst[i[0]].pop(i[1]) for i in res] 이 부분에서,,, 질문 드려용~ ㅎㅎ;;
    res에서 (2,2)이라면 i가 0번째이고, 그럼 lst[(2,2)[0]].pop((2,2)[1]) 인데 pop((2,2)[1] 은 A를 삭제하는 것인데, [1]은 어떤 의미인가요?
    lst..[0].pop....[1] 대괄호의 [0]과 [1]의 인덱스는 왜 그렇게 줬는지 알 수 있을까요? ㅠㅠ 궁금합니다 ㅎㅎ

    답글