본문 바로가기
츄Log/알고리즘 연습장

연습#17

by 츄츄🦭 2023. 12. 19.
728x90

 

안녕하세요.

바쁘고 정신 없는 나날이었습니다.

물리적인 시간도 없었지만 정신적으로도 나태했었습니다.

그래서 목표로한 1일 1알고리즘 문제풀기 도전을 며칠간 못했습니다.

에너지를 충전했으니 다시 시작합니다!

 

일일 지표로 봤을 때는 상승과 하락을 반복하며 왔다갔다 하지만, 주 지표 월 지표로 보았을 때는 꾸준히 우상향 하고 있는 그래프를 그리는 것이 목표입니다. (삼성전자, 애플, 구글 등등 굴지의 대기업 주식 차트 처럼요ㅋㅋ)

 

어제는 leetCode의 링크드리스트 문제인 203. Remove Linked List Elements를 풀었습니다.

링크드 리스트는 당연히 알고 있었지만, 알고리즘 문제로는 처음 만난 유형이어서 조금 헤맸는데요.

핀의 힌트를 받아서 문제를 결국 풀긴 했습니다.

 

문제는, 링크드 리스트가 주어지고, 특정 value가 주어졌을 때 해당 리스트에서 value를 삭제하는 것입니다. 

이미 링크드 리스트라는 자료구조를 알고 있으므로 삭제 로직을 설계하는 것은 어렵지 않았습니다.

하지만 저의 문제는, 리스트의 맨 처음부터 특정 value가 주어지는 케이스 였습니다.

저는 current와 before 커서를 가지고 핸들링 했기 때문에, 맨 처음부터 삭제해야 하는 상황이 온다면 before 커서가 없었기 때문입니다. 

 

이 때 핀이 다음과 같은 힌트를 주었습니다.

꼭 하나의 루프에서 모든 걸 처리하려고 하지 마라. 루프를 두개로 나눠서 해당 케이스(리스트의 첫머리에 특정 value가 오는 케이스)는 미리 걸러라.

위 힌트를 통해 제가 처리하기 어려워 하던 케이스를 미리 걸러낼 수 있었고 결국 1트로 문제를 풀었습니다! (기분 좋음)

 

+) 아, 그리고 한가지 더 팁이 있다면, 삭제된 노드는 next포인터를 굳이 지우지 않아도 됩니다. 어차피 before가 current.next에 이어지는 순간 댕글링 되기 때문입니다.

 

풀긴 했지만, 제가 한 것은 저에게의 최선의 방법이기 때문에 ㅋㅋ 고수분들의 풀이를 보았습니다.

가장 깔끔한 풀이는 재귀였으나 이건 제 능력 밖이었고,

제가 헷갈려하던 풀이를 매우 멋있게 처리한 분도 있었습니다.

 

저는 기존에 사전조건을 장황하게 제거했으나,

이 분은 먼저 head.next 부터 처리를 하고, 최종 리턴문에서 맨 앞 노드가 타겟일 때는 다음 노드부터, 그게 아니면 그냥 그대로 리턴하도록 처리하였습니다.

저도 다음부터는 "첫번째 노드가 골칫거리 라고 생각하는 상황에서, 삭제노드는 next 포인터를 굳이 지우지 않아도 된다. head부터 시작하는 경로가 없어지만 댕글링 된 것이다" 라는 것을 생각하면 아래와 같은 코드를 짤 수 있을 것 같습니다. 

 return head.val == val ? head.next : head;

 

 

후.. 오늘도 벽을 느꼈습니다.

 

728x90

'츄Log > 알고리즘 연습장' 카테고리의 다른 글

연습#19  (1) 2023.12.20
연습#18  (0) 2023.12.19
연습#16  (0) 2023.12.14
연습#15  (0) 2023.12.14
연습#14  (0) 2023.12.13