Developer with Cat
© 2021. All rights reserved.
#[프로그래머스✈][연습문제] 섬 연결하기 풀이
섬을 연결해!! 최소비용으로!
뭐? 어디서 본 거 같은데 ??
자세한 문제 설명과 제한 사항은 프로그래머스 홈페이지 참고. 문제풀러가기
최소신장트리를 푸는 유명한 2가지 방법이 있다.
솔직히 둘이 좀 헷갈린다. 최소비용 부터 시작하는게 크루스칼 이였나??? 프림인가??
우리는 크루스칼 알고리즘 (포스트 적으면서 외움.)으로 한번 해보자!
더 쉽거든
간략하게 크루스칼 알고리즘이 뭐냐면..
사실 두번째 내용이 핵심이다. 제일 적인 비용의 간선은 정렬하고 추가해 나가면 되는데, 사이클의 유무를 따지는게 여간 귀찮은게 아니다.
나에게 가장 쉬운 방법은 간선을 추가할 때마다 노드들(여기선 섬)끼리 그룹화 하는 것이다.
다들 자신에게 편한 방법으로 하세용~
그룹화해서 노드를 연결 했을 때 같은 그룹에 속해있나 아닌가만 따지면 된다.
예를 들어 다음과 같이 상황이 놓여져 있다고 생각하자
1 - 2 - 3 이 하나의 그룹이고 대표는 1이다. 4 - 5 - 6 이 하나의 그룹이고 대표는 4이다.
만약 노드4 와 노드6 의 간선이 있다고 생각하고 연결해보려고 하자. 노드4 의 대표는 노드4 이고, 노드6 의 대표도 노드4 이다. 같은 그룹이라는 것이다.
만약 노드 5와 노드 6 을 연결하려고 하면 서로의 대표가 다르기 때문에 가능하다는 것이다!!!!!!!!!!! 이 경우 노드 4,5,6 의 대표를 바꾸어 주어야한다. 이렇게 숫자로 주어진 경우는 단순하게 대표 4의 값을 6으로 바꾸어주면 된다.
그럼 노드 6을 선택하면 그룹 대표인 노드 4, 다시 4의 대표는 노드 1 … 알겠지용,,? 6-> 4-> 1
노드가 숫자로 주어지면 이렇게 푸는게 나은거 같습니다!!
let group = new Array(128); function solution(n, costs) { var answer = 0; costs.sort((a, b) => { return a[2] - b[2]; }); for (let index = 0; index < n; index++) { group[index] = index; } for (let index = 0; index < costs.length; index++) { let groupA = travel(costs[index][0]); let groupB = travel(costs[index][1]); if (groupA === groupB) continue; answer += costs[index][2]; group[groupA] = groupA < groupB ? groupA : groupB; group[groupB] = group[groupA]; } return answer; } const travel = (n) => { if (n === group[n]) return n; else return travel(group[n]); }; solution(6, [ [0, 1, 5], [0, 3, 2], [0, 4, 3], [1, 4, 1], [3, 4, 10], [1, 2, 2], [2, 5, 3], [4, 5, 4], ]);
오늘 코딩테스트 보고 나는 왜이리 멍청하지 하다가 이 문제를 풀고 희망을 가졌다. 나도 풀 수 있따!.
물론 저보다 더 잘하는 사람이 많을 것 입니다… 겸손하자…
#[🌎elasticsearch] Elasticsearch search 기본사용법 (feat. Kibana)
Elasticsearch 가이드북 ✈
Elasticsearch 홈페이지 가기 ✈
이번에는 ElasticSearch 를 쓰는 이유중 하나인 전문검색 (Full Text Search) 의 간단한 기능을 알아보고자 합니다. 이 부분에 대해서는 내용이 워낙 방대하다보니 제 글은 맛보기 용으로 생각해주시고 Elasticsearch 가이드북 을 더 참고해주시면 감사하겠습니다.!
전문검색은 간단한 예시로 네이버의 검색, 구글의 검색 기능을 생각하시면 편합니다. 데이터베이스의 특징인 특정 단어의 포함 여부, 조건문의 기능과 유사하지만 특정 단어와의 상관관계에 대한 색인기능이 추가되어 있다고 생각하시면 됩니다.
글로만 읽어도 엄청 복잡합니다. 바로 예시 들어가겠습니다. 일단 ElasticSearch 와 Kibana 를 켜 주시고 Kibana DevTools 로 들어가주세요! 이전에 했으니 여러분 다 할 수 있습니다!
먼저 이전에 배운 bulk 키워드를 통해 검색할 데이터를 먼저 생성합시다!! copy copy~
POST _bulk { "index" : { "_index*" : "test", "_id" : "1" } } { "field1" : "i love my cute cat" } { "index" : { "_index" : "test", "_id" : "2" } } { "field1" : "my dog is so big" } { "index" : { "_index" : "test", "_id" : "3" } } { "field1" : "i am big" } { "index" : { "_index" : "test", "_id" : "4" } } { "field1" : "my girl friend is cute" }
제일 먼저 간단한 검색인 URI 검색부터!
GET test/_search?q=dog
자 그럼 다음과 같은 결과가 나올겁니다!
{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.1516262, "hits" : [ { "_index" : "test", "_type" : "_doc", "_id" : "2", "_score" : 1.1516262, "_source" : { "field1" : "my dog is so big" } } ] } }
“hits” 필드를 주목합시다. 만약 해당 검색에서 아무런 결과가 없다면 이 필드안에는 아무 값이 없습니다. “hits” 필드 안에 내용을 잘 보시면 _score 항목이 있습니다. 위에서 검색한 키워드인 “dog” 와 얼마나 상관관계가 있는지에 대한 점수 입니다. 정말 유용한 지표죠?
URI 검색은
GET <index>/_search=?q=<value>
와 같은 형태의 검색을 말합니다. Request Body 에 옵션을 붙여서 더 자세한 검색이 가능합니다. 다음 명령어는 test 인덱스의 field1 의 필드에서만 “dog” 를 검색하는 기능입니다.
GET test/_search { "query": { "match": { "field1": "dog" } } }
만약 특정 인덱스의 모든 document 를 검색하고 싶다면 다음과 같이 해주세요!.
GET my_index/_search { "query":{ "match_all":{ } } }
자자자 기본적인 기능을 배웠습니다.
다음에는 좀더 심화내용을 배워봅시다! 다음 내용을 보기 전에 커피 스윽~ 스트레칭 쭈욱 하고 오세용~🧡🧡
#[🌎elasticsearch] Elasticsearch bulk 기본사용법 (feat. Kibana)
이번에는 쉬어가는 타임으로 bulk 기능을 알아보죠~! 하지만 반드시 필수 요소라는것 !!
ElasticSearch 의 여러 명령을 실행하기 위해서는 bulk 기능이 정말 편리합니다. bulk 는 기본적인 CRUD 명령 수행이 가능합니다.
바로 예를 보시죠!
POST _bulk { "index" : { "_index" : "test", "_id" : "1" } } { "field1" : "value1" } { "delete" : { "_index" : "test", "_id" : "2" } } { "create" : { "_index" : "test", "_id" : "3" } } { "field1" : "value3" } { "update" : {"_id" : "1", "_index" : "test"} } { "doc" : {"field2" : "value2"} }
bulk 기능은 POST 메소드로 “POST url/_bulk” 로 사용 가능합니다.
kibana로 테스트 하시는 경우 url을 따로 지정안해주셔도 됩니다. 커맨드로 하시는 경우는 POST localhost:9200/_bulk 로 사용가능하십니다!
이후에 Request Body 를 포함하여 요청을 전송해야합니다.
기본적으로 한 번의 대량의 명령 데이터를 실행할 때는 bulk 기능을 쓰는 것이 속도가 빠릅니다. 최적의 데이터 명령 수를 알기 위해서는 벤치마크를 이용하여 처음에는 100, 200, 400 으로 늘려가며 테스트 해보는 것을 추천드립니다!! 어느정도 늘렸을 때 속도가 이전 단계보다 매우 완화된 상태라면 그 전단계가 최적화된 명령 개수입니다.
너무 많은 명령 데이터를 사용하게 되면 클러스터의 메모리에 과부하를 주게되니 명심하세요!
정말 공부할 수록 훌륭한 검색엔진입니다. 웹 공부를 하시는 분은 ElasticSearch를 무조건 강추!! 하는바입니다 ^^
#[🌎elasticsearch] Elasticsearch CRUD 기본사용법 (feat. Kibana)
ElasticSearch 의 search 와 Bulk 기능은 이후 포스트에서 다루겠습니다.
ElasticSearch 에서는 REST APIs 안의 Document APIs 에서 해당 내용을 다루고 있습니다.
Index
ElasticSearch 의 Index 는 흔히 아는 배열의 인덱스와는 다르게 데이터베이스의 테이블과 유사한 개념을 가지고 있습니다. 같은 NoSQL MongoDB 의 Collector 와 비슷하다고 생각하시면 편합니다.
HTTP 프로토콜
ElasticSearch 는 http 프로토콜로 접근제어가 가능합니다.
RESTFul
PUT, POST, GET, DELETE 메소드를 통해 자원을 제어할 수 있습니다.
기본적으로 리눅스의 Curl 기능 또는 vscode 의 rest client 등의 기능과 같이 URL을 이용해 자원에 접근제어를 할 수도 있지만 우리가 저번시간에 설치한 Kibana 의 Dev Tool 기능을 통해 Elastic 환경을 실습해보도록 하겠습니다.
정상적으로 Kibana 가 설치되고 실행이 되고 있다면 http://localhost:5601 에 접속하면 Kibana 어플리케이션 메인화면이 기다리고 있어요!!
좌측 상단의 메뉴 버튼을 누른후 아래쪽의 Dev Tools 로 들어가줍니다.
Dev Tools 콘솔에서 좌측에서 Curl 과 비슷한 기능을 수행하고 우측에서 그 결과를 볼 수 있습니다.
일단 데이터베이스에서도 자원을 저장하고 사용하기 위해서 테이블을 만들듯이 ElasticSearch 에서도 이에 해당하는 Index 를 생성해줘야 합니다.
Index 생성에는 PUT 메소드를 사용하여 요청을 해야합니다.
일반적으로 생성에는 POST 갱신에는 PUT 메소드를 사용하지만 ElasticSearch 에서는 둘을 모호하게 사용합니다.
mydoc 이라는 Index 를 생성해봅시다.
PUT mydoc
위의 텍스트를 Dev Tools 콘솔 좌측에 입력후 해당 줄에 생기는 ▶ 이렇게 생긴 삼각형 버튼을 누르면 해당하는 요청이 전송됩니다.
Dev Tools 에서는 http://<호스트>:<포트>/ 가 생략되어 있습니다. 즉 위의 요청은 원래대로라면 PUT http://localhost:5601/mydoc 입니다. Dev tools 에서는 이 사항이 동일시 적용됩니다.포트>호스트>
바로 아래 이어서 첫 데이터를 생성해봅시다.
POST mydoc/_doc { "title" : "first Title", "contents" : "first contents" }
우측에 바로
위와 같은 형식의 결과 데이터가 보인다면 성공입니다. 우측상단에 201 status 코드와 해당 요청을 수행하는데 걸린 시간 또한 표시가 됩니다.
저는 second, third 가 들어가는 데이터를 두개 더 만들었습니다.
POST <인덱스>/\_doc/<아이디> 처럼 아이디를 명시하지 않으면 임의로 아이디를 생성하게 됩니다. 해당하는 아이디가 존재할 경우 **생성**이 아니라 **갱신**을하게 되므로 조심해야 합니다. 또한 PUT 메소드를 통해 PUT <인덱스>/\_create/<아이디> 처럼 생성만 가능하게도 할 수 있씁니다.아이디>인덱스>아이디>인덱스>
이제 확인을 해봅시다. 😎😎
좌측 상단의 메뉴 - 하단의 Stack Management 를 클릭합니다.
좌측 중간즈음 Kibana 카테고리 아래 Index Patterns 를 클릭합니다. 우리가 보려는 Index 를 명시하기 위해 Create Index pattern 을 클릭합니다.
Index pattern name 칸에 mydoc 을 입력하고 Next Step 을 클릭합니다.
우리가 만든 데이터에는 시간 데이터가 없기 때문에 아무것도 선택하지 않아도 생성됩니다. 시간 데이터가 한 개 이상이라면 시간별로 데이터를 추적할 수 있습니다. Create Index Pattern 을 클릭합시다.
이제 좌측 메뉴를 클릭 메뉴 상단의 Kibana - Discover 탭을 선택합니다.
여기서 우리가 위에서 입력했던 Index 의 데이터들이 나타나게 됩니다.
데이터를 생성하는 것은 이제 끝났습니다.
Read 는 매우 단순합니다!
GET mydoc/_doc/cdRVaXYBNC5Keng2JJce
위와 같이 GET <인덱스>/\_doc/<아이디> 형식으로 요청을 하게 되면 해당하는 데이터가 결과값으로 나오게 됩니다.!!아이디>인덱스>
우하우하!우하! 자료가 없으면 not found가 뜨게 됩니다!! 여기까지 하느라 고생많으셨습니다. 이제 얼마 안남았으니 영차영차! 😁😁😁😁
full-text-search 기능인 키워드를 통해 자료를 찾는 search 기능은 다음포스트에서 다루겠습니다.!!
이번에는 Update 기능을 수행해보겠습니다.
Update 는 PUT 메소드를 사용하여 수행할 수 있습니다. second Title 자료의 id를 복사하여 다음과 같은 형태의 요청을 만들어줍니다. 해당하는 Id 가 존재할 경우 데이터 전체를 업데이트하게 됩니다.
PUT mydoc/_doc/ctRWaXYBNC5Keng2Dpfm { "title" : "updated second title", "contents" : "updated second contents" }
성공하면 아래과 같이 result 에 updated 라는 결과값이 표시됩니다.
Kibana 의 Discover 탭을 보게 되면
우하! 행복하군요 Update 가 성공된 것을 확인할 수 있습니다.!!
마지막입니다.!! 이것만 알면 CRUD 기능은 끝 입니다.
DELETE mydoc/_doc/ctRWaXYBNC5Keng2Dpfm
바로 실행!!
삭제 결과 연산을 캡처 하는 것을 깜빡해서 데이터를 하나 더 만들고 다시 삭제해서 이전과 아이디가 다릅니다. ㅜㅜ
위와 같이 result 의 값으로 deleted가 뜨면 성공!!!!
여러분 만남이 있으면 끝도 있는법.
마지막으로 Index 님을 삭제 해드립시다. 잘가 … 😭😭😭😭
DELETE mydoc
삭제… 요청…
성공…
이후 Discover 탭에 어떠한 자료도 추적하지 못하게되었습니다.. 흐극
와우 커피 한잔 하면서 같이 따라해보셨나요. 생각보다 간단합니다. 다음에는 Search 님과 함께 통해 다시 찾아오겠습니다.!!
더 많은 자료 보러 공식홈페이지 가기!!
#[🌎elasticsearch] Elasticsearch Kibana install (ubuntu 20.04)!!
😁😁 nibana 라는 것을 설치할겁니다!! 이전 포스트에서 정상적으로 ElasticSearch 를 설치하셨다면 http://localhost:9200 에 접속하셨을 때 json 형식의 데이터가 보인다면 준비는 완료된 것입니다.
아직 ElasticSearch를 설치 안하셨다면 ?? 🛴Elastic 설치하기!🛴
ElasticSearch 홈페이지에서는 Kibana 를 Elastic Stack 을 들여다보는 창!! 이라고 강조하며 소개하고 있습니다.!!
여기서 Elastic Stack이란?
그 중 Kibana 는 데이터를 표현하고 보여주는 역할을 합니다. 단순히 보여주는게 아니라 분석하고, 정리하고 사람이 보기 쉽게 만들어줍니다!. 물론 Kibana 에서 SQL 문을 이용하여 데이터를 수집도 가능합니다!!
Elastic Stack 은 위의 세가지를 연동하여 사용하는 Stack 으로 ELK 라고 줄여서도 부릅니다.🥽🥽 아주 훌륭한 분들이 정말 좋은 시스템을 만들어놨군요 ~~
우리는 여기서 Kibana 를 오늘 설치해볼겁니다.!! LogStash는 다음에 또 알아봅시다~
$ sudo apt install kibana
끝 입니다.
다음 명령을 입력해 Kibana 를 실행합시다.
$ service kibana start
다음 명령을 입력해 kibana 실행 상태를 확인합니다.
$ service kibana status
정상적으로 Kibana 가 실행중이라면 http://localhost:5601 를 통해 앱을 확인하실 수 있습니다.
끝 입니다. 다음에는 Kibana 의 dev tool 을 이용해서 REST API 의 기본인 CRUD 기능을 배워보겠습니다. ! ! ! 커피 한 잔 스윽 타서 준비합시다!!