반응형

1. 시험환경

    · Python v3.10

    · AWS Lambda

 

2. 목적

    · AWS Lambda 서비스에서 파이썬 사용시 필요한 라이브러리를 등록하는 방법을 알아보자.

    · AWS Lambda 서비스에서 계층추가하는 방법을 알아보자.

 

3. 적용

    ① 패키지 설치 디렉토리를 준비하고 해당 디렉토리로 이동한다.

        - 디렉토리 : lambda-layer/python

 

    ② pip를 사용하여 필요한 라이브러리를 설치한다.

        - 중요: --target 옵션을 사용해 특정 디렉토리에 설치한다.

        - 명령어: pip install [패키지] -t .

 

    ③ AWS Lambda가 사용하는 구조 준비 Lambda에서 Layer로 추가하기 위해 압축 파일 구조를 구성한다.

        - 디렉토리: python/설치패키지파일들

       - 명령어: zip -r [패키지명]_layer.zip python


    ④ AWS Lambda 서비스의 "계층" 메뉴에서 "계층 생성" 버튼을 클릭한다.

 

    ⑤ 계층 구성 정보와 패키지 압축파일을 업로드한다.

 

    ⑥ AWS Lambda 계층(Layer)에 등록한 패키지 파일 목록을 확인한다.

 

    ⑦ Lambda 함수의 "코드" 탭에 위치한 "계층"영역에서 "Add a layer" 버튼을 클릭하여 라이브러리를 추가한다.

 

4. 결과

    · Lambda 함수의 계층에 추가된 것을 확인한다. 람다 함수 실행시 특정 패키지가 없어서 발생하는 문제는 해결된다.

        - ImportError: No module named [패키지명]

 

 

 

반응형
반응형

1. 시험환경

    · node.js v22, v20, v18

    · npm

    · create-react-app

    · 윈도우

 

2. 목적

    · 리액트 프로젝트 생성(npm create-react-app) 중 발생하는 에러를 해결한다.

    ·  react@19.0.0과 @testing-library/react@13.4.0 간 버전 충돌 회피 방법을 알아보자.

 

3. 적용

    ① npm 명령어를 이용하여 react 프로젝트 생성시 버전 충돌관련 에러가 발생한다.

        - 명령어 : npm  create-react-app  [my-app]   --template  typescript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error
npm error While resolving: notifyapp@0.1.0
npm error Found: react@19.0.0
npm error node_modules/react
npm error   react@"^19.0.0" from the root project
npm error
npm error Could not resolve dependency:
npm error peer react@"^18.0.0" from @testing-library/react@13.4.0
npm error node_modules/@testing-library/react
npm error   @testing-library/react@"^13.0.0" from the root project
npm error
npm error Fix the upstream dependency conflict, or retry
npm error this command with --force or --legacy-peer-deps
npm error to accept an incorrect (and potentially broken) dependency resolution.
npm error
npm error
cs

 

    ② 에러의 원인은 create-react-app에서 react 버전이 v19로 설정되지만,  @testing-library는 v18를 요구한다.

        - node.js 버전과 상관없이 발생한다. (node v22, node v20, node v18)


 

    ③ 해결책) 패키지간 버전 관리가 불안정한 npm을 사용하는 대신 yarn을 이용하여 React 프로젝트를 생성하자.

        - 명령어 : yarn  create  react-app  [my-app]  --template  typescript

        - yarn으로 프로젝트 생성 시 패키지 간 버전 호환성에 맞게 설정되는 것을 확인할 수 있다.

 

4. 결과

    · 실행결과를 확인한다.

        - 명령어: yarn  start

 

반응형
반응형

1.  Queue 개념

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

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

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

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

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

 

2. 핵심요약

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

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

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

 

3. JavaScript 코딩

■ JavaScript에서는 기본적으로 Queue를 위한 내장 함수나 클래스는 제공되지 않는다.

JavaScript에서 Queue는 배열(Array)을 이용하여 구현할 수 있다.

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
class Queue {
    constructor() {
        this.items = [];
        this.headIndex = 0;
        this.tailIndex = 0;
    }
 
    enque(item) {
        this.items[this.tailIndex] = item;
        this.tailIndex++;
    }
 
    deque() {
        const item = this.items[this.headIndex];
        delete this.items[this.headIndex];
        this.headIndex++;
        return item;
    }
 
    peek() {
        return this.items[this.headIndex];
    }
 
    getLength() {
        return this.tailIndex - this.headIndex;
    }
}
 
// Test
let queue = new Queue();
queue.enque(1);
queue.enque(2);
queue.enque(3);
queue.deque();
queue.enque(4);
queue.enque(5);
queue.enque(6);
queue.deque();
 
while (queue.getLength() > 0) {
    console.log(queue.deque());
}
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. 시험환경

    · github

    · git

 

2. 목적

    · github 등록/관리 없이 개발중인 프로젝트를 github에 등록하여 관리하는 방법을 알아보자.

 

3. 적용

    ① github에 로그인하여 신규(new) repository를 생성한다.

 

    ② Local PC에서 신규 프로젝트 폴더를 생성한다.

 

    ③ Local PC에서 생성한 신규 프로젝트 폴더 위치에서 원격 Repository를 복제한다.

        - 명령어 : > git clone [github-repository-uri] .

 

    ④ "개발 진행중인 프로젝트 파일"을 "신규 프로젝트 폴더"로 복사한다.

 

    ⑤ 복사한 파일들을 원격 Repository에 등록한다.

        - 명령어 : > git add .

        - 명령어 : > git commit -m "initial commit"

        - 명령어 : > git push

 

4. 결과

    · 원격저장소에 프로젝트 파일들이 등록되었음을 확인한다.

 

반응형
반응형

1. 시험환경

    · 윈도우

    · 파이썬

    · vsCode

 

2. 목적

    · 파이썬 개발환경에서 가상환경 초기화 하는 방법을 알아보자.

    · 가상환경 활성화/비활성화 방법을 알아보자.

    · 가상환경에서 설치한 패키지를 리스트 목록으로 저장한다.

 

3. 적용

    ① 가상환경 생성

        - 명령어 : python -m venv [가상환경이름]

가상환경 초기화
가상환경 폴더 생성

 

    ② 가상환경 활성화/비활성화 명령어를 실행한다.

        - 활성화 명령어 : ./[가상환경이름]/Scripts/activate.bat

        - 비활성화 명령어 : ./[가상환경이름]/Scripts/deactivate.bat

 

    ③ 설치된 패키지 목록을 txt 파일로 저장한다.

        -  명령어 : pip freeze > requirements.txt

프로젝트에 필요한 패키지 설치 후 패키지 목록 저장
패키지 목록 저장 결과

 

    ④ 패키지 목록이 저장된 txt파일은 다른 프로젝트에서 동일한 패키지/버전으로 복원할 수 있다.

        -  명령어 : pip install -r requirements.txt

반응형
반응형

1. 시험환경

    · wordpress(워드프레스)

    · python(파이썬)

 

2. 목적

    · 워드프레스에 글을 자동으로 포스팅하기 위한 파이썬 프로그램을 작성한다.

    · 글 자동 발행을 위한 워드프레스 설정을 알아보자.

 

3. 적용

    ① LocalPC 설치 또는 호스팅 업체를 통한 설치 등 워드프레스가 설치되어 있어야 한다.

        - LocalPC 설치 참고: https://languagestory.tistory.com/327

 

Docker 기반 워드프레스 초기 설치

1. 시험환경    ˙ 윈도우 11    ˙ MySQL 5.7    ˙ Docker, Docker-Compose 2. 목적    ˙ 도커, 도커컴포즈 기반으로 워드프레스를 설치한다.    ˙ DB 및 Wordpress 데이터를 로컬 드라이브에 별도로 저장한

languagestory.tistory.com

 

    ② 워드프레스 설치시 입력한 관리자 계정으로 로그인하여 관리자 대시보드에 접속한다.

        - https://<<워드프레스주소>>/wp-admin

 

    ③ 관리자 대시보드 → [설정]    [고유주소]  → "글 이름"으로 변경한다.

 

    ④ 브라우저 또는 Postman 등에서 URL 호출 하면, 반드시 JSON 형식의 매우 복잡한 데이터가 응답되어야 한다.

        - http://<<워드프레스 주소>>/wp-json/wp/v2/posts

 

 

    ⑤ 글 발행을 위한 파이썬 프로그램을 작성 후 실행한다.

        - WP_URL : 본인의 워드프레스 URL주소(443포트인 경우 https, 그 외의 경우 https)

        - WP_USER : 워드프레스 사용자 ID

        - WP_PASSWORD : 워드프레스 사용자 PW

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
import requests
from requests.auth import HTTPBasicAuth
 
# 워드프레스 API 설정
WP_URL = "http://<<워드프레스주소>>/wp-json/wp/v2/posts"  # 워드프레스 REST API URL
WP_USER = "<<wordpress-user-id>>"   # 워드프레스 사용자 이름
WP_PASSWORD = "<<wordpress-user-pw>>"  # 애플리케이션 비밀번호
 
def create_post(title, content, categories=None, tags=None, status="publish"):
    """
    워드프레스에 게시글을 작성하는 함수.
    
    :param title: 게시글 제목
    :param content: 게시글 내용 (HTML 지원)
    :param categories: 카테고리 ID 리스트 (선택 사항)
    :param tags: 태그 ID 리스트 (선택 사항)
    :param status: 게시글 상태 ("publish", "draft" 등)
    :return: API 응답 데이터
    """
    headers = {
        "Content-Type""application/json"
    }
 
    data = {
        "title": title,
        "content": content,
        "status": status,
    }
    
    if categories:
        data["categories"= categories
    if tags:
        data["tags"= tags
 
    response = requests.post(
        WP_URL,
        headers=headers,
        json=data,
        auth=HTTPBasicAuth(WP_USER, WP_PASSWORD)
    )
 
    if response.status_code in [200201]:
        print("게시글이 성공적으로 작성되었습니다!")
        return response.json()
    else:
        print(f"오류 발생: {response.status_code}")
        print(response.json())
        return None
 
 
# 게시글 작성
if __name__ == "__main__":
    title = "테스트 게시글 제목"
    content = "<p>이것은 테스트 게시글의 내용입니다.</p>"
    
    # 카테고리와 태그 ID는 워드프레스 관리 패널에서 확인 가능
    categories = [1]  # 예: "뉴스" 카테고리
    tags = [35]     # 예: "Python", "자동화" 태그
 
    post_response = create_post(title, content, categories, tags)
    if post_response:
        print("게시글 URL:", post_response.get("link"))
 
cs

 

4. 결과

    · 파이썬 프로그램을 통해 포스팅이 작성된 것을 확인한다.

 

 

 

반응형
반응형

1. DFS(Depth First Search; 깊이 우선 탐색)의 개념

■ 루트 노드[또는 임의의 노드]에서 시작하여 형제 (sibling) 노드로 넘어가기 전에 시작한 분기의 마지막 노드까지 깊게 탐색하는 방법

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

■ 스택 또는 재귀함수를 이용하여 구현

 

2. DFS 노드 방문 순서

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

    - 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] 자료구조로 정의할 수 있다.

 

4. 파이썬 코딩

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
def dfs(graph, start, visited = []):
    visited.append(start)
 
    for node in graph[start]:
        if node not in visited:
            dfs(graph, node, visited)
 
    return visited
 
 
if __name__ == '__main__':
    graph = dict() 
    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']
 
    result = dfs(graph, '1')
    print(result)
cs

 

5. 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
function dfs(graph, v, visited = []) {
    
    visited[v] = true;
    console.log(v);
  
    for (let node of graph[v]) {
      if (!visited[node]) {
        dfs(graph, node, visited);
      }
    }
  }
 
 
graph = []
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']
 
result = dfs(graph, '1')
console.log(result)
cs

 

 

반응형

'알고리즘(코딩테스트)' 카테고리의 다른 글

큐(Queue) 구현 및 테스트 (JavaScript, Python)  (0) 2025.01.06
[백준] 주유소  (0) 2024.10.05
[백준] 수들의 합  (0) 2024.10.05
[백준] 설탕 배달  (0) 2024.10.04
[백준] 읽어버린 괄호  (0) 2024.10.04
반응형

1.  문제

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

 

2. 핵심요약

■ 문제유형 : 탐욕(Greedy) 알고리즘

■ 1번째 Row: 도시의 개수를 나타내는 정수 

■ 2번째 Row: 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1개의 자연수로 구성

■ 3번째 Row: 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수로 구성

 

3. 문제풀이 접근

■ 첫번째 도시에서는 가격에 상관없이 주유를 할 수밖에 없다.

■ 두번째 도시부터는 다음(오른쪽) 도시들의 가격과 비교하여 미리 주유 여부를 결정한다.

 

4. 파이썬 코딩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
isTest = True
if isTest:
    f = open("./13305.txt"'r')
    city_cnt = int(f.readline())
    distArr = list(map(int, f.readline().split(' ')))
    priceArr = list(map(int, f.readline().split(' ')))
else:
    city_cnt = int(input())
    distArr = list(map(int, input().split(' ')))
    priceArr = list(map(int, input().split(' ')))
 
sum = 0
minPrice = priceArr[0]
for i in range(len(priceArr) - 1):
  if minPrice > priceArr[i]:
    minPrice = priceArr[i]
 
  sum += minPrice * distArr[i]
 
print(sum)
cs

 

5. 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
let isTest = true
 
let fs = require('fs');
let input;
if (isTest) {
    input = fs.readFileSync('./13305.txt').toString().split('\n');
else {
    input = fs.readFileSync('/dev/stdin').toString().split('\n');
}
 
city_count = parseInt(input[0]);
distArr = input[1].split(' ').map(Number);
priceArr = input[2].split(' ').map(Number).slice(0, city_count - 1);
 
let sum = BigInt(0);
let minPrice = priceArr[0];
for (let i = 0; i < priceArr.length; i++) {
  if (minPrice > priceArr[i]) {
    minPrice = priceArr[i];
  }
  sum += BigInt(minPrice) * BigInt(distArr[i]);
}
 
console.log(String(sum));
 
cs

 

반응형

+ Recent posts