Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- Git
- @SubscribeMapping
- 커밋 되돌리기
- 기본키 전략
- JPA
- 은행원알고리즘
- 런타임 상수
- allocationSize
- 쿠키
- 쉘 스크립트
- 리눅스
- 프로그래머스
- 파이썬
- 데커
- application layer
- DTO
- 편향된 지수
- 영속화
- 무한정 대기
- BindingResult
- API
- @Autowired
- spring
- JDBC
- compgen
- 알고리즘
- 백준
- intelij spring config
- 컴파일 타임 상수
- m:n
Archives
- Today
- Total
둘셋 개발!
[알고리즘] 프로그래머스 오픈채팅방 - 시간 초과 해결 본문
문제링크: https://programmers.co.kr/learn/courses/30/lessons/42888?language=python3
시간초과된 sourceCode:
def solution(record):
def change_nickname(id, nickname):
try:
index=id_arr.index(id)
nickname_arr[index] = nickname
except:
return None
def find_nickname(id):
index=id_arr.index(id)
return nickname_arr[index]
answer = []
admin = []
id_arr = [0 for i in range(100001)]
nickname_arr = [0 for i in range(100001)]
result = [[0 for i in range(2)] for i in range(100001)]
num = -1
for r in record:
user = r.split()
if user[0]=='Enter':
# 처음 들어온 유저
if change_nickname(user[1],user[2]) == None:
num+=1
result[num] = ["E",user[1]]
id_arr[num] = user[1]
nickname_arr[num] = user[2]
elif user[0] == 'Leave':
num+=1
result[num] = ["L",user[1]]
else: # Change
if len(user[2]) >=1 and len(user[2]) <=10:
change_nickname(user[1],user[2])
for r in result:
print(r)
if r[0]==0:
break
nickname = find_nickname(r[1])
if r[0]=="E":
answer.append(str(nickname)+"님이 들어왔습니다.")
else:
answer.append(str(nickname)+"님이 나갔습니다.")
return answer
이렇게 코드를 짰더니 시간초과가 발생했다.
index()를 하면서 시간이 절약될 것이라고 생각했는데 인덱스의 모든 요소를 검사하기 때문에 시간이 오래걸렸던 것이다.
그리고 이 문제에서는 id로 nickname을 찾는 것이기 때문에 딕셔너리 자료형을 써서 시간을 훨씬 절약할 수 있었다.
딕셔너리 자료형은 모든 요소를 순차적으로 검색하는 것이 아니라 key값만 딱! 보기 때문에 시간이 짧게 걸린다.
다음은 딕셔너리 자료형을 사용해서 시간 초과를 해결한 답이다!
- 시간초과 해결 SourceCode
def solution(record):
answer = []
result = {} # 딕셔너리
for r in record:
user = r.split()
if user[0]=='Enter' or user[0]=='Change':
result[user[1]] = user[2]
for r in record:
user = r.split()
if user[0] =="Enter":
answer.append(result[user[1]]+"님이 들어왔습니다.")
elif user[0]=="Leave":
answer.append(result[user[1]]+"님이 나갔습니다.")
return answer
'알고리즘' 카테고리의 다른 글
[알고리즘] 백준 공유기 설치 - 이진탐색 (0) | 2022.06.18 |
---|---|
[알고리즘] 프로그래머스 메뉴 리뉴얼 (0) | 2022.06.08 |
[알고리즘-구현] 문자열 압축 (0) | 2021.12.08 |
[그리디 문제] 무지의 먹방 라이브 (2) | 2021.12.01 |
[그리디-문제] 만들 수 없는 금액 (2) | 2021.11.30 |