선택 정렬Selection Sort

선택 정렬Selection Sort 알고리즘의 특징

  • 제자리 정렬(in-place sorting)의 하나이다.
    • 입력벼열(정렬되지 않은 값들) 이외에 다른 추가 메모리를 요구하지 않는 정렬 방법.
  • 해당 순서에 원소를 넣을 위치는 이미 정해져있고, 어떤 원소를 넣을지 선택하는 알고리즘.
    • 첫번째 순서에 첫번째 위치에 가장 최소값을 넣는다.
    • 두번째 위치엔 남은값중 최솟값을 넣는다.
    • n 번째 위치엔 남은 값중 최솟값을 넣는다.
  • 프로세스 방법
    • 주어진 배열에서 최솟값을 찾는다.
    • 그 값을 맨앞의 값과 교체한다.
    • 맨처음 위치를 뺀 나머지 리스트를 같은 방법으로 교채한다.
    • 하나의 원소만 남을때까지 위의 과정을 반복한다.
  • 장점
    • 자료의 이동 횟수가 미리 결정된다.
  • 단점
    • 안정성을 만족하지않는다.

알고리즘 예제

선택정렬의 코틀린 코드

fun main(){

    print(selectionSort(intArrayOf(3,6,1,7,5,4,9)).joinToString(","))
    //1,3,4,5,6,7,9
}

fun selectionSort(arr: IntArray): IntArray{
   var minIdx = 0
   var temp = 0
   for(i in arr.indices){
       minIdx = i
       for(j in i+1 until arr.size   ){
          if(arr[minIdx] > arr[j]) {
              minIdx = j
          }
       }

       if(minIdx != i){
           temp = arr[i]
           arr[i] = arr[minIdx]
           arr[minIdx] = temp
       }

   }

    return arr
}
  • 시간복잡도
    • O(n^2)
    • 정렬할 자료의 길이만큼 이중 반복을한다.
반응형

'프로그래밍 > 알고리즘' 카테고리의 다른 글

레코드, 키의 정의 및 검색 트리  (0) 2020.12.29
삽입정렬Insertion Sort  (0) 2020.12.27
버블 정렬Bubble Sort  (0) 2020.12.26
앞으로 공부할 알고리즘  (0) 2020.12.22

앞으로 공부할 알고리즘. 공부가 끝나면 블로그에 정리 후 링크를 달아두기로한다. 

 

 

1. 정렬
  1.기본적인 정렬 알고리즘
    1. 선택 정렬Selection Sort
    2. 버블 정렬Bubble Sort
    3 .삽입 정렬Insertion Sort
  2. 고급 정렬 알고리즘
    1. 병합 정렬Merge Sort
    2. 퀵 정렬Quick Sort
    3. 힙 정렬Heap Sort
  3. 비교 정렬 시간의 하한
  4. 특수 정렬 알고리즘
    1. 기수 정렬Radix Sort
    2. 계수 정렬Counting Sort

2.선택 알고리즘
  1 평균 선형 시간 선택 알고리즘
  2 최악의 경우에도 선형 시간을 보장하는 선택 알고리즘

3.검색 트리  
  1. 레코드, 키의 정의 및 검색 트리
  2. 이진 검색 트리 
    1. 이진 검색 트리에서 검색
    2. 이진 검색 트리에서 삽입
    3 .이진 검색 트리에서 삭제
  3, 레드 블랙 트리
    1. 레드 블랙 트리에서 삽입
    2. 레드 블랙 트리에서 삭제
    3. 레드 블랙 트리의 작업 성능 분석
  4. B-트리
    1. B-트리에서 검색
    2. B-트리에서 삽입
    3. B-트리에서 삭제
    4. B-트리의 작업 성능 분석
  5. 다차원 검색 트리
    1. KD-트리
    2. KDB-트리
    3. R-트리
    4. 그리드 파일

4. 해시 테이블
  1. 해시 테이블 : 검색 효율의 극단
  2. 해시 함수
    1. 나누기 방법
    2. 곱하기 방법
  3. 충돌 해결
    1. 체이닝
    2. 개방 주소 방법
  4. 해시 테이블에서 검색 시간 분석

5. 집합의 처리
  1. 연결 리스트를 이용한 집합의 처리
    1. 작업의 개요
    2. 수행 시간
  2. 트리를 이용한 집합의 처리
    1. 기본 원리
    2. 연산의 효율을 높이는 방법

6. 동적 프로그래밍
  1. 어떤 문제를 동적 프로그래밍으로 푸는가
  2. 행렬 경로 문제
  3. 돌 놓기 문제
  4. 행렬 곱셈 순서 문제
  5. 최장 공통 부분 순서LCS

7. 그래프
  1. 그래프
  2. 그래프의 표현
    1. 인접 행렬을 이용한 방법
    2. 인접 리스트를 이용한 방법
    3 .인접 배열과 인접 해시 테이블
  3. 너비 우선 탐색BFS과 깊이 우선 탐색DFS
  4. 최소 신장 트리
    1. 프림 알고리즘
    2. 크루스칼 알고리즘
    3 .안전성 정리
  5. 위상 정렬Topological Sorting
  6. 최단 경로
    1. 다익스트라 알고리즘(음의 가중치를 허용하지 않는 경우 )
    2. 벨만-포드 알고리즘(음의 가중치를 허용하는 경우)
    3 .모든 쌍 최단 경로 알고리즘
    4 .사이클이 없는 그래프의 최단 경로
  7. 강연결 요소

8. 그리디 알고리즘
  1. 전형적인 그리디 알고리즘의 구조
  2. 그리디 알고리즘으로 최적해가 보장되지 않는 예
    1. 이진 트리의 최적합 경로 찾기
    2. 보따리 문제
    3 .동전 바꾸기
  3. 그리디 알고리즘으로 최적해가 보장되는 예
    1. 최소 신장 트리
    2. 회의실 배정 문제
    3 .그 밖의 예
  4. 매트로이드 : 그리디 알고리즘으로 최적해가 보장되는 공간 구조
    1. 매트로이드의 정의와 예
    2. 매트로이드의 확장과 포화
    3. 매트로이드 구조이면 그리디 알고리즘으로 최적해 보장
    ★ 4. 문제 공간 탐색 관점에서 본 매트로이드

9. 문자열 매칭
  1. 원시적인 매칭 방법
  2. 오토마타를 이용한 매칭
  3. 라빈-카프 알고리즘
  ★ 4. KMP 알고리즘
  5. 보이어-무어 알고리즘

10. NP-완비
  1. 문제의 종류
  2. Yes/No 문제와 최적화 문제
  3. NP
  4.. 다항식 시간 변환
  5. NP-완비
  6. NP-완비 문제들
  7. NP-하드를 최적화 문제로 확장하기
  ★ 8. 근사해 구하기
  ★ 9. 현상금 걸린 문제들

11.상태 공간 트리의 탐색
  1. 상태 공간 트리
  2. 백트래킹
    1. 미로 찾기 문제
    2. 색칠 문제
  3. 한정 분기
  4. A* 알고리즘
    1. 최단 경로 찾기 문제
    2. TSP
  Drift 공간 탐색과 끌개

반응형

'프로그래밍 > 알고리즘' 카테고리의 다른 글

레코드, 키의 정의 및 검색 트리  (0) 2020.12.29
삽입정렬Insertion Sort  (0) 2020.12.27
버블 정렬Bubble Sort  (0) 2020.12.26
선택 정렬Selection Sort  (0) 2020.12.22

스프링 부트에서 스프링 시큐리티를 사용할때 템플릿 엔진을 머스타쉬를 사용해서 로그인 / 회원가입등을 시도할경우 미리 설정한 리다이렉트 주소로 가게 되는경우가있다. 

이때 에러로그가 안찍혀서 난감해지는대 이럴땐 로그레벨을 낮추면 더 자세한 로그를 볼 수 있다. 

#application.properties

#logging
logging.level.root=debug

위와같이 application.properties 파일에 로깅 레벨을 디버그로 설정해준다( 디폴트는 info)

설정하고 다시 로그인 혹은 회원가입을 시도하면 아까랑은 다른 메시지를 볼 수 있는데 스프링 플터체인 로그가나오면서 "csrf"어쩌고 하는 로그가 나온다.

CSRF 란 Cross-site request forgery의 약자로 타사이트에서 본인의 사이트로 form 데이터를 사용하여 공격하려고 할 때, 그걸 방지하기 위해 csrf 토큰 값을 사용하는 것이다. 참조: velog.io/@max9106/Spring-Security-csrf

csrf에대해 서치를해보니 mustache는 csrf토큰을 기본적으로 제공을 안해주기때문에 생기는 문제였다. 
서치를 좀 해보니 인터셉터를 구현해서 모델에 어트리뷰트로 넣어주는 방법이 있었으나... 그럴리가 없다는 생각에 좀더 검색해보니...

스택오버플로우에서 발견했다. stackoverflow.com/questions/26397168/how-to-use-spring-security-with-mustache
역시 설정에 있었다. 다시한번 어플리케이션 프로퍼티를 열고 

#application.properties

#logging
logging.level.root=debug

#mustache
spring.mustache.expose-request-attributes=true

spring.mustache.expose-request-attributes=true 라고 추가해준다.

이제 머스타쉬에서 csrf를 사용할 수 있다. 

 폼에

  <input type="hidden" name="_csrf" value="{{_csrf.token}}" />

 

이렇게 히든으로 csrf값을 넣어주면 csrf로 인한 필터는 통과할 수 있게되었다. 

반응형

'프로그래밍 > 삽질내역' 카테고리의 다른 글

Intellij 톰캣 에러로그 한글깨짐현상  (0) 2019.11.12

유저생성

create user 'ms'@'%' identified by '1234'

% ==> 모든 도메일


**
create user '유저명'@'도메일' identified by '비밀번호''

 

권한부여 

grant all priviliges on test.* to 'ms'@'%' ; 

**
grant all priviliges on [db명].* to 'user name'@'domain';

참조 : www.codingfactory.net/11336

반응형

docker 마리아db 실행 

docker exec -it mariadb bash 


**
docker exec -it [docker name] [실행시킬 툴]
**

 

참조 : happygrammer.github.io/docker/mariadb/

 

도커에 Mariadb 설치

 

happygrammer.github.io

 

반응형

깃허브에 저장소를 생성 후 로컬 프로젝트를 푸시하는 방법입니다.

  1. 깃허브에 레포지토리를 생성한다.

  2. git bash / terminal 등을 연다.

  3. 푸시할 프로젝트 디렉토리로 이동

  4. 디렉토리에서 깃 init실행

    git init 
  5. 첫 커밋을 위해서 git add .

    git add .
  6. 첫 커밋 실행

    git commit -m "initial commit"
  7. 생성된 깃 레포지토리의 url 복사

  8. 커맨드창에서 리모트 레포지터리 url추가
    In the Command prompt, add the URL for the remote repository where your local repository will be pushed.

    git remote add origin [remote repository URL]  
    
    git remote -v
  9. 푸시

    git push -f origin master
반응형

'프로그래밍 > git' 카테고리의 다른 글

[git] git 공식 튜토리얼 문서. 깃튜토리얼  (0) 2015.03.21

스프링부트를 코틀린 + 마리아디비 조합으로 사용하려고하는데 Mysql에 비해 MariaDB는 자료가 없어서 고생을했다. 
특히 gradle보다는 maven자료가 훨씬 많아서 찾기가 어려웠다. 
나는 아마도 다음에 이런 삽질을 또 할가능성이 크기때문에 여기에 남겨놓는다.

스프링 이니셜라이저에서 코틀린 / 웹 / JPA조합으로 생성했다. 

실행해보니  오류가 발생해서 구글링 후 실행에 성공시켰다. 
변경한 파일은 2개이다. 

application.properties /  build.gradle 두 파일이다. 

먼저 build.gradle이다. 

dependencies {
	implementation("org.springframework.boot:spring-boot-starter-data-jpa")
	implementation("org.springframework.boot:spring-boot-starter-web")
	implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
	implementation("org.jetbrains.kotlin:kotlin-reflect")
	implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
	testImplementation("org.springframework.boot:spring-boot-starter-test") {
		exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
	}

//이부분을 추가 {
	implementation("org.mariadb.jdbc:mariadb-java-client:2.1.2")
// }
}

 

build.gradle 파일에 mariadb 클라이언트 추가 후 그래이들을 새로고침 해주고 application.properties 파일을 수정해주면된다.

spring.datasource.driverClassName=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/[DB명]?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=[DB유저]
spring.datasource.password=[비밀번호]

spring.jpa.show-sql=true

 

반응형

2020.04.03

차를 가지고 와서 이동성이 확보되니까 참 편하다. 집에 라면도 없고해서 마트에 다녀왔다. 내가 이야기 했던가? 숙소엔 배달되는 집이 하나도 없다는 사실을... 

장을 다 보고 치킨을 사먹었다. 태국에서도 치킨은 자주 먹었지만 치킨은 항상 먹고싶다. 홈플러스 근처에 BHC가 있어서 뿌링클을 먹었는데 나는 뼈를 처리하는게 귀찮아서 순살로 시켰다. 그런데 허벅지나 다리, 날개 같은 기름기있고 부드러운 부위가 없고 전부 안심인거같더라. 간만에 먹은 뿌링클이라서 맛있긴 했는데 조금 아쉬웠다.

 

반응형

2020.04.02

오전에 렌트카에 필요한 서류를 떼러 동사무소에갔다. 걸어가니까 편도 3.5키로 정도였다. 돌아올때는 길을 한번 잘못들어서 더 돌아왔다. 대략 8키로정도 걸은거같다. 한시간반 정도 걸렸다. 차만 있었다면 15분이면 끝날일을.... 

오후 2시쯤 전화가왔다. 본사에서 누가 와서 코로나때문에 회의를 하느라 결재가 늦어진다고했다. 어쩌면 오늘 출고가 안될수도 있다고했다. 마음을 내려놓고 기다리고 있는데 다시 전화가 왔다 4시쯤이었는데 출고가 가능하단다. 그래서 일단 예약금 입금하고 출발했다. 불행히도 배송 서비스는 없다고 해서 내가 제주시로 가야하는데 버스타고 2시간 가량 걸린다. 렌트카 아저씨가 6시까지 근무니까 빨리 오라고한다. 

다행히도 5시50분쯤 도착했다. 이런저런 설명을 듣고 인수를 받았다. 아저씨가 좋은사람같았다. 가스가 없어서 충전소에 들려서 3만원 충전했더니 거의 꽉찬다. 확실히 lpg가 저렴하구나.

인수를 끝내고 집에 오니까 7시가 약간 넘었다. 오늘은 낚시를 하러가야지. 

원래 봐둔포인트에 오니까 만조가 2시간가량 지났는데 수심이 너무 적다. 그래서 가까운 서귀포항으로 갔다. 서귀포항에서는 찌낚시 하는분들이 많았다. 루어를 던지기가 좀어려웠다. 그래도 사이사이에 던지고 있었는데 어떤분이 잡으셨다. 뭔가 봤더니 1.5키로 정도 되보이는 무늬오징어였다. 아! 저게 말로만듣던 야엥낚시인가 그건가보다. 생미끼로 오징어잡는거. 잘안잡혀서 테트라쪽으로 가봤더니 전부 무늬만 잡고 계신다. 지금시기 서귀포는 밤에 무늬를 많이 잡나보다. 나는 3시간가량 낚시를 했지만 하나도 못잡고 10시에 집에돌아왔다. 집에 오는길에 홈플러스에 들려서 휴지를 샀다. 

빨리 코로나가 끝났으면 좋겠다. 

반응형

2020.04.01

제주도에 와서 보니까 사람들 많이도 놀러온다. 다음 숙소를 빨리 안구하면 일주일마다 매뚜기마냥 뛰어다녀야할거같다. 그래서 빠르게 다음 숙소를 예약하기로 결정했다.

서귀포 시내로 나가서 카페에서 알아보기로결정하고 버스를 타러 나갔다. 버스를 타러 가는길만 25분가량 걸리고 버스를 타고 또 20분가량을 갔다. 차타고가면 10분이면 갈거리를 45분... 암담하다. 

오늘 점심은 짜장면을 먹었다. 오늘로써 태국에 있을때 먹고싶었던것들은 다 먹은거같다. 

밥을 먹고 약국에 들러서 마스크를 구매했다. 그리고 카페에 갔다.
사실 어제까지만해도 에어비엔비를 싹다 뒤진거같은데 좋은방이 없어서 네이버 카페를 이용했다. 방구한다고 글을 남겨놓으니까 한 50개정도되는 숙소에서 쪽지를 보내준거같다. 그리고 어제 렌터카 회사에도 문의를 남겨놨더니 렌터카에서 전화번호를 알려줬다. 일단 차량이 급하니 렌터카에 먼저 전화했다. 전기차를 쓰고 싶었지만 너무 비싸서 lpg를 하기로했다. 가격이 비싸지만 택시 한번 타는것보다 이득이다. 

숙소를보니 말도안되는곳이 참 많다. 왜 이 좋은 숙소를 이따위로 만들어놨을까? 하는 생각이 많이 든다. 인테리어 조금만 신경쓰면 값은 더 많이 받을 수 있을거같은데... 인테리어가 너무 구려서 절대로 가고싶지않은곳들을 제외하고 접근성, 방크기, 편의성 등을 추려보니 5개정도가 남았다.

여러가지 고려해보고 적절한곳에 예약을 잘 할 수 있었다. 일단 오늘 렌트카와 다음 숙소까지 마무리를 했으니 당분간은 안심할 수 있겠다. 
돌아올때는 택시를 타고 왔는데 7500원정도 나왔다. 만일 왕복으로 탔다면 15천원 정도일텐데 이정도면 하루 렌트비보다 비싸다.

제주에서 한달살기나 노마딩 할때는 반드시 숙소와 버스정류장의 거리를 잘 확인하고, 가급적 시내 / 바다 근처로 잡아야한다. 산쪽은 너무 인프라도 없고 차가 없으면 살기 힘들다. 그대신 숙소값이 좀 싸긴하다. 

반응형

+ Recent posts