오늘 한일

  • 화이트 코스때 스프링부트로 구현 했던 작업물을 JSP, Servlet을 이용하여 구현하기 시작했다.

    • index, form(회원가입) JSP 페이지 구현

    • 자바 웹 개발 워크북을 빠르게 읽고, 책에 있는 예제들을 따라하다보니 책을 볼때는 아는것 같았는데 역시 직접 해보니까 쉽지 않다. 그래도 JSP, Servlet에 대해 좀더 알아가는 것 같다.

  • 알고리즘 강의의 순환을 이용하여 n queens problem를 구현 했다. (포스팅)

    • 이전 체스게임을 구현할때 재귀적으로 이동 위치에 다른 말이 있는걸 어떻게 구현할까 고민했는데 좋은 실마리를 찾은것 같다.

내일 할일

  • JSP, Servlet으로 웹애플리케이션 구현하기

  • 알고리즘 강의 듣기

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

Counting Cells in a Blob

Counting Cells in a Blob

  • 입력:

    • N*N 크기의 2차원 그리드(grid)

    • 하나의 좌표 (x,y)

  • 출력:

    • 픽셀 (x,y)가 포함된 blob의 크기,

    • (x,y)가 어떤 blob에도 속하지 않는 경우에는 0

현재 픽셀이 속한 blob의 크기를 카운트 하려면

- Base case: 현재 픽셀이 image color가 아니라면 0을 반환한다.

- Recursice case: 현재 픽셀이 image color라면

  1. 먼저 현재 픽셀을 카운트 한다(count=1)

  2. 현재 픽셀이 중복 카운트되는 것을 방지하기 위해 다른 색으로 칠한다.

  3. 현재 픽셀에 이웃한 모든 픽셀들에 대해서 그 픽셀이 속한 blob의 크기를 카운트하여 카운터에 더해준다.

  4. 카운터를 반환한다.


수도 코드

Algorithm for countCells(x,y)

if the pixel (x,y) is outside the grid
  the result is 0;

else if pixel(x,y) is not an image pixel or already counted
  the result is 0;
else
  set the colour of the pixel (x,y) to a red colour;
  the result is 1 plus the number of cells in each piece of
  the blob that includes a nearest neighbour;

  1. (x,y) pixel이 배열 범위의 값인지 확인한다. 아니라면 0을 리턴한다.

  2. 해당 픽셀이 image pixel 또는 이지 count한 픽셀이면 0을 리턴한다.

  3. 해당 픽셀이 image pixel이면 색을 변경한 후, count + 1을 하고 근처 픽셀들을 재귀적으로 확인한다.

java 코드

private static int BACKGROUND_COLOR = 0;
private static int IMAGE_COLOR = 1;
private static int ALREADY_COUNTED = 2;

public int countCells(int x, int y){
  int result;
  //배열의 범위인지 확인
  if(x<0 || x>N || y<0 || y>=N){
    return 0;
  }
  //이미지 픽셀인지 확인
  else if(grid[x][y] != IMAGE_COLOR){
    return 0;
  }
  //해당 픽셀을 ALREADY_COUNTED로 변경후 1을 리턴 하면서 인근 픽셀들에 대해 재귀적으로 조사한다.
  else{
    grid[x][y] = ALREADY_COUNTED;
    return 1 + countCells(x-1, y+1) + countCells(x, y+1) +
    countCells(x+1, y+1) + countCells(x-1, y) +
    countCells(x+1, y) + countCells(x-1, y-1) +
    countCells(x, y-1) + countCells(x+1, y-1);
  }
}

오늘 한일

  • 코드스쿼드의 화이트 과정 반복주기를 복습 했다.
    • AJAX를 통한 댓글 기능을 구현했다.

    • 이전 화이트 과정에서는 정해진 시간(수업) 안에 구현하느라 빨리 구현하고 싶다는 마음에 자바스크립트 쪽 코드를 많이 못 봤는데 이번엔 차분히 보게 되서 자바스크립트 코드에 조금은 더 익숙해진거 같다.

  • 알고리즘 강의의 순환을 이용하여 Counting Cells in a Blob를 구현 했다. (포스팅)
    • 이전 미로찾기 강의를 듣고 nhn의 알고리즘 문제를 재귀적으로 풀고 있었는데, 내가 구현하고 있던 방식과 같은 방식이였다.(차이점이라면 해당 강의에선 대각선까지 본다는 것)

오늘 느낀점

  • 화이트 과정이 끝나고 특별한 일이 없으면 매일 10~12시에 경기창조혁신센터로 가서 그 날 22시까지 공부를 하고 오고있다. 공부하는 버릇을 만든 덕에 큰 어려움없이 그 시간동안 공부를 하고있다. 근데 최근 집중력이 떨어졌다.

  • 내일부터는 이전 과정에서 만든 스프링 부트를 이용한 웹앱을 JSP, 서블릿을 이용한 복습을 할건데 새로운 작업을 하는 만큼 다시 집중을 잘해보자! (공부 외에는 딴시간은 안 갖고 있는데 휴식시간을 가져야하나 고민이다.)


내일 할일

  • 스프링부트를 통해 만든 웹앱을 “자바 웹개발 워크북”을 통해 공부한 서블릿, JSP를 이용하여 제작해보자.

  • 알고리즘 강의 듣기

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

미로찾기

현재 위치에서 출구까지 가는 경로가 있으려면

  1. 현재 위치가 출구이거나 혹은

  2. 이웃한 셀들 중 하나에서 현재 위치를 지나지 않고 출구까지 가는 경로가 있거나

미로찾기(Decision Problem)

Decision Problem: 답이 yes or no인 문제

boolean findPath(x,y)
  //Base case
  if(x,y) is the exit
    return true;
  //Recursice case
  else
    for each neighbouring cell (x',y') of (x,y) do
      if (x',y') is on the pathway
        if findPath(x',y')
          return true;
    return false;

가본 위치와 가지 않은 위치를 구분

boolean findPath(x,y)
  if(x,y) is the exit
    return true;
  else
    mark (x,y) as a visited cell;
    for each neighbouring cell (x',y') of (x,y) do
      if (x',y') is on the pathway and not visited
        if findPath(x',y')
          return true;
    return false;

방문 한 곳과 벽인 곳이면 바로 false 리턴
위의 코드에 비해 함수 호출은 더 많아지지만 코드가 간결해진다.

boolean findPath(x,y)
  if(x,y) is either on the wall or a visited cell
    return false;
  if(x,y) is the exit
    return true;
  else
    mark (x,y) as a visited cell;
    for each neighbouring cell (x',y') of (x,y) do
      if findPath(x',y')
        return true;
    return false;

미로찾기 자바 코드

  • PATH_COLOR: visited이며 아직 출구로 가는 경로가 될 가능성이 있는 cell
  • BLOCKED_COLOR: visited이며 출구까지의 경로상에 있지 않음이 밝혀진 cell
  private static int N=8;
  private static int[][] maze ={
    {0,0,0,0,0,0,0,1},
    {0,1,1,0,1,1,0,1},
    {0,0,0,1,0,0,0,1},
    {0,1,0,0,1,1,0,0},
    {0,1,1,1,0,0,1,1},
    {0,1,0,0,0,1,0,1},
    {0,0,0,1,0,0,0,1},
    {0,1,1,1,0,1,0,0}
  };

  private static final int PATHWAY_COLOR = 0; //white
  private static final int WALL_COLOR = 1; //blue
  private static final int BLOCKED_COLOR = 2; //red
  private static final int PATH_COLOR = 3; //green

  public static boolean findMazePath(int x, int y){
    if(x<0 || y<0 || x>=N || y>=N){
      return false;
    }
    else if(maze[x][y] != PATHWAY_COLOR){
      return false;
    }
    else if(x==N-1 && y==N-1){
      maze[x][y] = PATH_COLOR;
      return true;
    }
    else{
      maze[x][y] = PATH_COLOR;
      if(findMazePath(x-1,y) || findMazePath(x,y+1) || findMazePath(x+1,y) || findMazePath(x,y-1)){
        return true;
      }
      maze[x][y] = BLOCKED_COLOR;
      return false;
    }
  }

  public static void printMaze() {
  		for(int i =0; i< 8; i++) {
  			for(int j=0; j<8; j++) {
  				System.out.print(maze[i][j] + " ");
  			}
  			System.out.println("");
  		}
  		System.out.println("");
  }

  public static void main(String[] args){
    printMaze();
    findMazePath(0,0);
    printMaze();
  }

오늘 한일

  • 코드스쿼드의 화이트 과정 반복주기를 복습 했다.

    • Answer(댓글) 기능을 추가하여 질문에 댓글을 추가 할수 있게 했다.

    • @ManyToOne, @OneToMany에 대해 공부 했다.
      Question이 Answer을 여러개 가지기 때문에

      @OneToMany(mappedBy="question")
      @OrderBy("id ASC")
      private List<Answer> answers;
      

      이와 같이 작성하면 question 객체가 호출 될때 answers도 같이 오게되서 질문에 종속되어 있는 answer 데이터를 가져올 수 있다.

    • 가능하면 먼저 구현해 보고 이후 포비의 인강을 청취 하면서 진행하는 방식으로 변경하였다.

  • 알고리즘 강의의 순환을 이용하여 미로찾기를 구현 했다. (포스팅)

    • 미로 찾기를 하면서 Recusion을 이용하는게 어떤 점에서 반복문을 이용하는 것보다 더 직관적인지 알게 되었다.

    • 이전 풀어 본 문제들 중에 반복문을 이용 한 것들 중에 Recusion을 이용해서 풀수 있을거 같은데 시간이 날때 도전 해 보자.


내일 할일

  • 코드스쿼드의 화이트 과정 복습

  • 알고리즘 강의 듣기