데이터사이언스 기록기📚

[프로그래머스] Level 1_크레인 인형뽑기 게임 본문

Coding Test/프로그래머스(Python)

[프로그래머스] Level 1_크레인 인형뽑기 게임

syunze 2022. 7. 8. 18:35

문제 유형

2019 카카오 개발자 겨울 인턴십

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/64061

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

나의 문제 풀이

- moves를 인덱스로 수정하여 문풀 시작

 - 인형 뽑고 0으로 만들기, 배열에 인형 담기

 - 인형 담은 배열에서 앞 숫자와 비교 -> 같으면 삭제

    (고려해야할 점 : 연속된 숫자 삭제되고 난 후에도 삭제된 이후에 연속된 숫자 있는지 확인!)

연속된 숫자 1 삭제
또 다른 연속된 숫자인 3 삭제

def solution(board, moves):
    answer = 0
    moves_index = [i - 1 for i in moves]    # moves 인덱스로 수정
    ans = []    # 인형 담아두는 배열
    
    for m in moves_index:
        for i in range(len(board)):
        	# 인형 뽑고 0만들기, 배열에 인형 담기
            if board[i][m] != 0:
                ans.append(board[i][m])
                board[i][m] = 0
                break
        # 인형 담은 배열에서 앞 숫자랑 비교 - 같으면 삭제
        if len(ans) > 1:
            if ans[-1] == ans[-2]:
                answer += 2
                del ans[-2:]
                   
    return answer

 

다른 사람들의 문제풀이

1) filter, zip, extend 이용

  - filter(적용시킬 함수, 적용할 요소들) : 필요한 부분만 필터링해서 사용

    https://wikidocs.net/22803

 

2) map, filter

앞서 배운 제너레이터(`generator`)는 이터레이터(`iterator`) 입니다. 다만 제너레이터 표현식 또는 `yield`키워드를 통해 생성한 이터레이터는 구분을 ...

wikidocs.net

 - zip : 여러개의 리스트 set으로 묶기

https://codingpractices.tistory.com/50

 

[Python] 파이썬 zip() 매서드 사용법

 Python .zip() 매서드 매서드 풀이  zip() - 동일 개수로 이루어진 자료형을 묶어 주는 함수 zip -> zipper 지퍼처럼 각각 리스트에 있는 요소를 담아 지퍼로 잠가 보관하는 느낌 같다! 반환값 : 두 개 이

codingpractices.tistory.com

- extend : [ ] 한 껍질 벗겨서 값에 넣기

https://m.blog.naver.com/wideeyed/221541104629

 

[Python] list append()와 extend() 차이점

Python 리스트에 새로운 원소를 추가하는 방법에는 append(x)와 extend(iterable)가 있고 두 함수의 차이...

blog.naver.com

 - := 연산자 : 변수 할당을 줄여준다(Python 3.8부터 사용 가능)

https://int-i.github.io/python/2020-05-29/python-walrus-operator/

 

Python 3.8 기여운 바다코끼리를 드리겟슴미다 := - 인하대학교 인트아이

파이썬 문법을 읽다, ‘바다코끼리 연산자’라고 불리는 기능을 발견했다. 찾아보니 2019년 10월에 정식 릴리즈된 파이썬 3.8에서 들어왔다고 하는데, 찾아보느라 이것저것 ...

int-i.github.io

zip(*board) 표현

 

cols 표현

def solution(board, moves):
    cols = list(map(lambda x: list(filter(lambda y: y > 0, x)), zip(*board)))
    a, s = 0, [0]

    for m in moves:
        if len(cols[m - 1]) > 0:
        	# 꺼낼 인형 값, 이미 꺼낸 인형 같은지 비교
            if (d := cols[m - 1].pop(0)) == (l := s.pop()):
                a += 2
            else:
                s.extend([l, d])

    return a

 

2) box 비어있을 때 False, if문은 True여야 실행

    - if box에 값이 있을 때, 뽑은 인형과 전 인형 비교

def solution(board, moves):
    box = []
    answer = 0
    for x in moves:
        for y in range(len(board)):
            if board[y][x-1]:
                if box and board[y][x-1] == box[-1]:
                    answer += 2
                    box.pop()
                    board[y][x - 1] = 0
                    break
                else:
                    box.append(board[y][x-1])
                    board[y][x - 1] = 0
                    break

    return answer

 

3) numpy 사용

 - numpy 이용해서 Transpose (인덱스 하나로 쉽게 접근하기 위해)

 - 해당 행 인덱스, 값 출력하여 비교!

def solution(board, moves):
    board = np.array(board).transpose()		# 인덱스 접근 편하게하기 위해 transpose()
    answer = [-1]
    count = 0
    for move in moves:
        for i, num in enumerate(board[move-1]):		# 해당 행 인덱스, 값 출력
            if num == 0:
                continue
            else:
                board[move-1][i] = 0
                if num == answer[-1]:
                    answer.pop()
                    count += 2
                    break
                answer.append(num)
                break

    return count



import numpy as np

 

리뷰

 - numpy transpose 사용하여 인덱스 쉽게 접근

 - 무엇이든 비어있으면 False, 안에 값이 있으면 True

 

728x90
Comments