코딩한걸음
728x90
반응형

코딩 테스트 문제풀이의 목표

  • 코딩 테스트 문제풀이를 하며 알고리즘에 대한 이해도를 높힌다
  • 팀원들과 코드 리뷰를 하며 해당 코드를 짠 구체적인 이유를 제시한다
  • https://github.com/raoneli1013/codingtest

문제 1 : https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

# https://school.programmers.co.kr/learn/courses/30/lessons/42576
# 완주하지 못한 선수

# 문제 설명
# 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 
# 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

# 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 
# 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 
# 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

# 제한사항
# 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
# completion의 길이는 participant의 길이보다 1 작습니다.
# 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
# 참가자 중에는 동명이인이 있을 수 있습니다.

participant =["mislav", "stanko", "mislav", "ana"]
completion = ["stanko", "ana", "mislav"]

set_people = set(participant)-set(completion)
if not set_people:
    participant.sort()
    completion.sort()
    idx=0
    while True:
        if participant[idx] != completion[idx]:
            answer = participant[idx]
            break
        idx+=1
else: answer = list(set_people)[0]

print(answer)

 

 

 


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

 

# https://school.programmers.co.kr/learn/courses/30/lessons/64061
# 크레인 인형뽑기 게임

# 문제 설명
# 게임 화면은 "1 x 1" 크기의 칸들로 이루어진 "N x N" 크기의 정사각 격자이며 
# 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. 
# 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 
# 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 
# 차곡차곡 쌓여 있습니다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서
# 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 
# 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 

# 만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 
# 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 
# 위 상태에서 이어서 [5번] 위치에서 인형을 집어 바구니에 쌓으면 
# 같은 모양 인형 두 개가 없어집니다.

# 크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 
# 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 
# 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. 

# 게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 
# 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 
# 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 
# return 하도록 solution 함수를 완성해주세요.

# [제한사항]
# board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
# board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
# 0은 빈 칸을 나타냅니다.
# 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
# moves 배열의 크기는 1 이상 1,000 이하입니다.
# moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

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]
# result = 4

# board를 행에서 열로 재정의
new_board = []
for i in range(len(board[0])):
    arr = []
    for j in range(len(board[0])):
        if board[j][i]:
            arr.append(board[j][i])
    arr.reverse()
    new_board.append(arr)

# 크레인에서 바구니로 담기
bucket = []
answer = 0
for i in moves:
    if new_board[i-1]:
        if not bucket:
            bucket.append(new_board[i-1].pop())
        elif new_board[i-1][-1] != bucket[-1]:
            bucket.append(new_board[i-1].pop())
        # 크레인과 바구니 최상단이 같으면 둘다 없어짐
        else:
            new_board[i-1].pop()
            bucket.pop()
            answer += 2
print(answer)


# 제출용 함수
def solution(board, moves):
    new_board = []
    for i in range(len(board[0])):
        arr = []
        for j in range(len(board[0])):
            if board[j][i]:
                arr.append(board[j][i])
        arr.reverse()
        new_board.append(arr)
    bucket = []
    answer = 0
    for i in moves:
        if new_board[i-1]:
            if not bucket:
                bucket.append(new_board[i-1].pop())
            elif new_board[i-1][-1] != bucket[-1]:
                bucket.append(new_board[i-1].pop())
            else:
                new_board[i-1].pop()
                bucket.pop()
                answer += 2
    return answer

 


문제 3 : https://school.programmers.co.kr/learn/courses/30/lessons/181945

 

# https://school.programmers.co.kr/learn/courses/30/lessons/181945
# 문자열 돌리기

# 문제 설명
# 문자열 str이 주어집니다.
# 문자열을 시계방향으로 90도 돌려서 아래 입출력 예와 같이 출력하는 코드를 작성해 보세요.

# 제한사항
# 1 ≤ str의 길이 ≤ 10

str = input()
for i in str:
    print(i)

 


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

 

# https://school.programmers.co.kr/learn/courses/30/lessons/67256
# [카카오 인턴] 키패드 누르기
# 문제 설명

# 이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
# 맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 
# 엄지손가락을 사용하는 규칙은 다음과 같습니다.

# 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
# 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
# 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
# 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
# 4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
# 순서대로 누를 번호가 담긴 배열 numbers, 
# 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 
# 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 
# return 하도록 solution 함수를 완성해주세요.

# [제한사항]
# numbers 배열의 크기는 1 이상 1,000 이하입니다.
# numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
# hand는 "left" 또는 "right" 입니다.
# "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
# 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 
# R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

numbers = [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]
hand = "right"
# result = "LRLLLRLLRRL"

# 왼손잡이/오른손잡이
dic = {"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),
        "right":"R","left":"L"}
L,R = "*","#"
answer = ''
for i in numbers:
    if str(i) in ["1","4","7"]:
        L = str(i)
        answer += 'L'
    elif str(i) in ["3","6","9"]:
        R = str(i)
        answer += 'R'
    else:
        a = dic[str(i)]
        if abs(a[0]-dic[L][0])+abs(a[1]-dic[L][1])>abs(a[0]-dic[R][0])+abs(a[1]-dic[R][1]):
            R = str(i)
            answer+='R'
        elif abs(a[0]-dic[L][0])+abs(a[1]-dic[L][1])<abs(a[0]-dic[R][0])+abs(a[1]-dic[R][1]):
            L = str(i)
            answer+='L'
        else:
            answer+=dic[hand]
            if hand=="right":R = str(i)
            else: L = str(i)
    print(i, L, R, answer)

def solution(numbers, hand):
    dic = {"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),
            "right":"R","left":"L"}
    L,R = "*","#"
    answer = ''
    for i in numbers:
        if str(i) in ["1","4","7"]:
            L = str(i)
            answer += 'L'
        elif str(i) in ["3","6","9"]:
            R = str(i)
            answer += 'R'
        else:
            a = dic[str(i)]
            if abs(a[0]-dic[L][0])+abs(a[1]-dic[L][1])>abs(a[0]-dic[R][0])+abs(a[1]-dic[R][1]):
                R = str(i)
                answer+='R'
            elif abs(a[0]-dic[L][0])+abs(a[1]-dic[L][1])<abs(a[0]-dic[R][0])+abs(a[1]-dic[R][1]):
                L = str(i)
                answer+='L'
            else:
                answer+=dic[hand]
                if hand=="right":R = str(i)
                else: L = str(i)
    return answer

 

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!