22.04.28 개발 일기

Leekimoon·2022년 4월 28일
0

개발 일기

목록 보기
4/21

한줄요약 : 어제보단 조금 더 아는 개발자가 되었다.^^.

금일 계획

  1. 연결리스트 강의 수강
    • 단일 연결 리스트 - 완료
    • 이중 연결 리스트 - 완료

LeetCode
1.Check If N and Its Double Exist
2.Valid Mountain Array
3.Replace Elements with Greatest Element on Right Side
4.Remove Duplicates from Sorted Array (27일 4번 문제와 동일하지만 다른 방식으로 접근해봤다.)

오늘은 지난번에 LeetCode 문제를 풀다 살짝 알게 되었던 LinkedList(연결 리스트) 자료구조에 대해서 강의를 수강 하고 알게 되었다. 이전 이야기를 하자면 그때는 문제를 풀기 급급해 강의에서 이론 부분만 듣고 코드를 클론해서 결과만 보고 알려고 하였지만 마음만 급하고 실패해 문제를 풀지 못하였다.
그래서 오늘은 연결리스트에 대해서 최대한 이해하고 사용하게 되었을때 강의를 다시 찾지 않도록 정리를 해보려 한다.

연결 리스트란

  • 연결 리스트, 링크드 리스트(linked list)는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료 구조이다.

글로 정의하면 위와 같이 설명 할수 있는데 간단하게 이야기 하면 값(value)과 다음 노드를 가르키는 포인트(next)로 구성이 되어 있다.
단일연결리스트

그림으로 설명 하면 위에 같이 생긴 것인데, 맨처음 화살표는 head 값을 선언해 노드를 가르키게 하는것고, 끝 화살표는 null 값으로 끝나는 지점을 표현 한다.

function Node(data){
  this.data = data;
  this.next = null;
}
function LinkedList(){
  this.head = null;
  this.length = 0;
}

let linklist= new LinkedList();
linklist.head = new Node(123); // 생성시 data 값을 입력
linklist.length++;
console.log(linklist); //LinkedList { head: Node { data: 123, next: null }, length: 1 }

기본적으로 위 두가지 코드를 선언하여 JavaScipt는 연결 리스트를 다룰수 있다.
값을 생성하는것은 Node()함수로 값에 대하여 수정, 삭제 등 변경을 할때는 LinkedList를 통해 사용하는 형식의 강의였다.
강의에서는 LinkedList에 다양한 prototype 메서드를 만들어서 사용하였는데, 여기서 Object.prototype.method 형식을 이론만 알다가 실제로 다루게 되어서 좋았다.

위 코드에서 사이즈를 측정하고 싶으면,

LinkedList.prototype.size() = function (){
  return this.length;
}

console.log(linklist.size()); // 1 을 출력

이런 형태로 LinkedList에 선언한 length 값을 리턴하는 것으로 생성할수 있다.
이 방식으로 생성시 앞에서 추가를 하고 뒤에서 추가를 하고 다양한 시도를 하게 되었는데, 값을 추적하거나 인덱스를 다루는거에 대해서 생각을 계속 하게되는 자료구조였던거 같다.

LeetCode

오늘은 문제들은 배열값을 토대로 1번 문제는 특정 수식에 대한 값들이 배열내 있는지 탐색하는 것이고, 2번 문제는 일정 값을 가지는 배열들이 들어오는 이 구조가 산모양(삼각형)인지 확인하는 것이였다.

일단 두문제에 대해서 이야기를 하면 1번 문제는 배열 문제들을 풀다 보니 대충 머리속에 구상이 되고 풀 수가 있었지만, 2번 문제는 단순 다음값을 찾는게 아니라 제약 조건들을 만족하는 값인지 비교하고 다음으로 넘어가는 것이였는데, 조건들을 생각 나는데로 입력하면 한개씩 다른 문제들이 나와 거의 해결했지만, 1시간이 넘도록 완전히 해결 하지 못해 다른 사람의 코드를 참고하여 완전한 해결을 하게 되었다. (( ㅠ^ㅠ .. 오늘도 쉽게 넘어가진 못했다. ))

이제 3번 문제는 배열 index 기준으로 다음 index에 현재 값보다 큰값이 있으면 현재 index에 값을 복사 하여 배열 끝까지 탐색하는 문제였다. 오늘은 이중 for문을 최대한 사용하지 않으려 했지만 머리가 잘 돌아가지 않아 이중 for문으로 배열 인덱스에 접근하여 비교하고 값을 변경 하여 해결 하였다.
4번 문제같은 경우는 어제 4번문제랑 동일한게 LeeCode 문제 풀이 코스에 있어서 어제는 Set함수를 통해 중복값을 제거 했다면 for문으로 인덱스에 접근하여 값을 수정하는 방법을 찾아서(LeetCode 문서에서 힌트를 얻어) 해결을 하게 되었다.

오늘도 배열의 값들은 내 생각대로 움직이지 못해서 시간을 소모하게 되었지만, 어제 보단 코드에 대해서 이해가 좀 편안해지고, 값을 조작하는게 익숙해지는거를 느껴 즐거웠던거 같다. ╰(°▽°)╯ 이얏호!!

profile
FrontEnd Developer

3개의 댓글

comment-user-thumbnail
2022년 4월 28일

그림과 코드덕분에 연결리스트를 더 명확하게 파악할 수 있네요~ 어떤 방식으로 leetCode 문제들을 접근하셨는지 써주셔서 좋았습니다! 잘 봤습니다 👍

답글 달기
comment-user-thumbnail
2022년 4월 28일

계속해서 어제보다 더 아는 개발자가 되면 정말 좋은 것 같아요

답글 달기
comment-user-thumbnail
2022년 4월 28일

오 이중 연결리스트까지 ㅎㅎ 정말 열심히 하시는 게 느껴지네요!! 강의로 한 번 보고 또 다시 블로그에 정리를 하면 복습도 할 수 있어 학습에 효과가 좋다고 생각합니다! leetCode 문제는 얼핏 봤을 때 단순해보이지만 그만큼 여러 방면으로 접근할 수 있는 점이 재밌네요 🤗

답글 달기