프로그래머스 lv2 수준 - peulogeulaemeoseu lv2 sujun

📙 Level 2 연습

이번 포스팅에서는 프로그래머스 Level 2 단계의 문제를 여러개 풀어보겠습니다. 그동안 백준에서 골드 단계 문제에 비하면 쉬운 수준이라 여러개를 한번에 포스팅하도록 하겠습니다. 혹시나 질문사항이 있거나 문제를 푸는 알고리즘에 대해서 더 자세하게 알고 싶으시다면 댓글 남겨주시길 바랍니다!!

2019 KAKAO BLIND RECRUITMENT 오픈채팅방

문제 바로가기

생각

이 문제는 Log 값을 보고 Message를 출력하는 것입니다. 그런데 유저의 nickName 값이 변할 수가 있으므로 각 유저의 고유 id 값을 통해서 Message를 저장하는 것이 중요합니다. 따라서 배열을 만든 다음 각 Message의 순서를 저장한 후 마지막에 닉네임이 바뀐 것을 적용한 Message를 출력해주면 됩니다.

def solution(record): answer = [] messageList = [] userList = {} for log in record: logList = log.split(" ") actionLog = "" if logList[0] == 'Enter': actionLog = "들어왔습니다." userList[logList[1]] = logList[2] messageList.append([logList[1], actionLog]) elif logList[0] == 'Leave': actionLog = "나갔습니다." messageList.append([logList[1], actionLog]) elif logList[0] == 'Change': userList[logList[1]] = logList[2] for userId, actionLog in messageList: nickName = userList[userId] answer.append(f"{nickName}님이 {actionLog}") return answer

연습문제 124 나라의 숫자

문제 바로가기

생각

이 문제는 이진법의 논리와 비슷한데 여기서는 1, 2, 4 이렇게 3개의 숫자를 활용하는 것입니다. 따라서 일반적인 이진법을 하는 것처럼 주어진 숫자를 3의 제곱 형태로 최대한 분리해준다음 진행하면 쉽습니다.

def solution(n): answer = '' count = 0 while n >= 3 ** count: n -= 3 ** count count+=1 while count > 0: a = 0 count -= 1 while n >= 3 ** (count): n -= 3 ** (count) a+=1 if a == 0: answer += '1' elif a == 1: answer += '2' elif a == 2: answer += '4' return answer

스택/큐 기능개발

문제 바로가기

생각

미리 선행되어 있는 일을 끝나야 그 다음 일을 같이 배포할 수 있습니다. 이때 날짜와 index 값을 점점 늘려가면서 비교를 해주었습니다.

def solution(progresses, speeds): answer = [] days = 1 index = 0 count = 0 while index < len(progresses): if progresses[index] + speeds[index]*days >= 100: count += 1 index += 1 if index == len(progresses): answer.append(count) else: if count > 0 : answer.append(count) count = 0 days += 1 return answer

2020 KAKAO BLIND RECRUITMENT 문자열 압축

문제 바로가기

생각

문자열을 잘 파싱한뒤, 비교해주면 됩니다. 이때 저는 deque를 사용하여서 남은 문자열과 이미 검사한 문자열로 나눠서 비교하는 방식을 선택했습니다. 이러한 방식으로 겹치는 부분을 모두 카운트 한다음 조건에 맞게 출력해주면 됩니다.

from collections import deque def solution(s): answer = 1001 length = len(s) stringList = list(s) for i in range(1, length//2 + 2): stringDeque = deque(stringList) prevDeque = deque() while stringDeque: string = "" for v in range(i): if len(stringDeque) == 0: break string += stringDeque.popleft() if len(prevDeque) == 0: prevDeque.append([1, string]) else: count, prevString = prevDeque.pop() if prevString == string: prevDeque.append([count+1, string]) else: prevDeque.append([count, prevString]) prevDeque.append([1, string]) result = "" while prevDeque: count, string = prevDeque.popleft() if count == 1: result += f"{string}" else: result += f"{count}{string}" answer = min(answer, len(result)) return answer

Summer/Winter Coding(2019) 멀쩡한 사각형

문제 바로가기

생각

수학적인 생각을 도와주는 문제입니다. 최대 공약수를 이용해서 문제를 풀면 쉽게 풀 수 있습니다!!

def solution(w,h): answer = w * h x, y = w, h while y: x, y = y, x % y minRect = (w // x) + (h // x) - 1 answer -= x*minRect return answer