/ 제출 1 /
def change(array, uid):
return updated_array
def solution(records):
answer = []
name_dict = {}
for record in records:
record = record.split()
if len(record) == 3:
oper, uid, name = record
else: # leave인 경우
oper, uid = record
if oper == 'Enter':
answer.append(uid+"님이 들어왔습니다.")
if uid not in name_dict:
name_dict[uid] = name
elif uid in name_dict and name_dict[uid] != name:
name_dict[uid] = name
if oper == 'Change':
name_dict[uid] = name
if oper == 'Leave':
answer.append(uid+"님이 나갔습니다.")
result = []
for ans in answer:
nim_idx = ans.index('님')
result.append(name_dict[ans[:nim_idx]]+ans[nim_idx:])
return result
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
풀이 소요 시간 33분
기능을 정리해서 푸니 해결법이 빨리 떠오른 것 같습니다.
입력값을 잘 파악하고, 출력값을 잘 정의하고, 구현할 기능을 세분화해서 나누는게 덜 헷갈리는 비법인 것 같습니다.
(물론 그래도 자주 틀리긴 합니다.. ㅎㅎ 그~ 래도 ~ ! 그~나마~!)
하여간 아이디어는 이렇습니다.
1) 출력할 문자열 배열 따로, ' uid : 이름 ' 기록 사전 따로 저장합니다.
2) oper : 명령어에 따라 문자열 배열에 값을 추가하거나(enter, leave) | uid사전의 이름을 업데이트하거나(enter, change) 합니다.
3) 사용자는 항상 불변의 아이디를 지니므로 이를 키값으로 참조한다고 생각했습니다.
중간 과정에서 이름이 어떻게 변화했건 문자열 배열은 신경 안 쓰게 하는 것입니다.
최종적으로 이름을 결정짓는건 uid사전에 적힌 이름입니다.
이를 마지막에 한꺼번에 업데이트 해줍니다.
- 사실 3)에서 미스포인트가 있어 좀 헤멨습니다. 각 요소 따와서 replace함수로 바로 대치해주려고 했는데.. answer배열 자체가 업데이트가 안 되더군요. 업데이트하고 다시 넣어줘야하는 것 같았고, 이를 위해 기존 배열을 인덱스처리해서 다시 넣어주기는 번거롭게 느껴져 결과 배열을 새로 만들기로 했습니다.
- 그리고 record를 한 줄에 변수 할당해줄 때도 길이 문제로 살짝 삐끗했습니다. split()으로 쪼갰을 때, change는 요소가 2개만 된다는 예외를 확인하지 않고 모든 명령어를 묶어서 같이 해결해보려다가 착각했습니다. 이와 같은 경우도 경우의 수를 나눴습니다.
+ 스스로 약간 칭찬할만한 점은 추가 테스트 케이스를 넣어 검사할 줄 알게 된 것 같습니다. 3일만에 장족의 발전이지만, 다음 시험에서 이를 잘 익혔는지가 판가름 날 것 같습니다. 그 때까지 예민하게 모든 경우의 수를 다 따질 수 있도록 열심히 연습해야겠습니다.
/ 다른 분들 풀이 /
def solution(record):
answer = []
namespace = {}
printer = {'Enter':'님이 들어왔습니다.', 'Leave':'님이 나갔습니다.'}
for r in record:
rr = r.split(' ')
if rr[0] in ['Enter', 'Change']:
namespace[rr[1]] = rr[2]
for r in record:
if r.split(' ')[0] != 'Change':
answer.append(namespace[r.split(' ')[1]] + printer[r.split(' ')[0]])
return answer
저는 입력 받으며 키워드에 따라 사전 업뎃하고, 바로 리턴 배열에 넣고, 그 과정이 끝난 뒤 한 번에 사전에 따라 업데이트를 했습니다.
반면, 이 분들의 코드는 키워드에 따라 사전 업뎃만 진행하고, 그 과정이 끝난 뒤 사전에 따라 배열에 넣으며, change기록만 빼고 리턴문자열배열에 넣는 식으로 진행하셨습니다.
문제 풀며 두 가지 방안 다 떠올리기는 했습니다. 하지만 한 번 돌 때 두 가지 기능이 섞여있는 느낌이 들면 개인적으로 정신 못 차리고 실수를 하곤 해서 제가 한 대로 구현한 것 같습니다.
하지만 아이디어만 떠올리고 구현은 안 한 부분을 다른 분들께서 구현해 공유해주신 덕에 다른 시각을 가져볼 수 있어서 유익했습니다.
'CodingTest > Programmers' 카테고리의 다른 글
[ 프로그래머스 ] 타켓 넘버 < 다시 풀기 > (0) | 2022.06.25 |
---|---|
[ 프로그래머스 ] 구명보트 (0) | 2022.06.25 |
[ 프로그래머스 ] 문자열 압축 (0) | 2022.06.24 |
[ 프로그래머스 ] 큰 수 만들기 (0) | 2022.06.24 |
[ 프로그래머스 ] 카펫 (0) | 2022.06.23 |