오늘 포스팅 할 내용은 2019 KAKAO BLIND RECRUITMENT에서 나온 문제인 오픈채팅방 문제를 풀어봤습니다.
1. 문제 설명
2. 제한 사항 및 입출력 예시
3. 문제 풀이
이번 문제는 생각보다 당황스러웠던 문제 중 하나였습니다.
제가 푼 방법은 딕셔너리를 이용해서 key와 value를 사용한 방식입니다.
이번 문제는 말 그대로 "Enter Uid1234 Muzi"일 경우 "check usrId name"으로 구분하여 check 값이 요청할 때
해당 usrId에 대한 name값을 반환해주면 되는 문제 입니다.
처음 풀었을 때는 런타임 에러가 발생했었는데 두번째 푼 코드는 런타임 에러가 나지 않고 성공했습니다.
우선 코드를 보면서 하나씩 설명하겠습니다.
# 틀렸던 코드
def solution(record):
resultUsrId = {}
resultNumber = {}
for i in range(len(record)):
checkList = record[i].split(sep=" ")[0]
checkListU = record[i].split(sep=" ")[1]
if (record[i].split(sep=" ")[0] == "Enter"):
resultNumber[i] = "Enter " + record[i].split(sep=" ")[1]
resultUsrId[record[i].split(sep=" ")[1]] = record[i].split(sep=" ")[2]
elif(record[i].split(sep=" ")[0] == "Leave"):
resultNumber[i] = "Leave " + record[i].split(sep=" ")[1]
# resultUsrId[record[i].split(sep=" ")[1]] = record[i].split(sep=" ")[2]
elif(record[i].split(sep=" ")[0] == "Change"):
resultUsrId.update
resultUsrId[record[i].split(sep=" ")[1]] = record[i].split(sep=" ")[2]
usrCount = ""
checkCount = ""
answer = list()
for i in range(len(resultNumber)):
checkCount = resultNumber[i].split(sep=" ")[0]
usrCount = resultNumber[i].split(sep=" ")[1]
resultCheck = ""
if(checkCount == "Enter"):
resultCheck = resultUsrId[usrCount] + "님이 들어왔습니다."
else:
resultCheck = resultUsrId[usrCount] + "님이 나갔습니다."
answer.append(resultCheck)
return answer
위에 코드를 실행하면 result값하고 동일하게 나옵니다.
그렇기 떄문에 저도 처음에 이게 왜 틀릴까 생각도 많이해보고 고민을 했었습니다.
그렇지만 곰곰히 생각해보니 굳이 입력받은 리스트의 길이로 반복문을 돌리는 방법 때문에 split을 " "로 조건을 걸어서
제한 사항을 생각하지 못했습니다.
def solution(record):
resultList = []
resultUsrId = {}
for i in record:
temp = i.split()
check = temp[0]
usrId = temp[1]
if check == "Enter":
resultUsrId[usrId] = temp[2]
resultList.append((check, usrId))
if check == "Change":
resultUsrId[usrId] = temp[2]
if check == "Leave":
resultList.append((check, usrId))
usrCount = ""
checkCount = ""
answer = list()
for i in range(len(resultList)):
checkCount = resultList[i][0]
usrCount = resultList[i][1]
resultCheck = ""
if(checkCount == "Enter"):
resultCheck = resultUsrId[usrCount] + "님이 들어왔습니다."
else:
resultCheck = resultUsrId[usrCount] + "님이 나갔습니다."
answer.append(resultCheck)
return answer
다시 풀었던 코드입니다.
위에서는 하나씩 split을 했던 방식을 최소화하였고 이에 따라서 좀 더 간결해졌습니다.
시간복잡도의 경우에는 2중 포문에 비해 포문을 2번을 나눠 사용하는 것이 좀 더 효율적입니다.
요약하면 위에서 사용한 코드와 실패했던 코드와 동일한 방법을 이용했습니다.
둘다 resultList에는 해당 Enter/Leave/Change와 UsrId를 담고 resultUsrId에는 해당 usrId와 Name을 key, Value로
해당 resultList에서 요구하는 usrId에 대한 name을 resultUsrId에서 받아오는 방식을 이용했습니다.
4. 결과
이번 포스팅에서도 알고리즘 관련하여 문제를 풀어봤습니다.
다음 포스팅도 더 유익한 정보로 찾아오겠습니다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[세무민의 코딩일기] 프로그래머스 위클리 챌린지 2주차 상호 평가 문제 풀이 (0) | 2021.08.12 |
---|---|
[세무민의 코딩일기] 프로그래머스 주식가격 문제 풀기 (0) | 2021.08.09 |
[세무민의 코딩일기] 프로그래머스 부족한 금액 계산하기 문제 풀이 (0) | 2021.08.03 |
[세무민의 코딩일기] 프로그래머스 짝지어 제거하기 문제 풀이 (0) | 2021.08.01 |
[세무민의 코딩일기] 숫자 문자열과 영단어 문제 풀이 (0) | 2021.07.31 |