알고리즘 개론 및 선택정렬

ims·2020년 9월 30일
0

알고리즘

목록 보기
4/23

표시를 어떻게 할 것인가?

수학문제 풀듯이 조건을 명확히 인지하고, 풀이 조건을 적어가면서 풀어나가야 한다. 그런데 코딩을 할 때는 수학처럼 수식화하는 것이 힘들다. 처음부터 수도코드를 작성하는 것은 쉽지 않다. 그래서 마지막 수도코드를 작성하기 위한, 그리고 틀리거나 헷갈렸을 때 검증을 하기 위해 조건을 부품화 시켜서 정리해나가면서 문제를 풀어야 할 필요성이 있다.

생각들

  • 그렇다면 어떻게 하는 것이 좋을까?에 대해서 고민이 많이 된다. 일단 생각한 방법은 번호를 매기면서 생각과 근거를 정리한다.

  • 생각은 이미지와 언어의 혼합인데 이미지적인 것을 표현하기가 쉽지 않다. 이미지적인 것을 표현하기에 예시가 좋은 것 같다.

  • 문장의 완성도는 신경쓰지 않는다. 대충 근거가 맞게 표현이 되면넘어간다.

  • 풀이는 항상 top-down으로 적는다. 오른쪽에 적었다가 왼쪽에 적었다가 하면 헷갈린다.

  • 생각이 헷갈리면 1번에서부터 아래로 검증을 해본다. 어디까지 확실히 맞는지 보고, 헷갈리는 번호부터 생각을 이어나간다.

  • 생각을 부품 단위로 나누는데에 의의가 있는 것. 익숙한 부품은 크게 나누고, 까다로운 부품은 작게 나누어야 한다. 중요한 거는 통제 가능한 범위의 부품을 여러개 만들어서 조립하는 것.

선택정렬에서의 예시

선택정렬에서 예를 들면

  1. 아이디어 -> 최소값을 가장 앞으로
  2. 배열의 크기가 10이라면, 10,9,8,7,... 로 최소값을 맨 앞으로
  3. 맨 앞으로 보내는건데 실제로는 switch 방식
  4. 그러려면 i=data.length, i -- loop
    j=0; j<i; j++ 오케이
  5. j loop 처음값 min. j 돌면서 min보다 작으면 j의 맨앞으로
  6. 그러려면 j가 시작될 때 초기값에 대한 설정이 있어야 하겠네 고정돼어야 하니까 min = i
  7. sudo 코드 작성
    i loop < data.length , i--
        j loop j=0; j<i; j++
          if(min>data[i])
              switch data[i,j]
  • 이때 조건안에는 검증이 끝난 생각을 적는다. 예를 들면 초기 값의 설정에 있어서 min이 있어야 하니까 int k =i; min=k 아 아니 이러면 k가 없고 초기값이 그냥 min이면 되겠네? 이런 생각이 있었는데 이런거는 side에 적어놓고 main에는 검증이 끝난 생각만 적는다.

코드구현

public class SelectionSort {

    static int[] result(int data[]){
        int temp,min;

        for(int i=data.length;i>0;i--){
            for(int j=0;j<i;j++){
                min=data[i-1];
                if(data[j]>min){
                    temp=data[i-1];
                    data[i-1]=data[j];
                    data[j]=temp;
                }
            }
        }
        return data;
    }

    public static void main(String args[]){
            int[] data = {4,2,1,5,3,7,9,11,43,35};
            int[] returnData = result(data);
            for(int i : returnData){
                System.out.print(i+" ");
            }
    }
}
profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글