[프로그래머스] 09/24 (2)

2021. 9. 24. 00:08·코딩테스트/프로그래머스[Python]

[크레인 인형뽑기 게임]-[2019 카카오 개발자 겨울 인턴십]

My answer

def solution(board, moves):
    answer,cnt = 0, 0
    tmp=[[0 for i in board] for j in board]
    array2=[0]*(len(board)**2)
    
    for i in range(len(board)):
        for j in range(len(board)):
            tmp[i][j]=board[j][i] 
    
    for i in moves:
        for j in range(len(tmp[0])):
            if(tmp[i-1][j]!=0):
                array2[cnt]=tmp[i-1][j]
                tmp[i-1][j]=0
                # 두개씩 만들어지면 터뜨리는 과정
                if(cnt!=0 and array2[cnt-1]==array2[cnt]):
                    array2.pop()
                    array2.pop()
                    answer+=2
                    cnt-=2      
                cnt+=1       
                break
    return answer
-----------------------------------------------------------------------
def solution(board, moves):
    answer = 0
    tmp=[[0 for i in board] for j in board]
    array2=[]
    
    for i in range(len(board)):
        for j in range(len(board)):
            tmp[i][j]=board[j][i] 
    
    for i in moves:
        for j in range(len(tmp[0])):
            if(tmp[i-1][j]!=0):
                array2.append(tmp[i-1][j])
                tmp[i-1][j]=0
                # 두개씩 만들어지면 터뜨리는 과정
                if(len(array2)!=1 and array2[-1]==array2[-2]):
                    array2.pop()
                    array2.pop()
                    answer+=2       
                break
    return answer
더보기

위의 코드 수정버전이 아래 코드인데 우선 아래코드에서도 굳이 전치행렬을 안만들어서 풀어도 되는데, 그냥 직관적으로 보기 편하려고 전치시킨다음 했다. 수정사항은 우선 불필요한 인덱스를 나타내는 cnt변수를 없애고 array2의 마지막인형관 그전 인형을 비교하는걸 인덱스 -1,-2를 사용하여 간편화시켰다. 또한 맨처음에 문제를 못풀었던 이유는 pop대신 remove를 사용했어서이다. remove는 똑같은 값이 있는경우 그냥 앞에 있는 것을 삭제하기 때문에 특정 인덱스의 값을 삭제하려면 pop을 써야한다.

[키패드 누르기]-[2020 카카오 인턴십]

My answer

def distance(x,y):
    result=abs(x[0]-y)+abs(x[1]-1)
    return result

def solution(numbers, hand):
    answer = ''
    keypad=[[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
    tmp=0
    lpos,rpos=[3,0],[3,2]
    
    for i in numbers:
        for j in range(len(keypad)):
            if(i in keypad[j]):
                tmp=keypad[j].index(i)
                break
        if(tmp==0):
            answer+='L'
            lpos=[j,0]
        elif(tmp==2):
            answer+='R'
            rpos=[j,2]
        else:  
            dr=distance(rpos,j)
            dl=distance(lpos,j)
            if(dr==dl):
                if(hand=='left'):
                    answer+='L'
                    lpos=[j,1]
                else:
                    answer+='R'
                    rpos=[j,1]
            elif(dr>dl):
                answer+='L'
                lpos=[j,1]
            else:
                answer+='R'
                rpos=[j,1]
    return answer

Another answer

def solution(numbers, hand):
    answer = ''
    key_dict = {1:(0,0),2:(0,1),3:(0,2),
                4:(1,0),5:(1,1),6:(1,2),
                7:(2,0),8:(2,1),9:(2,2),
                '*':(3,0),0:(3,1),'#':(3,2)}

    left = [1,4,7]
    right = [3,6,9]
    lhand = '*'
    rhand = '#'
    for i in numbers:
        if i in left:
            answer += 'L'
            lhand = i
        elif i in right:
            answer += 'R'
            rhand = i
        else:
            #curpos는 지금 가야할 위치
            curPos = key_dict[i]
            lPos = key_dict[lhand]
            rPos = key_dict[rhand]
            #거리 구하기
            ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
            rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])

            if ldist < rdist:
                answer += 'L'
                lhand = i
            elif ldist > rdist:
                answer += 'R'
                rhand = i
            else:
                if hand == 'left':
                    answer += 'L'
                    lhand = i
                else:
                    answer += 'R'
                    rhand = i

    return answer
더보기

우선 맨처음 문제를 못풀었던 이유는 문제조건에서 거리는 단순히 번호 한칸이동마다 1이라고 지칭하였는데, 번호판의 거리를 잴 때 두 점 사이의 거리 공식을 이용해서 구한게 틀렸었다. 또한 손가락이 계속 움직이기 때문에 각 손가락의 위치들도 저장해놔야한다는 생각을 나중에서야했었다. 아래 코드는 방식은 나와 비슷하지만 아예 자판들의 좌표를 미리 딕셔너리에 저장후에 풀었다는 차이점이 있다.

728x90

'코딩테스트 > 프로그래머스[Python]' 카테고리의 다른 글

[프로그래머스] 09/27 (6)  (0) 2021.09.27
[프로그래머스] 09/26 (1)  (0) 2021.09.26
[프로그래머스] 09/17 (6)  (0) 2021.09.22
[프로그래머스] 09/16 (3)  (0) 2021.09.16
[프로그래머스] 09/15 (6)  (0) 2021.09.15
'코딩테스트/프로그래머스[Python]' 카테고리의 다른 글
  • [프로그래머스] 09/27 (6)
  • [프로그래머스] 09/26 (1)
  • [프로그래머스] 09/17 (6)
  • [프로그래머스] 09/16 (3)
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    이것이취업을위한코딩테스트다
    그리디
    DFS
    dp
    이코테
    나동빈
    백준
    BFS
    이분탐색
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바