반응형

1. 시험환경

    ˙ Android Studio

    ˙ AVD(Android Virtual Device)

    ˙ Physical Device(삼성 갤럭시 S)

 

2. 목적

    ˙ 안드로이드 스튜디오에서 신규 프로젝트를 생성한다.

    ˙ 프로젝트를 AVD에 Import하고 결과를 확인한다.

    ˙ 프로젝트를 핸드폰 단말기에 Import하고 결과를 확인한다.

 

3. 적용

    ① Android Studio를 실행하고 "New Project" 버튼을 클릭한다.

 

    ② 프로젝트 템플릿을 선택하고, "Next" 버튼을 클릭한다.

 

    ③ 생성할 프로젝트를 설정하고, "Finish" 버튼을 클릭한다.

        - Name : 프로젝트 이름 입력
        - Pakcage name : 앱 구분을 위한 고유값 입력
        - Save location : 프로젝트 저장 위치 입력
        - Minimum SDK : 안드로이드 SDK 버전 설정. (전세계 사용자 디바이스 장치와 호환율 확인)

        - Build configuration language : Kotlin 또는 JAVA

 

    ④ 신규 프로젝트가 생성된다.

 


 

    ⑤ 프로젝트를 가상디바이스에 Import하기 위해 가상 디바이스 장치를 선택한다.

        - Virtual Device 최초 설정 방법은 포스팅을 참고한다. (https://languagestory.tistory.com/175)

 

    ⑥ "Run" 단축 아이콘을 클릭하여 프로젝트를 선택한 장치에서 실행한다.

 


 

    ⑦ 프로젝트를 실제 디바이스에 Import하기 위해 PC와 USB로 연결된 핸드폰 장치를 선택한다.

        -  Physical Device를 생성하는 방법은 포스팅을 참고한다. (https://languagestory.tistory.com/177)

 

    ⑧ "Run" 단축 아이콘을 클릭하여 프로젝트를 선택한 장치에서 실행한다.

 

4. 결과

    ˙ Virtual Device에서 실행한 화면을 확인하고, 화면을 클릭하여 조작한다.

AVD 환경에서 실행된 App 화면

 

 

 

반응형
반응형

1. 시험환경

    ˙ Android Studio

    ˙ AVD(Android Virtual Device, 안드로이드 가상 디바이스)

 

2. 목적

    ˙ Android Studio에서 제공하는 AVD를 최초 실행 및 동작하는 방법을 학습한다.

 

3. 적용

    ① Android Studio → More Actions → Virtual Device Manager를 클릭한다.

 

    ② 신규 디바이스를 만들기 위해 +("Create Virtual Device") 버튼을 클릭한다.

 

    ③ 가상 Device를 선택 후 Next 버튼을 클릭한다.

 

    가상 Device에 설치할 Android OS 이미지를 선택 및 설치한다.

 

 

    설치가 완료되면 에뮬레이터를 실행한다.

 

4. 결과

    ˙ PC 환경에서 개발한 앱을 테스트할 수 있는 가상 디바이스 장치가 생성되었다.

 

반응형
반응형

1. 시험환경

    ˙ 윈도우

    ˙ 안드로이드 스튜디오

 

2. 목적

    ˙ 윈도우 운영체제에서 안드로이드 스튜디오를 설치한다.

 

3. 적용

    ① 안드로이드 개발자 사이트에 접속해서 "Andriod 스튜디오" 메뉴를 클릭한다.

        - URL : https://developer.android.com/

 

    ② "Download Andriod Studio" 버튼을 클릭한다.

 

    ③ 팝업창에서 "동의" 버튼을 클릭하고 최신 제공 버전을 다운 받는다.


 

    ④ 다운 받은 설치파일을 실행하고, 단계별 설치 과정에서 "Next" 버튼을 클릭한다.

        - Android Virtual Device (체크) : 실제 핸드폰이 아닌 PC에서 가상의 안드로이드 폰을 이용하여 테스트한다.

 


 

    ⑤ Android Studio IDE 설치 과정이 완료되면 SDK 설치를 해야 한다.

        - Import Andriod Studio Settings : 기존 설정 파일이 있는 경우 Import 할 수 있다.

 

    ⑥ 설치한 Android Studio를 실행한다.

 

4. 결과

    ˙ More Actions → SDK Manager

    ˙ 설치된 SDK 버전을 확인한다. 체크박스 설정을 통해 SDK 하위 버전도 사용할 수 있다.

 

반응형
반응형

1.  문제

■ DFS를 이용하여 리스트의 조합(combination)을 구현한다.

 

2. 핵심요약

■ DFS 알고리즘 활용법을 알아보자.

 

3. JavaScript 코딩

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
let arr = [12345];   // 주어진 배열
let result = [];              // 결과를 저장할 배열
let combination = [];         // 현재 조합을 저장할 배열
 
// 깊이 우선 탐색(DFS)을 수행하는 함수
const dfs = (startIndex) => {
    // 종료 조건: 선택된 원소의 개수가 k개가 되면 조합을 결과에 추가
    if (combination.length === 3) { // 예시로 3개 원소를 고르는 조합을 찾는 경우
        result.push([...combination]); // 조합을 결과에 추가
        return;
    }
 
    // startIndex부터 배열의 끝까지 순차적으로 탐색
    for (let i = startIndex; i < arr.length; i++) {
        combination.push(arr[i]);    // 원소를 현재 조합에 추가
        dfs(i + 1);                  // 다음 원소로 이동 (중복을 피하기 위해 i+1로 호출)
        combination.pop();           // 백트래킹: 원소를 제거하고 다른 경우를 시도
    }
}
 
// DFS 탐색 시작
dfs(0);
 
// 결과 출력
console.log(result);
 
cs

 

4. 참고

https://languagestory.tistory.com/380

 

[DFS] 개념(Depth First Search; 깊이 우선 탐색) - 자바스크립트

1. DFS(Depth First Search; 깊이 우선 탐색)의 개념■ 그래프에서 모든 노드를 한번씩 탐색하기 위한 방법■ 스택 또는 재귀함수를 이용하여 구현■ 루트 노드[또는 임의의 노드]에서 시작하여 형제(si

languagestory.tistory.com

 

반응형
반응형

1. BFS(Breadth First Search; 너비 우선 탐색)의 개념

 그래프에서 모든 노드를 한번씩 탐색하기 위한 방법

■ 루트 노드[또는 임의의 노드]에서 시작하여, 형제(sibling) 노드를 탐색한 후, 각 레벨에 있는 노드를 차례대로 탐색하는 방법.

■ Queue를 이용하여 구현

 

2. BFS 노드 방문 순서

■ 결과 : 1 → 2 → 3 → 4 → 7 → 8 → 9 → 5 → 6 → 10

    - step1) 루트 노드에서 시작하여, 같은 레벨에 있는 모든 노드를 탐색하고 큐에 추가한다.

    - step2) 큐에서 하나씩 노드를 꺼내면서 그 노드와 연결된 인접 노드를 탐색하고, 탐색된 노드는 큐에 추가한다.

    - step3) 큐가 빌 때까지 step1과 step2를 반복하며 모든 노드를 탐색한다.

 

3. 그래프 표현

 "그래프"는 "인접 리스트"로 표현하여 보다 이해하기 쉬운 형태로 만들 수 있다.

1 2, 3
2 1, 4
3 1, 7, 8, 9
4 2, 5, 6
5 4
6 4
7 3, 10
8 3
9 3
10  

 

■ "인접 리스트"는 "2차원 배열[리스트]" 또는 "테이블[dictionary]" 자료구조로 코드화 한다.

1
2
3
4
5
6
7
8
9
10
11
12
let graph = []
graph['0'= []         // index 0: 사용하지 않음.
graph['1'= ['2''3']
graph['2'= ['1''4']
graph['3'= ['1''7''8''9']
graph['4'= ['2''5''6']
graph['5'= ['4']
graph['6'= ['4']
graph['7'= ['3''10']
graph['8'= ['3']
graph['9'= ['3']
graph['10'= ['7']
cs

 

4. JavaScript 코딩

- JavaScript로 구현한 Queue 참고: https://languagestory.tistory.com/400

 

큐(Queue) 구현 및 테스트 (JavaScript, Python)

1.  Queue 개념■ 선입선출 (FIFO): 큐에서 데이터는 먼저 들어온 순서대로 출력된다.■ enqueue: 큐에 데이터를 삽입하는 작업■ dequeue: 큐에서 데이터를 제거하는 작업■ Front: 큐의 앞쪽 (데이터가

languagestory.tistory.com

 

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
// 'queue.js' 파일에서 Queue 클래스를 가져옴
const Queue = require('./queue.js');
 
// BFS 알고리즘 구현
const bfs = (graph, currNode, visited) => {
 
    // Queue 인스턴스를 생성하여 사용
    const queue = new Queue();
 
    // 시작 노드를 큐에 추가하고 방문처리
    queue.enqueue(currNode);
    visited[currNode] = true;
 
    // 큐가 비어있지 않으면 계속해서 탐색
    while (queue.getLength() > 0) {         // 큐가 빌 때까지 반복
        const nextNode = queue.dequeue();   // 큐에서 하나의 노드를 꺼냄 (이 노드를 탐색)
        console.log(nextNode);               // 현재 노드를 출력 (탐색한 노드)
 
        // 꺼낸 노드의 인접 노드들을 탐색
        for (const neighborNode of graph[nextNode]) {
            // 방문하지 않은 인접 노드가 있으면 큐에 추가하고 방문처리
            if (!visited[neighborNode]) {
                queue.enqueue(neighborNode);  // 큐에 인접 노드를 추가
                visited[neighborNode] = true// 해당 노드를 방문했다고 표시
            }
        }
    }
}
 
// 그래프의 연결 정보 (인접 리스트 형태로 표현)
const graph = [
    [],                 // 0번 노드: 사용하지 않음
    [234],          // 1번 노드: 2, 3, 4번 노드와 연결
    [1],                // 2번 노드: 1번 노드와 연결
    [156],          // 3번 노드: 1, 5, 6번 노드와 연결
    [17],             // 4번 노드: 1, 7번 노드와 연결
    [38],             // 5번 노드: 3, 8번 노드와 연결
    [3],                // 6번 노드: 3번 노드와 연결
    [4],                // 7번 노드: 4번 노드와 연결
    [5]                 // 8번 노드: 5번 노드와 연결
]
 
// 방문 여부를 체크하는 배열 (그래프 크기만큼 false로 초기화)
const visited = Array(graph.length).fill(false);    
 
// 1번 노드부터 BFS 탐색 시작
bfs(graph, 1, visited);     // 1번 노드부터 BFS 탐색
 
cs

 

반응형
반응형

1.  Queue 개념

■ 선입선출 (FIFO): 큐에서 데이터는 먼저 들어온 순서대로 출력된다.

enqueue: 큐에 데이터를 삽입하는 작업

dequeue: 큐에서 데이터를 제거하는 작업

Front: 큐의 앞쪽 (데이터가 제거되는 곳)

Rear[또는 Tail]: 큐의 뒤쪽 (새로운 데이터가 추가되는 곳)

 

2. 핵심요약

■ BFS (너비 우선 탐색, Breadth-First Search) 알고리즘에서는 Queue 자료구조가 필수적으로 활용된다.

BFS는 그래프나 트리에서 시작 노드에서부터 인접한 노드들을 차례대로 방문하여 탐색을 진행한다.

이때 선입선출(FIFO) 방식이 BFS 탐색의 특성과 잘 맞아떨어지기 때문에 Queue 자료구조를 사용한다.

 

3. JavaScript 코딩

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
// Queue 클래스를 정의
class Queue {
    // 생성자: Queue 클래스 인스턴스를 생성할 때 실행됨
    constructor() {
        this.items = {};        // 데이터를 저장할 객체, index를 키로 사용하여 값들을 저장
        this.headIndex = 0;     // 큐의 앞부분을 나타내는 인덱스
        this.tailIndex = 0;     // 큐의 뒷부분을 나타내는 인덱스
    }
    
    // 큐에 아이템을 추가하는 메소드
    enqueue(item) {
        this.items[this.tailIndex] = item;  // tailIndex 위치에 item을 추가
        this.tailIndex++;                   // tailIndex를 증가시켜 큐의 끝을 업데이트
    }
    
    // 큐에서 아이템을 제거하는 메소드
    dequeue() {
        const item = this.items[this.headIndex];    // headIndex 위치에서 아이템을 가져옴
        delete this.items[this.headIndex];          // 해당 위치의 아이템을 삭제하여 메모리에서 제거
        this.headIndex++;           // headIndex를 증가시켜 큐의 앞부분을 업데이트
        return item;                // 제거된 아이템을 반환
    }
 
    // 큐의 앞부분에 있는 아이템을 반환하는 메소드 (삭제하지 않음)
    peek() {
        return this.items[this.headIndex];         // headIndex 위치의 아이템을 반환
    }
 
    // 큐에 있는 아이템의 개수를 반환하는 메소드
    getLength() {
        return this.tailIndex - this.headIndex;   // 큐에 남아있는 아이템의 개수를 계산
    }
}
 
// Queue 클래스를 외부 모듈로 내보내기
module.exports = Queue;
 
// 큐 인스턴스를 생성
let queue = new Queue();
queue.enqueue(5);       // 큐: 5
queue.enqueue(3);       // 큐: 5, 3
queue.dequeue();        // 큐: 3
queue.enqueue(4);       // 큐: 3, 4
queue.enqueue(1);       // 큐: 3, 4, 1
queue.dequeue();        // 큐: 4, 1
queue.enqueue(7);       // 큐: 4, 1, 7
queue.enqueue(6);       // 큐: 4, 1, 7, 6
queue.dequeue();        // 큐: 1, 7, 6
 
// 큐가 비어있지 않으면 계속해서 dequeue를 통해 큐의 모든 아이템을 출력
while (queue.getLength() > 0) {
    console.log(queue.dequeue());  // 큐의 앞부분 아이템을 출력 후 제거
}
 
cs

 

4. 파이썬 코딩

■ Python에서는 collections.deque를 사용하여 큐 자료구조를 구현할 수 있다.

deque는 **덱(Deque, Double-ended Queue)**을 구현한 자료구조로, 큐와 스택 모두에 효율적으로 사용할 수 있다.

deque는 큐의 앞과 뒤에서 삽입과 삭제가 모두 효율적이기 때문에 큐 구현에 매우 적합하다.

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
from collections import deque
 
class Queue:
    def __init__(self):
        self.items = deque()
 
    def enqueue(self, item):
        self.items.append(item)  # 큐에 아이템 추가 (뒤에 추가)
 
    def dequeue(self):
        if self.get_length() > 0:
            return self.items.popleft()  # 큐에서 아이템 제거 (앞에서 제거)
        return None  # 큐가 비었을 경우 None 반환
 
    def peek(self):
        if self.get_length() > 0:
            return self.items[0]  # 큐의 첫 번째 아이템 확인 (삭제하지 않음)
        return None
 
    def get_length(self):
        return len(self.items)  # 큐의 크기 반환
 
# Test
queue = Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.dequeue()
queue.enqueue(4)
queue.enqueue(5)
queue.enqueue(6)
queue.dequeue()
 
while queue.get_length() > 0:
    print(queue.dequeue())
 
cs

 

반응형
반응형

1.  문제

■ DFS를 이용하여 리스트의 순열을 구현한다.

 

2. 핵심요약

■ DFS 알고리즘 활용법을 알아보자.

 

3. JavaScript 코딩

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
// 주어진 배열 arr과 방문 여부를 추적할 visited 배열을 초기화
let arr = [12345];
let visited = new Array(arr.length).fill(false); // arr 길이만큼 false로 채운 배열 생성
 
let result = []; // 결과를 저장할 배열
 
// 깊이 우선 탐색(DFS)을 수행하는 함수
const dfs = (depth) => {
    // 종료 조건: 모든 원소를 선택했을 때
    if (depth === arr.length) {
        console.log(result); // 결과 배열을 출력
        return result; // 결과 반환
    }
 
    // 배열의 각 원소를 순차적으로 처리
    for (let i = 0; i < arr.length; i++) {
        // 이미 방문한 원소는 건너뜀
        if (visited[i]) continue;
 
        visited[i] = true// 현재 원소를 방문 처리
        result.push(arr[i]); // 결과 배열에 현재 원소 추가
 
        // 재귀적으로 DFS 호출 (다음 깊이로 이동)
        dfs(depth + 1);
 
        // 재귀 호출 후, 백트래킹: 방문을 해제하고, 결과에서 현재 원소를 제거
        visited[i] = false;
        result.pop();
    }
}
 
// DFS 탐색 시작
dfs(0);
 
cs

 

4. 참고

https://languagestory.tistory.com/380

 

[DFS] 개념(Depth First Search; 깊이 우선 탐색) - 자바스크립트

1. DFS(Depth First Search; 깊이 우선 탐색)의 개념■ 그래프에서 모든 노드를 한번씩 탐색하기 위한 방법■ 스택 또는 재귀함수를 이용하여 구현■ 루트 노드[또는 임의의 노드]에서 시작하여 형제(si

languagestory.tistory.com

 

반응형
반응형

1.  문제

■ URL : https://www.acmicpc.net/problem/2667

■ 난이도 : 하 (DFS 기본문제)

 

2. 핵심요약

■ 문제유형 : 깊이우선탐색(DFS) 알고리즘

 

3. 문제풀이 접근

■ 시작점을 기준으로 상/하/좌/우 깊이 탐색 방법을 구현할 수 있어야 한다.

 

4. JavaScript 코딩

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
// 로컬 환경에서 입력을 받을지, stdin에서 받을지 결정하는 변수
let isLocal = true;
 
let fs = require('fs'); // 파일 시스템 모듈을 사용하여 파일 읽기
let input;
 
// 로컬 환경일 경우 파일에서 입력을 읽어옴, 그렇지 않으면 stdin에서 읽어옴
if (isLocal) {
    input = fs.readFileSync('./2667.txt').toString().split('\n'); // 파일에서 입력 받기
else {
    input = fs.readFileSync('/dev/stdin').toString().split('\n'); // stdin에서 입력 받기
}
 
// 첫 번째 줄: 집합의 크기(size) 입력 받기
let size = Number(input[0]); // size: 지도(그래프)의 크기 (N x N)
 
// 그래프 초기화: 각 셀을 1 또는 0으로 나타내는 지도 배열
let graph = [];
for (let i = 1; i <= size; i++) {
    /*
    input[i]: input 배열에서 i번째 요소를 가져온다. 이 요소는 문자열.
    split(''): 문자열을 각 문자(또는 char) 단위로 쪼갠 후 배열로 변환.
    예를 들어, "123"은 ['1', '2', '3'] 배열로 변환.
    map(Number): 배열의 각 요소들을 map()을 사용하여 Number로 변환.
    */
    graph.push(input[i].split('').map(Number)); // 각 줄을 숫자로 변환하여 그래프에 추가
}
 
// 깊이 우선 탐색(DFS) 함수 정의
const dfs = (graph, i, j) => {
    // 주어진 좌표(i, j)가 그래프의 범위를 벗어나면 종료
    if (i < 0 || i >= size || j < 0 || j >= size) return false;
 
    // 현재 위치가 0인 경우(빈 집이거나 이미 방문한 곳)라면 종료
    if (!graph[i][j]) return false;
 
    // 현재 위치를 방문 처리 (1 -> 0으로 변경)
    graph[i][j] = 0;
    complexSize += 1// 복잡한 구역의 크기 증가
 
    // 상, 하, 좌, 우로 인접한 집들을 방문
    dfs(graph, i-1, j, complexSize);    // 상
    dfs(graph, i+1, j, complexSize);    // 하
    dfs(graph, i, j-1, complexSize);    // 좌
    dfs(graph, i, j+1, complexSize);    // 우
 
    return true// 새로운 단지 발견
}
 
// 단지 크기를 저장할 배열
let answer = [];
let complexSize; // 단지 크기 변수
 
// 모든 지점에 대해 DFS 수행
for (let i = 0; i < size; i++) {
    for (let j = 0; j < size; j++) {
        complexSize = 0// 각 단지를 탐색할 때마다 크기 초기화
        // 만약 DFS 탐색을 통해 단지가 발견되면 (현재 위치가 1인 경우)
        if (dfs(graph, i, j)) {
            answer.push(complexSize); // 해당 단지 크기 기록
        }
    }
}
 
// 단지 크기를 오름차순으로 정렬
answer.sort((a, b) => a - b);
 
// 결과 출력
console.log(answer.length + "\n" + answer.join("\n")); // 단지의 개수와 각 단지의 크기 출력
 
cs

 

5. 참고

https://languagestory.tistory.com/380

 

[DFS] 개념(Depth First Search; 깊이 우선 탐색) - 자바스크립트

1. DFS(Depth First Search; 깊이 우선 탐색)의 개념■ 그래프에서 모든 노드를 한번씩 탐색하기 위한 방법■ 스택 또는 재귀함수를 이용하여 구현■ 루트 노드[또는 임의의 노드]에서 시작하여 형제(si

languagestory.tistory.com

 

반응형

+ Recent posts