https://www.acmicpc.net/problem/2178


1. 문제 이해


(0,0) 의 좌표부터 (m,n) 좌표 까지 이동할 때 최소경우의 수를 구하는 문제입니다.


2. 접근 방법


- 완전 탐색을 하되, 갔던곳을 다시 가지 않기 위해 큐를 사용해서 문제를 해결하고자 했습니다.

- 큐가 가지는 자료구조를 만들기 위해 Node라는 클래스를 만들었습니다.


3. 문제 해결


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package SilverBell;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class NoteString {
    public static int n;
    public static int m;
    public static int result;
    public static int map[][];
    public static int dx[] = { 10-10 };
    public static int dy[] = { 010-1 };
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        
        map = new int[n][m];
        for(int i=0; i<n; i++) {
            st = new StringTokenizer(br.readLine());
            String tmp = st.nextToken();
            for(int j=0; j<m; j++) {
                map[i][j] = Integer.parseInt(tmp.substring(j, j+1));
            }
        }
        
        bfs(new Node(001));
        System.out.println(result);
    }
    
    public static void bfs(Node init) {
        Queue<Node> qu = new LinkedList<>();
        qu.offer(init);
        
        while(true) {
            if(qu.isEmpty()) break;
            int x = qu.peek().x;
            int y = qu.peek().y;
            int d = qu.peek().depth;
            
            if(x == m-1 && y == n-1) {
                result = d;
                break;
            }
            qu.poll();
            for(int i=0; i<4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                
                if(nx < 0 || nx >= m || ny < 0 || ny >= n) continue;
                if(map[ny][nx] == 0continue;
                
                map[ny][nx] = 0;
                qu.offer(new Node( nx, ny, d+1 ));
            }
        }
    }
}
 
class Node {
    int x, y;
    int depth;
    
    public Node(int x, int y, int depth) {
        this.x = x;
        this.y = y;
        this.depth = depth;
    }
}
cs


'Algorithm > solution' 카테고리의 다른 글

[프로그래머스 #level2] 조이스틱.java  (0) 2021.02.23
[HASH] 완주하지 못한 선수  (0) 2019.11.02
#14503. 로봇 청소기  (1) 2018.01.22
#14891. 톱니바퀴  (0) 2018.01.17
#14502. 연구소  (4) 2018.01.16

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10


알고리즘을 풀던중 라는 오류가 발생했습니다.


ArrayIndexOutOfBoundsException을 알아보도록 하겠습니다!!


우선 의미는

" 잘못된 인덱스를 사용해서 배열에 접근했다는 것을 알려주기 위한 예외입니다. 인덱스는 0보다 크거나 배열의 사이즈보다 작아야 합니다. "


라는 의미입니다.


저 같은 경우, for문을 통한 완전탐색을 하다가 마지막 인덱스에 크기를 잘못 고려하여 발생하였습니다.

(인덱스가 0~9 까지인데 10번째 인덱스 접근했습니다...ㅎㅎ)






알고리즘을 공부하면서 사용했던 자료구조들을 정리해보려고 합니다.

추가 사항이 생기면 업데이트 하도록 하겠습니다!


ArrayList - JAVA API

: 배열처럼 크기를 신경쓰지 않아도 되는 자료구조

  • 생성
    ArrayList<Integer> lists = new ArrayList<>();

  • 추가 (add)
    lists.add(10);  // param : index(0~)

  • 삭제 (remove)
    lists.remove(2);  // param : index(0~)

  • 반복 (for)
    for( int iValue : lists) {
        System.out.println(iValue);
    }




BufferedReader

  • 사용하는 이유
    InputStreamReader는 입력을 character로 읽어들인다. Then 문자열로 입력받으려면 불편하다.
    So 생겨난것이 BufferReader 이다.

cf> BufferedReader : InputStreamReader에 버퍼링 기능을 추가한것으로 데이터를 사용자가 요청할때마다 매번 읽어오기 보다는 일정량사이즈로 한번에 읽어온 후 버퍼에 보관한다. 그리고 사용자가 요구할때 버퍼에서 읽어오게 한다. 

결국, BufferedReader를 이용하면 속도를 향상시키고 시간의 부하를 줄일수 있게 된다.

  • 생성
BufferedReader br 
= new BufferedReader
   (new InpuStreamReader(System.in));

  • br.readLine()
    String 형태로 개행문자(엔터)까지 입력받아옴
cf> int형태로 받고 싶은면?
      Integer.parseInt(br.readLine());


StringBuilder

1
2
3
4
5
6
7
8
// 사용법 예시
StringBuilder sb = new StringBuilder();
 
while(!rst.isEmpty()){
    sb.append(rst.pop());
}
 
System.out.println(sb);
cs



Array

1
2
3
4
// 배열 
Int[][] dp = new int[col][row]     // col:5; row:2
=>    11111
      11111
cs



Queue

  • 한쪽 끝에서만 자료를 넣고 다른 한쪽 끝에서만 있는 자료구조 입니다.
  • 먼저 넣은 것이 가장 먼저 나오기 때문에 First In First Out(FIFO) 라고도 합니다.
  • 생성시에 LinkedList의 생성자를 호출한다.
  • offer : 큐에 자료를 넣는 연산
  • Poll : 큐에서 자료를 빼는 연산
  • Front : 큐의 가장 앞에 있는 자료를 보는 연산
  • Back : 큐의 가장 뒤에 있는 자료를 보는 연산
  • Empty : 큐가 비어있는지 아닌지를 알아보는 연산
  • Size : 큐에 저장되어있는 자료의 개수를 알아보는 연산
  • Java 경우에는 java.util.Queue 사용하는 것이 좋다.


Scanner 정리


String

nextLine() : \n를 마침으로 인식.

  즉, 한줄 단위로 입력받기 때문에 개행문자도 한 줄로 인식

next() : 개행문지, 공백문자를 무시하고 문자를 입력받음.

  즉, 개행이나 공백을 마침으로 인식


Int

nextInt() : 공백문자(space)를 마침으로 인식

  즉, String의 next()와 비슷



cf>

https://jicjjang.github.io/2015/08/28/java-foundation1/



알고리즘 공부를 시작하면서 Scanner에 대해서 조금 정리해 봤습니다.

아마도 이 게시물은 매번 업데이트 될 예정입니다.

* issue

SVN ....[get content / revert] failed....

  => 파일이 lock이 걸린것!!


goal)) clean up으로 lock을 풀어줘야한다.




* solution


1. lock을 풀기위해 sqlitebrowser라는 프로그램을 사용합니다.

 cf> https://sqlitebrowser.org/



2. 새 데이터베이스에 workspace > .svn > wc.db 를 추가합니다.

 ex> C:\[프로젝트 폴더]\workspace\webapps\l[프로젝트명]\.svn


3. select문으로 lock의 여부를 확인후 delete 문으로 실행!


cf> WORK_QUEUE와 WC_LOCK이 delete 되어야 한다. 

# select

*

from WORK_QUEUE;


--delete from WORK_QUEUE;


# select

*

from WC_LOCK;


--delete from WC_LOCK;

4. 우리의 목표였던 svn에서의 clean up을 실행한다.


최근 회사에서 front쪽 프레임워크인 넥사크로를 하게 되어 front쪽으로 관심이 생겨나고 있습니다..ㅎㅎ

그러던중 눈에 들어온 vue.js !!!!!


회사 선배님으로부터 받은 vue.js책을 통해 혼자 자기계발을 시작해 볼 예정입니다 ㅎㅎ

이번에 npm개념이나 bower, git 같은 것들을 같이 공부해 나가면서 중요 개념들을 정리해 나가도록 하겠습니다!!




* Git 시작하기

 - config

 - 온라인/로컬 저장소 만들고 연결하기

 - push 하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
git config --global user.name "이름"
git config --global user.email "깃허브 메일주소" // 매번 물어보는 귀찮음을 피하기 위해 설정.
 
mkdir ~/MyProject   // 로컬 디렉토리 만들고
cd ~/myproject      // 디렉토리로 들어가서
git init            // 깃 명령어를 사용할 수 있는 디렉토리로 만든다.
git status          // 현재 상태를 훑어보고
git add 화일명.확장자  // 깃 주목 리스트에 화일을 추가하고 or
git add .           // 이 명령은 현재 디렉토리의 모든 화일을 추가할 수 있다.
git commit -m “현재형으로 설명” // 커밋해서 스냅샷을 찍는다.
 
git remote add origin https://github.com/username/myproject.git // 로컬과 원격 저장소를 연결한다.
git remote -// 연결상태를 확인한다.
git push origin master // 깃허브로 푸시한다.
cs


참고 ))

https://nolboo.kim/blog/2013/10/06/github-for-beginner/

첫 플랜,


올해 3월 입사를하고 부서도 배치 받으면서 회사 생활에 나름 잘 적응하고 있다.ㅎㅎㅎ


너무 정신없이 시간을 써왔더니 좀 더 나답게 살기 위해 플랜을 만들어 봐야겠다!!


 - 추석 연휴 (21 ~ 26)를 활용한 정처기 실기 공부.

 - 매일 운동하기!! ( 하루 30분은 default)

 -  하루에 개념 한 개씩 정리하기.

 - 3030 영어회화 프로젝트!!


ㅎㅎ흐흐흐 운동과 전공 개념은 다이어리에 매일매일 기록을 통해 성취감을 느껴볼 예정이다!



스트레티지 패턴
: 여러 알고리즘을 하나의 추상적인 접근점을 만들어 접근 점에서 서로 교환 가능하도록 하는 패턴.

 

 

 

 

ex> 요구사항

- 신작 게임에서 캐리거와 무기를 구현해보세요.
- 무기는 두가지 종류가 있습니다.

 

=> 무기들을 접근점으로 만들어준다.

-------------------------------------

1
2
3
public interface Weapon {
 public void attack();
}
cs

 

1
2
3
4
5
6
7
public class knife implements Weapon{
 
 @Override
 public void attack() {
  System.out.println("칼 공격");
 {
}
cs

 

1
2
3
4
5
6
7
public class Sword implements Weapon{
 
 @Override
 public void attack() {
  System.out.println("검 공격");
 {
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 //접근점
 private Weapon weapon;
 
 // 교환 가능
 public void setWeapon(Weapon weapon) {
  this.weapon = weapon;
 }
 
 public void attack() {
 
  if(weapon == null) {
   System.out.println("맨손 공격");
  } else {
 
   //델리 게이트 => 칼일지 검일지 나는 모른다.weapon이 알아서 할거다.
   weapon.attack();
  }
 } 
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
public class Main {
 public static void main(String[] args) {
  GameCharacter gc = new GameCharacter();
  gc.attack();   // 맨손 공격
 
  gc.setWeapon(new Knife());
  gc.attack();   // 칼 공격
  gc.setWeapon(new Sword()); 
  gc.attack();   // 검 공격
 }
}
cs

 

 

 


 

 

java로 개발한 application을 배포할때는 jar, war 형태롤 배포하게 된다.


이 둘은 완전히 동일한 형식이나


war는 web application을 배포하는 형식이고


jar는 library나 일반 application을 배포하는 형식이다.


java ARchive:jar 압축은 하나의 application 기능이 가능하도록 java 파일 등을 압축하고 지원해준다. path등의 경로를 유지하기 때문에 jar 파일을 사용하는 사용자들은 각 파일들에 대한 path문제에서 벗어날 수 없다.

예를 들면 ojdbc14.14, servlet-api, jar 등을 들 수있다.


Web ARchive:war 압축은 jar와 달리 웹 어플리케이션을 지원하기 위한 압축 방식이다. 웹 어플리케이션을 지원하기 위해서 war 압축방식은 jsp, servle, gif, html, jar 등을 압축하고 지원해주며, 이는 jar와 같은 맥락으로 servlet context 접근을 위해 관련된 모든 파일들을 패키지화하여 준다는 말이다.


=> servlet context 접근을 위해서는 관련된 모든 파일들을 패키지화하여야 된다.



* jar / war 파일들의 특징


1) 세 가지 모두 압축 파일이다.

2) 구조적인 차이가 없다.

3) 확장자를 바꿔도 문제가 없다.

4) 만들어진 목적이 다르다.

- jar : 자바 클래스 파일들이 주이며, EJB 파일들을 포함한다.

- war : 웹 어플리케이션에 관련된 파일들을 포함한다. (jsp, servlet 파일들)

+ Recent posts