프로그래머스 코딩테스트 연습

ddalkigum·2020년 12월 10일
2

알고리즘

목록 보기
1/15
post-thumbnail

크레인 인형뽑기

문제

아마 문제만 봐도 아... 이거 하실만한 문제일거 같은데

규칙은 인형뽑기 기계에서 인형을 뽑아서 옆에 바구니에 채우게 되는데,
여기서 새로 넣은 인형이 전에 넣었던 인형과 같다면
2개를 쌍으로 없애고 다시 쌓이게 되는 형식입니다.

풀이

board = [
	[0,0,0,0,0],
	[0,0,1,0,3],
	[0,2,5,0,1],
	[4,2,4,4,2],
	[3,5,1,3,1]
]

moves =[1,5,3,5,1,2,1,4]	


def solution(board, moves):
    bascket = []
    answer = 0
    for i in moves:
        for j in range(len(board)):
            if board[j][i-1]>0:     # 인형이 존재하는지 확인
                bascket.append(board[j][i-1])
                board[j][i-1]=0     # 뽑은후에 인형값을 0으로 줌    
                print(bascket)
                break               # 그 뒤에는 안봐도 되니까 break로 for문을 탈출해줌
        if len(bascket)>1:
            if bascket[-1] == bascket[-2]:
                del bascket[-2]
                del bascket[-1]
                answer +=2
    return answer

answer = solution(board, moves)

문제 풀때 아예 테스트케이스를 가지고 와서 풀었구요

moves가 몇번째 칸에서 뽑기를 진행할지를 결정하게 되는데
예시처럼 첫번째 칸에서 뽑게 되면,

첫번째 리스트 - [ 0,0,0,0,0 ] 첫번째 칸이 0이므로 탈락
두번째 리스트 - [ 0,0,1,0,3 ] 첫번째 칸이 0이므로 탈락
.
.

네번째 리스트 칸에서 1이 나옵니다.

1이 나온 숫자를 바스켓에 담아주고, 1이 있던자리는 인형이 없기 때문에 0으로

이런 식으로 반복을 하다보면 숫자가 겹치는 경우가 생기는데
숫자가 겹치는 경우는 인형을 넣었을 때 말고는 없으니

리스트의 마지막, 마지막에서 두번째 숫자 없애기

없애면

answer 추가

반복


두개 뽑아서 더하기

문제

정수 배열 numbers가 주어집니다.
numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를
배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

풀이

def solution(numbers):
    arr =[]
    for i in range(len(numbers)):
        for j in range(len(numbers)):
            if i > j :
                if numbers[i]+numbers[j] in arr:
                    pass
                else:
                    arr.append(numbers[i]+numbers[j])
    answer = sorted(arr)
    return answer

더할 수 있는 경우의 수는 모두 더해준뒤 정렬 해줬습니다.

그전에 만약 더했던 숫자가 있으면 넘겨줫고, 이 방법 말고는 딱히 생각이 안나서
다른 풀이를 봤는데, 한줄로 푸신분도 있었고,

코드들이 대체로 깔끔하다는 느낌을 많이 받아서 ...
난 아직 멀엇구나 생각했습니다 😂


기능개발

문제

  1. 개발 진행률
  2. 하루 개발진행률
  3. 리턴값은 총 몇번의 배포를하고, 동시에 배포하는 것은 몇개인지?

풀이

import math

def solution(progress, speeds):
    days = []
    answer =[]
    for i in range(len(progress)):
        days.append(math.ceil((100-progress[i])/ speeds[i]))
        
    for day in range(len(days)):
        count =1
        if days[day]== 0:
            pass
        else:
            for day_2 in range(1, len(days)):
                if day < day_2:
                    if days[day] >= days[day_2]:
                        count += 1
                        days[day_2] =0     
                    else:
                        break           
            answer.append(count)
    
    return answer

우선 제가 생각했던 대로 쭉 나열해보면

  1. 배포까지 각각 몇일 걸리는지
  2. 동시에 배포 할 수 있는게 몇개가 있는지
  3. 동시에 배포가 되면, 같이 배포된 프로그램의 자리는 어떻게 할지

우선 배포까지 걸리는 날

100 = progress + (speed * day)

이렇게 생각해서, 날짜를 구해주고

혹시나 import가 안되면 어떡하지 하면서 math를 가지고 와서 풀었습니다.
다행이 되더라고요

count = 1
if days[day]== 0:
            pass

출시 프로그램은 무조건 1개 이상이므로 기본값을 1로 설정

동시에 출시될경우 그 빈공간 때문에 0으로 설정


if days[day] >= days[day_2]:
	count += 1
	days[day_2] =0           

100프로 까지의 날짜가 같거나 크면 동시에 출시되기 때문에 이렇게 비교

카운트수와 출시가 되버린 빈자리는 0으로 처리


4번째 문제가 스킬트리 문제인데
헤매는 중....
문자가 한자리일 경우 어떻게 처리를 해야될지 생각이 안남...

profile
딸기검 -본캐🐒 , 김준형 - 현실 본캐 🐒

0개의 댓글