미경이 스터디 6.9

코변·2022년 6월 9일
0
post-thumbnail

Photo by Pietro Mattia on Unsplash

로또의 최고 순위와 최저 순위

def solution(lottos, win_nums):
    lotto_exc_zero = list(filter(lambda x: x != 0, lottos))
    zero_cnt = len(lottos) - len(lotto_exc_zero)
    answers = {
        6 : 1,
        5 : 2,
        4 : 3,
        3 : 4,
        2 : 5,
        1 : 6,
        0 : 6
    }
    answer = 0
    for lotto_num in lottos:
        if lotto_num in win_nums:
            answer+=1
    return [answers[answer+ zero_cnt],answers[answer]]

로또번호에서 0의 개수를 구하고 나머지 숫자들이 일치하는 값이 있는지 검사하고 그 값을 통해 순위를 맞추면 되는 문제

처음 문제에 접근했을 때 if else문을 쓰지 않기 위해 dictionary를 쓰려고 했다. 그러나 오히려 코드가 너무 길어지고 가독성이 떨어졌다. 그래서 아래와 같이 리스트 인덱스(규칙성이 보이기에)로 고치고 0의 갯수를 구하는 것도 count 내장함수로 바꾸는게 더 효율적이고 보기 좋을 것 같아서 변경했다.

def solution(lottos, win_nums):
    zero_cnt = lottos.count(0)
    answers = [6,6,5,4,3,2,1]
    answer = 0
    for lotto_num in lottos:
        if lotto_num in win_nums:
            answer+=1
    return [answers[answer+ zero_cnt],answers[answer]]

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

def solution(numbers, hand):
    l_cond = [1, 4, 7, -1]
    mid_cond = [2, 5, 8, 0]
    r_cond = [3, 6, 9, -1]
    l_now, r_now = [3,0] , [3,2]
    answer = []
    for number in numbers:
        if number in l_cond: 
            answer.append('L')
            l_now = [l_cond.index(number), 0]
        elif number in r_cond: 
            answer.append('R')
            r_now = [r_cond.index(number),2]
        else:
            num_now = [mid_cond.index(number) , 1]
            l_diff_abs = abs(num_now[0] - l_now[0]) + abs(num_now[1] - l_now[1])
            r_diff_abs = abs(num_now[0] - r_now[0]) + abs(num_now[1] - r_now[1])
            if l_diff_abs == r_diff_abs:
                if hand[0] == 'l':
                    l_now = num_now
                else:
                    r_now = num_now
                answer.append(hand[0].upper())
            else:
                if l_diff_abs > r_diff_abs:
                    r_now = num_now
                    answer.append('R')
                else:
                    l_now = num_now
                    answer.append('L')
    return ''.join(answer)

핸드폰 숫자 키패드를 누르는 조건에 맞춰 왼쪽을 누르는 조건이 맞다면 'L'을 오른쪽이라면 'R'을 문자열에 순서대로 넣어 반환하는 문제다.

여러 오류들을 겪었지만 몇 가지만 여기에 적어보고 어떻게 문제를 해결했는지 적어보려고 한다.

가볍게 훑어본 바로 숫자 차이 == 키패드와의 거리라고 생각함(처음부터 효율적인 코드를 짜려고 노력하다가 생긴 문제점)

  • 왼손은 1에 있고 오른손은 3에 있을 때 숫자가 5라면 거리차이는 같으나 숫자의 차이는 오른손이 더 작다.
  • 처음 문제를 봤을 때 생각한대로 차원의 거리로 바꿔야 함을 깨달음
  • list.index() 함수를 통해서 number의 row값을 특정할 수 있으므로 필요할 때마다 활용해 위치를 특정함

역시 구현이 가능한 제일 쉬운 방법부터 쓰기 시작해서 고쳐나가는 방법이 제일 좋은 것 같다. 우선은 프로그래머스 레벨1에서는 그 방법론을 먼저 배우는 것 같아서 너무 좋다. 이제 카카오 문제만 다 풀면 레벨2로 넘어간다.

profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글