Programmers LV 2 - Berlin 4

김태준·2023년 1월 3일
0

Travel

목록 보기
5/8

개인적으로 이스트 사이드 갤러리 뒤쪽 강가가 더 분위기있고 예뻤다
강가를 따라 알렉산더까지 산책하다가 베를린 중앙 도서관 도착

사람이 이렇게 많은데 아무도 기침도 안하고 상당히 조용했다. 스터디카페 온 느낌


길가다가 닥스를 봤는데 준태가 더 나은 것 같다 ㅎ.ㅎ

문제 풀이

124 나라의 숫자

def solution(n):
    answer = ''
    while n:
        if n % 3 == 1:
            answer += str(n%3)
            n //= 3
        elif n % 3 == 2:
            answer += str(n%3)
            n //= 3
        else:
            answer += '4'
            n = n // 3 - 1
    return answer[::-1]

< 풀이 과정 >
1부터 21까지 진행을 해보니, 3진법과 유사한 규칙을 발견했다.
규칙1. 3으로 나눈 나머지가 1이면 일의 자리가 1, 2이면 2, 0이면 4이다.
규칙2. 3번 회차를 돌때 마다 일의 자리가 124로 반복되고 자리수가 추가되거나 다음 숫자로 넘어간다.

  • 숫자 n을 while문을 사용하여 0되기 전까지 진행
  • 나머지가 1이면 1을 str로 변환 후 추가하고 몫 그대로 가져가기
  • 나머지가 2이면 2를 str로 변환하고 answer에 추가하고 몫 그대로 가져가기
  • 나머지가 3인 경우 4를 추가하고 n은 3으로 나눈 몫에 -1 해주기
    최종적으로 넣어준 숫자 반대로 출력해내기 위해 [::-1] 진행

큰 수 만들기

def solution(number, k):
    answer = []
    for num in number:
        if not answer:
            answer.append(num)
            continue
        if k > 0:
            while answer[-1] < num:
                answer.pop()
                k -= 1
                if not answer or k <= 0:
                    break
        answer.append(num)
    if k > 0:
        answer = answer[:-k]
    else:
        answer
    return ''.join(answer)

< 풀이 과정 >
numbers 숫자에서 k개를 제거한 숫자들의 조합으로 가장 큰 수를 뽑아내는 문제.

  • for문으로 각 숫자마다 확인하기
  • answer가 비어있으면 answer에 numbers[0] 추가하고 반복문 나오기
  • 만일 k가 0보다 크다면 제거해야 하는 숫자가 존재함을 의미한다. 따라서 answer에 입력한 값보다 numbers의 숫자가 더 크다면 현재 answer에 입력된 숫자를 pop해주고 k는 -1해주기
  • answer가 비어있거나, k가 음수라면 반복문 중단
  • 최종적으로 결과 진행 후에도 k가 양수라면 현재 입력된 answer범위가 뒤에서 부터 k개수 제거한 것으로 결과 담고, 아니면 그냥 그대로 출력한다.

삼각 달팽이

def solution(n):
    answer = []
    triangle = [[0]*n for _ in range(n)]
    x, y = -1, 0
    num = 1
    for i in range(n):
        for j in range(i, n):
            if i % 3 == 0:
                x += 1
            elif i % 3 == 1:
                y += 1
            elif i % 3 == 2:
                x -= 1
                y -= 1
            triangle[x][y] = num
            num += 1
    for i in triangle:
        for j in i:
            if j:
                answer.append(j)
    return answer

< 풀이 과정 >
삼각형의 문제를 행렬로 접근하여 처리하는 방법
삼각형 > 사각형 전환 시 반복문을 통해
3으로 나눈 나머지가 0이면, 아래 칸으로 이동 x += 1
3으로 나눈 나머지가 1이면, 오른쪽으로 이동이므로 y += 1
3으로 나눈 나머지가 2이면, 왼쪽 대각선으로 이동해야 하므로 x,y 둘다 -1
최종적으로 구성된 triangle에서 0을 제외하기 위해 if j: 문을 거쳐 answer에 추가하여 리턴

메뉴 리뉴얼

from itertools import combinations
from collections import Counter
def solution(orders, course):
    answer = []
    for c in course:
        menu_list = []
        for order in orders:
            order = sorted(order)
            menu_list.extend(list(combinations(order, c)))
        cnt = Counter(menu_list)
        if cnt:
            if max(cnt.values()) >= 2:
                for k, v in cnt.items():
                    if v == max(cnt.values()):
                        answer.append(''.join(k))
                        
    return sorted(answer)  

< 풀이 과정 >
문제를 보고 순열 조합을 이용해 dic으로 저장하는 Counter를 써서 개수가 큰 메뉴들만 뽑는 방법을 선택했다.

  • 각 course별 메뉴 개수들을 이용하여 조합하기 위해 for문을 돌렸고, 조합 결과를 확인하기 위해 menu_list라는 빈 리스트를 생성하였다.
  • 이후 orders 리스트는 손님 당 주문 리스트 이므로, 이를 개별적으로 조합하기 위해 for문을 돌렸다.
  • menu_list에 append가 아닌 extend를 사용하여 2중 리스트 생성을 방지하였고 이후 Counter를 이용하여 각 순열 조합 별로 몇개가 뽑히는지 확인하였다.
  • 비어있지 않은 메뉴 조합들 중에서 개수가 2개 이상인 애들만 최대값과 일치하는 메뉴리스트들만 answer에 추가해주고 이를 오름차순 정렬하여 리턴
profile
To be a DataScientist

0개의 댓글