[1일 3알고리즘] Day2

    728x90

    1. [카카오 인턴] 키패드 누르기 - 프로그래머스

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

     

    프로그래머스

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

    programmers.co.kr

    def solution(numbers, hand):
        keyPositions = {
            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)
        }
    
        leftPos = keyPositions['*']
        rightPos = keyPositions['#']
    
        result = []
    
        for number in numbers:
            if number in [1, 4, 7]:  # 왼손을 사용하는 경우
                result.append("L")
                leftPos = keyPositions[number]
            elif number in [3, 6, 9]:  # 오른손을 사용하는 경우
                result.append("R")
                rightPos = keyPositions[number]
            else:
                currentPos = keyPositions[number]
                leftDist = abs(leftPos[0] - currentPos[0]) + abs(leftPos[1] - currentPos[1])
                rightDist = abs(rightPos[0] - currentPos[0]) + abs(rightPos[1] - currentPos[1])
    
                if leftDist < rightDist:  # 왼손이 더 가까운 경우
                    result.append("L")
                    leftPos = currentPos
                elif rightDist < leftDist:  # 오른손이 더 가까운 경우
                    result.append("R")
                    rightPos = currentPos
                else:  # 거리가 같은 경우, 손잡이에 따라 결정
                    if hand == "right":
                        result.append("R")
                        rightPos = currentPos
                    else:
                        result.append("L")
                        leftPos = currentPos
    
        return ''.join(result)

     

    개념 정리

    딕셔너리로 키패드 1대1 매칭. 그냥 모든 경우를 If문으로 풀었다. 왼손, 오른손 에 해당하는 키패드값은 그대로 result에 넣고, 좀 비효율적이지만 양손의 값을 flag로 계속 트래킹해서 중간 자리 번호(2,5,8,0)이 나오는 경우에는 절댓값을 통해서 현재 두 손가락의 위치 중 더 가까운 곳을 찾아 if문으로 계산라여 결과를 넣었다. 이 거리마저도 같은 경우, hand로 판단하도록 하였다.

     

     

    2. 크레인 인형뽑기 게임

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

     

    프로그래머스

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

    programmers.co.kr

    def solution(board, moves):
        list = []
        ans = 0
        for i in moves:
            for j in range(len(board)):
                if (board[j][i-1] != 0):
                    list.append(board[j][i-1])
                    board[j][i-1] = 0
    
                    if len(list) > 1:
                        if list[-1] == list[-2]:
                            list.pop(-1)
                            list.pop(-1)
                            ans += 2
                    break
        return ans

    개념 정리

    파이썬 공부 기초부터 다시 해야겠다..... 2차원 배열 이용하여 풀었으며, list에 뽑은 인형 번호를 저장하고, 스택에 인형이 1개보다 많으면 (2개 이상) 가장 최근 두개를 비교하고 같은 경우 없앤다. 없앨때 pop(-1) pop(-2)이래놓고 왜 안돼지??? 만 엄청 생각했다...

     

    3. 하샤드 수

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

     

    프로그래머스

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

    programmers.co.kr

    def solution(x):
        sum = 0
        num = str(x)
        for n in num:
            sum += int(n)
    
        if x % sum == 0:
            ans = True
        else:
            ans = False
        return ans

    개념 정리

    위에서 반성(?) 하고 기초 문제로 돌아왔다. 이 문제는 숫자를 str로 바꾸어 각 자리를 더하고, 하샤드 수 조건에 해당하는지 확인하여 해결하였다.

    'Algorithm' 카테고리의 다른 글

    [1일 3알고리즘] Day4  (0) 2024.04.16
    [1일 3알고리즘] Day3  (0) 2024.04.15
    [1일 3알고리즘] Day1  (0) 2024.04.11
    [DP]note 5  (0) 2023.12.03
    [백준] 2309: 일곱 난쟁이  (0) 2023.10.15

    댓글