Algorithm

[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
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.