오늘 한일

  • 코드스쿼드 레벨 테스트 문제(콘솔상으로 볼링 게임을 만들고 웹으로 옮기기)

오늘 느낀점

  • 예상했던 문제와 다른 형태의 문제가 나왔다. 그래서 구현하는데 더 재밌기도 하지만 오늘은 코드 작성 자체보다는 어떤 구조로 짤지 고민하는데 많은 시간을 썼다. 이제는 구조를 다 쫘뒀으니 코드로 구현을 하도록 하자

내일 할일

  • 코드스쿼드 레벨 테스트 문제 풀기

  • 코드스쿼드 방문

  • 시간이 된다면 머리 깎기

인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.

Sorting in Java

Arrays 클래스가 primitive 타입 데이터를 위한 정렬 메서드를 제공

int[] data = new int[capacity];  
//data[0]에서 data[capacity-1]까지 데이터가 꽉차 있는 경우에는 다음과 같이 정렬한다.
Arrays.sort(data);
//배열이 꽉차 있지 않고 data[0]에서 data[size-1]까지 size개의 데이터만 있다면 다음과 같이 한다.
Arrays.sort(data, 0, size);

int 이외의 다른 primitive 타입 데이터(double, char 등)에 대해서도 제공

String[] fruits = new String[] {"Pineapple", "Apple", "Orange", "Banana"};

Arrays.sort(fruits);
for(String name : fruits)
  System.out.println(name);
List<String fruits = new ArrayList<String>();
fits.add("Pineapple");
fits.add("Apple");
fits.add("Orange");
fits.add("Banana");

Collections.sort(fruits);

for(String name : fruits)
  System.out.println(name);

사용자 정의 객체

public class Fruit{
  public String name;
  public int quantity;
  public Fruit(String name, int quantity){
    this.name = name;
    this.quantity = quantity;
  }
}

// somewhere in your program
Fruit [] fruits = new Fruit[4];
fruits[0] = new Fruit("Pineapple",70);
fruits[0] = new Fruit("Apple",100);
fruits[0] = new Fruit("Orange",80);
fruits[0] = new Fruit("Banana",90);

Arrays.sort(fruits);

무엇이 더 큰지 알수 없다.
사과와 바나나 중 누가 더큰가?

Comparable 인터페이스를 이용 하여 해결

public class Fruit implements Comparable<Fruit>{
  public String name;
  public int quantity;
  public Fruit(String name, int quantity){
    this.name = name;
    this.quantity = quantity;
  }
  //이름을 기중으로 정렬
  public int compareTo(Fruit other){
    return name.compareTo(other.name);
  }
  //수량을 기준으로 정렬
  public int compareTo(Fruit other){
    return quantity - other.quantity;
  }
}

두가지 기준으로 정렬을 하고 싶다면?

하나의 객체 타입에 대해서 2가지 이상의 기준으로 정렬을 지원 할려면?

Comparator 인터페이스를 사용

Comparator 클래스를 extends하여 compare 매서드를 overriding하는 새로운 이름 없는 클래스를 정의한 후 그 클래스의 객체를 하나 생성한다.

//Comparator를 implements하는 익명의 클래스로 객체를 만든다
Comparator<Fruit> nameComparator = new Comparator<Fruit>(){
  public int compare(Fruit fruit1, Fruit fruit2){
    return fruit1.name.compareTo(fruit2.name);
  }
};

Comparator<Fruit> quantComparator = new Comparator<Fruit>(){
  public int compare(Fruit fruit1, Fruit fruit2){
    return fruit1.quantity - fruit2.quantity;
  }
};

Arrays.sort(fruits, nameComparator);
//or
Arrays.sort(fruits, quantComparator);
public class Fruit{
  public String name;
  public int quantity;
  public Fruit(String name, int quantity){
    this.name = name;
    this.quantity = quantity;
  }

  public static Comparator<Fruit> nameComparator = new Comparator<Fruit>(){
    public int compare(Fruit fruit1, Fruit fruit2){
      return fruit1.name.compareTo(fruit2.name);
    }
  };

  public static Comparator<Fruit> quantComparator = new Comparator<Fruit>(){
    public int compare(Fruit fruit1, Fruit fruit2){
      return fruit1.quantity - fruit2.quantity;
    }
  };
}

각각의 객체마다 Comparator를 따로 갖고 있을 필요가 없기 때문에 static으로 둔다.

오늘 한일

  • 알고리즘 강의의 선형시간 정렬(Radix Sort)에 대해 공부했다. (포스팅)

  • 파이썬 웹 프로그래밍 - Django로 웹서비스 개발하기 강의를 들었다. (인프런의 해당 강의)

  • 헌혈을 했다.

오늘 느낀점

  • 이전 자바로 만들어 봤던 로또 웹 앱보다는 단순하지만 간단한 로또 웹 프로그래밍을 해봤는데, 이번에도 느낀게 파이썬 쪽은 사전지식이 적어도 사용하기 더 쉽게 되어 있는거 같다.(제대로 사용하기 위한 학습 또한 쉽다는건 아니다.)

  • 뜬금없이 파이썬, Django 강의를 들은 이유는

    1. 한두번씩 있는 해커톤들이 보면 자바를 대상으로 한 것들은 없다 그렇기때문에 기회가 되면 참여하기 위해 학습 했다.

    2. 백엔드로 신입을 뽑는 스타트업들이 대부분 자바 + 스프링을 요구하는 곳은 없다.

    3. 웹 공부를 자바밖엔 안해봤기 때문에 좀더 시야를 넓혀 보고 싶었다. 내가 자바에서 했던 일들을 다른쪽에선 어떻게 할까? 등 좀 더 큰 시야를 가져보고 싶었다.(MVC 모델만 접해봐서 그게 당연하고, 다 그런줄 알았는데 MTV가 있다는 것도 알게 되었다. 참고로 자바스크립트를 공부했던 이유들 중엔 이와 비슷한 맥락의 이유도 있었다)

    내일 코드스쿼드 레벨테스트를 하게 되는데 여건에 따라 시간이 남으면 해당 강좌를 마무리 해야겠다.

  • 헌혈을 97번째 했다. 대학 초년때 목표했던 100번이 생각보다 길어졌었는데 올해는 가능 할 것 같다.

내일 할일

  • 알고리즘 강의 듣기

  • 파이썬&장고 강의

  • 코드스쿼드 레벨 테스트

인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.

Radix Sort

radix_sort

매 단계는 stable sort여야 한다.


수도코드

RADIX-SORT(A,d)
  for i <- 1 to d
    do use a stable sort to sort array A on digit i

시간 복잡도 O(d(n+k))


비교

알고리즘들

오늘 한일

오늘 느낀점

  • 이틀간 생활코딩의 웹브라우저 Javascript 강의를 들어서 기본적인 사용법에 대해 배웠는데 확실히 이전에 가지고 있던 Javascript에 대한 알수없는 불안감 자체는 사라졌다. 거기다 프론트엔드가 어떻게 돌아가는지 좀 더 알게 된 것 같다.

  • 덕분에 이전까진 관심이 없었던 Node.Js에 대해서도 궁금증이 생겼다.

내일 할일

  • 알고리즘 강의 듣기

  • 파이썬&장고 강의 혹은 개인 프로젝트