일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- FLEX5
- 언마운트
- Linux
- QA엔지니어
- 데이터의 무결성
- 부산입국
- 1463번
- 리눅스
- 설탕문제
- Java
- binaray_gap
- FIDO 환불
- 벤쿠버렌트
- IntelliJ
- 자바
- 프로그래머스
- 엔테크서비스
- FK 설정
- 외래키설정
- codility
- 벤쿠버 렌트
- database연결
- Lesson2
- 백준알고리즘
- 파이도 환불
- Lesson3
- 벤쿠버집구하기
- BC렌트
- 캐나다워홀
- 레노보노트북
- Today
- Total
목록꼬꼬마 개발자 노트/Leetcode Challenge (19)
대충이라도 하자
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b9kzQd/btrfs6dLUzE/fP7fjk4lt7MV1UQGSxCeCk/img.png)
***Sliding window 알고리즘 : 이제껏 들어보지 못한 알고리즘....ㅋㅋㅋ 일정한 범위를 가지고 있는 것을 유지하면서 이것을 이동(sliding)하는 것이다. *** This can be solved using arrayList, set, and map. *** 기본적으로 s의 끝까지 돌리고 s에 들어있지 않은 char이면, set에 더하고 max값을 구한다. 만약에 s가 set에 없으면, start 인덱스를 하나씩 제거하면서 오른쪽으로 이동하게 된다. 중복되는 char를 만날 때까지 지우게 되므로 중복되지 않는 start 점을 구할 수 있게 된다. -> sliding window 알고리즘의 원리인 듯 *** 밑의 방법이 조금 색다른 느낌? *** 처음부터 시작해서 끝까지 확인하는 것은 동일..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dQWABd/btrfnPdm6Jm/T6cicb7YrZY4HH6uFxmn31/img.png)
*** 역시 어렵지만, 원리는 쉽다. *** 끝에서 n번째 이기 때문에, 두 포인터 사이에 n만큼의 차이가 있으면 된다. 그렇기에, fast를 먼저, n만큼 앞서나가게 한 다음, slow와 fast를 똑같이 next시킨다. fast가 end에 닿으면, slow의 다음이 삭제되어야 할 노드이고 slow.next에 slow.next.next를 넣어주면 삭제! *** 효율이 별로 좋지 못하다. ***아래와 같이 dummy node를 사용하지 않고도 가능하다. ***dummy node를 만들지 않으면, 훨씬 빠르다. ListNode start도 없어도 되므로 Memory usage도 better 대신, fast가 n 만큼 앞서나갔을 때, fast가 tail이 될 상황을 고려해 조건문을 넣어주어야 한다. retu..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/era2Fu/btrfnOFtVWc/VkGeGqhYko6ZzzmyOCeWBK/img.png)
***Node 다루는 문제(LinkedList)에 아직 엄청 취약한 거 같다... ***해설을 봐도 이해가 잘 되질 않고... 꼭 개념을 짚고 넘어가야 할 것 같음 ***slow라는 포인터와 fast라는 포인터 두 개를 둔다. ListNode에서 head는 맨 처음 node를 말함(tail은 맨 끝 node) 그렇게 두 개의 포인터에서 slow는 한 번에 one step , fast는 한 번에 two steps이다. 그런 식으로 fast가 먼저 맨 끝에 닿으면 slow가 중간에 있는 node임을 알 수 있다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/EYzbs/btrfdZNjd46/eUNHgOH39t1WTnbMLc1UC1/img.png)
*** first step ***먼저 " "를 기준으로 split -> 하나씩 단어 가지고 와서 reverse -> 그 다음 String answer 에 reverse 완료 된 거 + " " -> 맨 마지막 answer.substring(0,answer.length()-1) 해줬다. (Stringbuilder의 방법도 고려해볼 것!) ***그런데 runtime, memory usage 측면에서 좋지 못한 듯... ***아래와 같은 방법을 찾았다! ***나는 빈칸을 기준으로 split을 먼저 했는데 그럴 필요 없이 전부 charArray로 변경 *** ' '를 만나면 여태까지의 right값과 left 값을 reverseWord로 전달 ***reverseWord 메소드에서 reverse 이전의 문제에서처럼 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/x68Xu/btrfd0kfj9i/FyhJ4VmMVZA9VR2P7M23MK/img.png)
***마찬가지로, two pointers 알고리즘 활용 *** 시간으로는 똑같지만, 메모리 상으로는 계산할 때, end--, start++ 처리를 해서 메로리 사용이 더 적은가...? *** 사실, 돌려볼 때마다 수치가 계속 변경이 되서 정확한지는 모르겠다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bSTGz6/btre42wKEJe/op7f2YNS2RYk5kQUhOGSP0/img.png)
*** 다른 사람들 풀이를 보니, 1) two pointer 2) binary search 3) hashmap 이렇게 있었는데 성능은 binary -> two pointer -> hashmap 순인 거 같다. ***애초에 non-descending order이기 때문에, 맨 처음과 맨 마지막을 더해서 target보다 적으면, start++, target이 크면 end--를 하면 된다는 것이 중요! *** 이진탐색 사용 ***target 값보다 적을 때는 left 값 이동, target 값보다 크면 right 값 이동이라는 기본 골자는 똑같다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dDdI7K/btre2fb1R5M/Zk2tISMLdKke2ISqYBYlY1/img.png)
***마찬가지로, 투 포인터 사용 ***이렇게 간단히 할 수 있는데, 아이디어를 생각해내는 게 역시 어렵다ㅜㅜ *** 0을 맨 뒤로 보내줘야 하기에 계속 처음과 맨 마지막을 비교하려고 했는데 그럴 필요 없이, last에 -1값 부여( 인덱스가 0일 때, 값이 0이 아닐 경우 대비)한 후에, 앞쪽부터 0이면 pass, 0이 아닌 경우는, last(제일 최근에 0이었던 인덱스 or 이미 자리 바꿔준 곳의 인덱스) 그렇기에 여기서 +1을 해주면 이제 바꿔줘야 할 인덱스가 나옴 ***이런 식으로 가장 최근의 것을 바꿔주면 됨.