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
반응형