<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>minjoottyDev.log</title>
        <link>https://velog.io/</link>
        <description>develop with JOOTT</description>
        <lastBuildDate>Mon, 26 Feb 2024 13:34:13 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>minjoottyDev.log</title>
            <url>https://velog.velcdn.com/images/minjoott_dev/profile/633d9c97-bd1e-4a07-8eb4-a50105bfb02f/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. minjoottyDev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/minjoott_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[BOJ] 10773번 : 제로 (java)]]></title>
            <link>https://velog.io/@minjoott_dev/10773</link>
            <guid>https://velog.io/@minjoott_dev/10773</guid>
            <pubDate>Mon, 26 Feb 2024 13:34:13 GMT</pubDate>
            <description><![CDATA[<h1 id="boj-10773번--제로"><a href="https://www.acmicpc.net/problem/10773">[BOJ] 10773번 : 제로</a></h1>
<br>


<h2 id="📌-풀이">📌 풀이</h2>
<hr>
<h4 id="📍-문제-이해--구현에-필요한-자료구조">📍 문제 이해 &amp; 구현에 필요한 자료구조</h4>
<p>재현이는 잘못된 수를 부를 때마다 0을 외쳐서, <u>가장 최근에 재민이가 쓴 수를 지우게 시킨다.</u>
➡️ 재현이가 가장 최근에 재민이가 쓴 수를 지우는 과정은 <strong>후입선출(LIFO, Last-In-First-Out)</strong> 원칙을 따르고 있으므로, <strong>스택</strong> 자료구조를 사용해 문제를 해결한다.</p>
<br>

<h4 id="📍-구현-단계">📍 구현 단계</h4>
<ol>
<li>K개의 숫자를 입력받아 stack 자료구조에 저장한다.
1-1. 만약 0을 입력받으면, stack의 top에 있는 숫자를 삭제시킨다.</li>
<li>stack에 담긴 모든 원소의 합을 구한다. </li>
</ol>
<br>


<h2 id="📌-문제-해결">📌 문제 해결</h2>
<hr>
<h4 id="📍-기댓값과-다른-결괏값">📍 기댓값과 다른 결괏값</h4>
<pre><code class="language-java">package ch05_Stack;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class p10773 {

    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int K = Integer.valueOf(br.readLine());

        Stack&lt;Integer&gt; stack = new Stack&lt;&gt;();

        for (int i = 0; i &lt; K; i++) {
            int input = Integer.valueOf(br.readLine());

            if (input == 0) {
                stack.pop();
                continue;
            }

            stack.add(input);
        }

        int sum = 0;
        for (int i = 0; i &lt; stack.size(); i++) {
            sum += stack.pop();
        }

        System.out.println(sum);

    }

}</code></pre>
<p><strong>문제 원인</strong></p>
<p>아래 코드대로 구현할 시 스택의 크기가 반복될 때마다 변경되고, 예상치 못한 결과가 발생할 수 있다.</p>
<pre><code class="language-java">int sum = 0;
for (int i = 0; i &lt; stack.size(); i++) {
            sum += stack.pop();
}</code></pre>
<p><strong>수정한 코드</strong></p>
<pre><code class="language-java">int sum = 0;
while(!stack.isEmpty()) {
            sum += stack.pop();
}</code></pre>
<blockquote>
<p><strong><u>stack.size() 대신에 stack.isEmpty() 메서드를 사용</u>하여 스택이 비어 있는지 확인해 반복문을 돈다.</strong></p>
</blockquote>
<br>

<h2 id="📌-최종-코드">📌 최종 코드</h2>
<hr>
<pre><code class="language-java">package ch05_Stack;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class p10773 {

    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int K = Integer.valueOf(br.readLine());

        Stack&lt;Integer&gt; stack = new Stack&lt;&gt;();

        for (int i = 0; i &lt; K; i++) {
            int input = Integer.valueOf(br.readLine());

            if (input == 0) {
                stack.pop();
                continue;
            }

            stack.add(input);
        }

        int sum = 0;
        while(!stack.isEmpty()) {
            sum += stack.pop();
        }

        System.out.println(sum);

    }
}</code></pre>
<br>

<h2 id="📌-참고">📌 참고</h2>
<hr>
<p>📍 자바의 int 데이터 타입은 32비트를 사용하며, 부호 비트를 포함하여 31비트의 값을 저장한다. 따라서 int형은 2의 31승의 범위를 표현할 수 있다. </p>
<p>📍 스택 STL 함수 </p>
<ul>
<li>stack.add(x)</li>
<li>stack.pop()</li>
<li>stack.size() : 스택에 포함된 요소의 개수를 반환</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 2579번 : 계단 오르기 (java)]]></title>
            <link>https://velog.io/@minjoott_dev/BOJ-2579%EB%B2%88-%EA%B3%84%EB%8B%A8-%EC%98%A4%EB%A5%B4%EA%B8%B0-java</link>
            <guid>https://velog.io/@minjoott_dev/BOJ-2579%EB%B2%88-%EA%B3%84%EB%8B%A8-%EC%98%A4%EB%A5%B4%EA%B8%B0-java</guid>
            <pubDate>Thu, 04 Jan 2024 10:29:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minjoott_dev/post/6ea8e9f7-8144-46b1-826e-64c181c5a328/image.png" alt=""></p>
<h1 id="백준-2579번-계단-오르기"><a href="https://www.acmicpc.net/problem/2579">백준 2579번 계단 오르기</a></h1>
</br>

<h2 id="✍️-문제-풀이">✍️ 문제 풀이</h2>
<hr>
<ul>
<li>접근 방법<ul>
<li><strong><code>DP(Dynamic Progmamming)</code></strong></li>
<li><strong><code>Bottom-Up</code></strong></li>
</ul>
</li>
</ul>
<ol>
<li>테이블 정의하기
D[i][j] = 현재까지 j개의 계단을 연속해서 밟고 i번째 계단까지 올라섰을 때 점수 합의 최댓값, 단 i번째 계단은 반드시 밟아야 함</li>
</ol>
<ol start="2">
<li>점화식 찾기
<img src="https://velog.velcdn.com/images/minjoott_dev/post/57d2c48e-4b26-477f-ba2c-bdbf9202f9ef/image.png" alt=""></li>
</ol>
<ol start="3">
<li>초기값 세팅
<img src="https://velog.velcdn.com/images/minjoott_dev/post/7927806b-572a-4c00-bbb7-0ed9f0c47892/image.png" alt=""></li>
</ol>
<p>참고 자료
<a href="https://blog.encrypted.gg/974">https://blog.encrypted.gg/974</a></p>
</br>

<h2 id="💻-java-구현-코드">💻 java 구현 코드</h2>
<pre><code class="language-java">package ch10_DynamicProgramming;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class p2579 {

    public static void main(String[] args) throws IOException {

        Scanner scanner = new Scanner(System.in);

        int N = scanner.nextInt();

        int[] score = new int[N + 1];  // 각 계단에서 얻을 수 있는 점수
        int[][] dp = new int[N + 1][3];  // DP테이블 (각 계단까지 올라갔을 때 얻을 수 있는 점수의 최댓값)

        // score 배열 값 세팅
        for (int i = 1; i &lt;= N; i++) {
            score[i] = scanner.nextInt();
        }

        // 예외 처리
        if (N == 1) {
            System.out.println(score[1]);
            return;
        }

        // 초기값 세팅
        dp[1][1] = score[1]; dp[1][2] = 0;
        dp[2][1] = score[2]; dp[2][2] = dp[1][1] + score[2];

        // DP테이블 값 세팅
        for (int i = 3; i &lt;= N; i++) {
            dp[i][1] = Math.max(dp[i - 2][1], dp[i - 2][2]) + score[i];
            dp[i][2] = dp[i - 1][1] + score[i];
        }

        System.out.println(Math.max(dp[N][1], dp[N][2]));
    }
}</code></pre>
</br>

<h2 id="💡-문제-해결">💡 문제 해결</h2>
<p>❗️ <strong>런타임 에러</strong></p>
<pre><code class="language-java">package ch10_DynamicProgramming;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class p2579 {

    public static void main(String[] args) throws IOException {

        Scanner scanner = new Scanner(System.in);

        int N = scanner.nextInt();

        int[] score = new int[N + 1];  // 각 계단에서 얻을 수 있는 점수
        int[][] dp = new int[N + 1][3];  // DP테이블 (각 계단까지 올라갔을 때 얻을 수 있는 점수의 최댓값)

        // score 배열 값 세팅
        for (int i = 1; i &lt;= N; i++) {
            score[i] = scanner.nextInt();
        }

        // 초기값 세팅
        dp[1][1] = score[1]; dp[1][2] = 0;
        dp[2][1] = score[2]; dp[2][2] = dp[1][1] + score[2];

        // DP테이블 값 세팅
        for (int i = 3; i &lt;= N; i++) {
            dp[i][1] = Math.max(dp[i - 2][1], dp[i - 2][2]) + score[i];
            dp[i][2] = dp[i - 1][1] + score[i];
        }
        System.out.println(Math.max(dp[N][1], dp[N][2]));
    }
}</code></pre>
<p>N의 값으로 1이 입력될 수 있는데, 이에 대한 예외처리 없이 
<code>dp[2][1] = score[2]; dp[2][2] = dp[1][1] + score[2];</code> 라인을 무조건 수행하도록 코드를 작성해서 런타임 에러가 발생하였다.</p>
<p>아래 코드를 추가해줌으로써 해당 에러를 해결하였다.</p>
<pre><code class="language-java">    // 예외 처리
        if (N == 1) {
            System.out.println(score[1]);
            return;
        }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1463번 : 1로 만들기 (java) ]]></title>
            <link>https://velog.io/@minjoott_dev/BOJ-1463%EB%B2%88-1%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@minjoott_dev/BOJ-1463%EB%B2%88-1%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 03 Jan 2024 08:28:03 GMT</pubDate>
            <description><![CDATA[<h1 id="백준-1463번--1로-만들기"><a href="https://www.acmicpc.net/problem/1463">백준 1463번 : 1로 만들기</a></h1>
<h2 id="✍️-문제-풀이">✍️ 문제 풀이</h2>
<hr>
<ul>
<li>접근법</li>
<li><em><code>DP(Dynamic Programming)</code>
<code>Bottom-Up</code> *</em> vs <strong><code>Top-Down</code>
<code>재귀</code></strong></li>
</ul>
</br>

<h2 id="💻-java-구현-코드">💻 java 구현 코드</h2>
<hr>
<h3 id="📍-bottom-up">📍 Bottom-Up</h3>
<p><u>반복문</u>을 사용하여 DP테이블(각 숫자를 1로 만드는데 필요한 최소 연산 횟수를 저장) 값을 1부터 N까지 차례대로 완성시킨다.</p>
<pre><code class="language-java">package ch10_DynamicProgramming;

import java.util.Scanner;

public class p1463 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();

        int[] dp = new int[N + 1];  // DP테이블 (각 숫자를 1로 만드는데 필요한 최소 연산 횟수)

        dp[1] = 0;  // 초기값 세팅 

        for (int i = 2; i &lt;= N; i++) {

            int val1 = N; int val2 = N; 

            if (i % 3 == 0) val1 = dp[i / 3] + 1;  // 3으로 나누어 떨어지면, 3으로 나누기
            if (i % 2 == 0) val2 = dp[i / 2] + 1;  // 2로 나누어 떨어지면, 2로 나누기
            int val3 = dp[i - 1] + 1;  // 1 빼기

            dp[i] = Math.min(val1, Math.min(val2, val3));
        }
        System.out.println(dp[N]);
    }
}</code></pre>
</br>

<h3 id="📍-top-down">📍 Top-Down</h3>
<p><u>재귀</u>를 사용하여 구현 </p>
<pre><code class="language-java">package ch10_DynamicProgramming;

import java.util.Scanner;

public class p1463 {

    static Integer[] dp;  // DP테이블 (각 숫자를 1로 만드는데 필요한 최소 연산 횟수)

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();

        dp = new Integer[N + 1];
        dp[0] = dp[1] = 0;  // 초기값 세팅

        if (N == 1)
            System.out.println(0);
        else
            System.out.println(cal(N));
    }

    static int cal(int N) {

        if (dp[N] == null) {  // 값이 구해져있지 않으면
            if (N % 6 == 0)  // 6으로 나눠지면
                dp[N] = Math.min(cal(N / 3), Math.min(cal(N / 2), cal(N - 1))) + 1;
            else if (N % 3 == 0)  // 3으로 나눠지면
                dp[N] = Math.min(cal(N / 3), cal(N - 1)) + 1;
            else if (N % 2 == 0)  // 2로 나눠지면 
                dp[N] = Math.min(cal(N / 2), cal(N - 1)) + 1;
            else  //2와 3으로 나누어지지 않으면
                dp[N] = cal(N - 1) + 1;
        }

        return dp[N];
    }
}</code></pre>
</br>

<h2 id="💡-문제-해결">💡 문제 해결</h2>
<hr>
<p>💢 <strong>예상과 다른 출력값</strong>
계속 원하는 출력값이 나오지 않는 상황이 반복되었다. 코드를 아무리 봐도 문제가 없는 것 같아 보여서 결국 GPT한테 도움을 요청했더니,,, 정말 허무하게도 <code>%</code> 연산자 대신 <code>/</code> 연산자를 사용하여 발생한 문제였다.ㅎ 
 이런 실수 한 번 하면 다음부턴 주의해서 사용하게 되어서 시간 낭비했다고 생각하지 않으려고 한다. 👍
</br></p>
<p>🧷 <strong>null값 활용</strong></p>
<blockquote>
<p>Java에서 Integer 객체 배열을 생성하면 기본적으로 각 요소는 <span style="color:red"><strong>null</strong></span>로 초기화된다. Integer 클래스의 객체 배열이므로 객체 자체가 null로 초기화되기 때문이다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 10026번 : 적록색약 문제풀이 (java)]]></title>
            <link>https://velog.io/@minjoott_dev/BOJ-10026%EB%B2%88-%EC%A0%81%EB%A1%9D%EC%83%89%EC%95%BD-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</link>
            <guid>https://velog.io/@minjoott_dev/BOJ-10026%EB%B2%88-%EC%A0%81%EB%A1%9D%EC%83%89%EC%95%BD-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</guid>
            <pubDate>Mon, 01 Jan 2024 02:18:04 GMT</pubDate>
            <description><![CDATA[<h1 id="백준-10026번--적록색약"><a href="https://www.acmicpc.net/problem/10026">백준 10026번 : 적록색약</a></h1>
<hr>
<h3 id="문제풀이">문제풀이</h3>
<ul>
<li><p>접근법 : BFS</p>
</li>
<li><p>풀이과정</p>
<ol>
<li>그림 배열을 전체 순회하면서, 아직 방문하지 않은 구역을 시작점으로 설정하고, 인접한 구역 중에서 해당 구역의 색깔과 동일한 구역을 계속해서 큐에 넣으면서 BFS를 수행한다. 
⇒ 적록색약이 아닌 사람이 보는 구역의 개수 구하기</li>
<li>만약 적록색약 확인용으로도 방문하지 않은 구역이고 빨간색 또는 초록색이면, 해당 구역을 시작점으로 설정하고 인접한 빨간색 또는 초록색 구역을 계속해서 큐에 넣으면서 BFS를 수행한다. 
⇒ 적록색약인 사람이 보는 구역의 개수 구하기</li>
</ol>
</li>
</ul>
<hr>
<h3 id="java-구현-코드">java 구현 코드</h3>
<pre><code class="language-java">package ch08_BFS;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class p10026 {

    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.valueOf(br.readLine());

        int[] dx = {1,0,-1,0};
        int[] dy = {0,1,0,-1};

        char[][] picture = new char[N][N];  // 그림 배열
        boolean[][] visited = new boolean[N][N];  // 적록색약 X 방문 여부 표시 배열
        boolean[][] visited_RG = new boolean[N][N];  // 적록색약 O 방문 여부 표시 배열

        Queue&lt;Point&gt; queue = new LinkedList&lt;&gt;();  // 큐 생성

        int count = 0;  // 적록색약 X 구역의 개수
        int RG = 0;  // 적록색약 O 구역의 개수 
        int B = 0;  // B의 개수 


        /*
         * 그림 배열 값 세팅
         */
        for (int i = 0; i &lt; N; i++) {
            String input = br.readLine();
            for (int j = 0; j &lt; N; j++) {
                picture[i][j] = input.charAt(j);
            }
        }

        /*
         * 그림 배열 전체 순회하면서, 방문하지 않은 구역을 시작점으로 BFS 수행
         */
        for (int i = 0; i &lt; N; i++) {
            for (int j = 0; j &lt; N; j++) {
                /*
                 * 적록색약 X에 대한 BFS
                 */
                if (visited[i][j] == true) continue;  // 방문 여부 검증 
                queue.add(new Point(i, j));  // enqueue
                visited[i][j] = true;  // 방문 표시
                count++;

                char color = picture[i][j];  // 시작점의 색깔 color 
                if (color == &#39;B&#39;) B++;

                while (!queue.isEmpty()) {
                    Point dequeue = queue.remove();  // dequeue

                    for (int d = 0; d &lt; 4; d++) {
                        int dX = dequeue.X + dx[d];
                        int dY = dequeue.Y + dy[d];

                        if (dX &lt; 0 || dX &gt;= N || dY &lt; 0 || dY &gt;= N || visited[dX][dY] == true) continue;  // 좌표 유효성 검증, 방문 여부 검증 
                        if (picture[dX][dY] != color) continue;  // 시작점의 색깔과 비교
                        queue.add(new Point(dX, dY));  // enqueue
                        visited[dX][dY] = true;  // 방문 표시
                    }
                }

                /*
                 * 적록색약 O에 대한 BFS
                 */
                if (visited_RG[i][j] == true || picture[i][j] == &#39;B&#39;) continue;  // 방문 여부, 색깔 검증 
                queue.add(new Point(i, j));  // enqueue
                visited_RG[i][j] = true;  // 방문 표시
                RG++;

                while (!queue.isEmpty()) {
                    Point dequeue = queue.remove();  // dequeue

                    for (int d = 0; d &lt; 4; d++) {
                        int dX = dequeue.X + dx[d];
                        int dY = dequeue.Y + dy[d];

                        if (dX &lt; 0 || dX &gt;= N || dY &lt; 0 || dY &gt;= N || visited_RG[dX][dY] == true) continue;  // 좌표 유효성 검증, 방문 여부 검증 
                        if (picture[dX][dY] == &#39;B&#39;) continue;  // 시작점의 색깔과 비교
                        queue.add(new Point(dX, dY));  // enqueue
                        visited_RG[dX][dY] = true;  // 방문 표시
                    }
                }
            }
        }
        System.out.println(count + &quot; &quot; + (RG + B));
    }
}

class Point {
    int X;
    int Y;

    Point(int X, int Y) {
        this.X = X;
        this.Y = Y;
    }
}
</code></pre>
<hr>
<h4 id="comment">comment</h4>
<ul>
<li>풀이 날짜 : 2312어느날, 240101</li>
</ul>
<p>저번에 풀었다가 해결 못한 문제를 오늘 끝내 해결했다.
2024년에 처음으로 해결한 문제다. 2024년 시작이 좋다! 🍀</p>
<h4 id="2024년-2월-6일-복습-코드">2024년 2월 6일 복습 코드</h4>
<pre><code class="language-java">package review;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class p1926 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int n = Integer.valueOf(st.nextToken());  // 세로
        int m = Integer.valueOf(st.nextToken());  // 가로

        int[][] picture = new int[n][m];

        for (int i = 0; i &lt; n; i++) {
            st = new StringTokenizer(br.readLine());

            for (int j = 0; j &lt; m; j++) {
                picture[i][j] = Integer.valueOf(st.nextToken());
            }
        }

        int[] dx = {0, 0, -1, 1};
        int[] dy = {1, -1, 0, 0};

        int count = 0;
        int maxSize = 0;

        boolean visited[][] = new boolean[n][m];
        Queue&lt;Point&gt; queue = new LinkedList&lt;&gt;();

        for (int i = 0 ; i &lt; n; i++) {
            for (int j = 0; j &lt; m; j++) {
                if (!visited[i][j] &amp;&amp; picture[i][j] == 1) {
                    int size = 1;
                    count++;

                    queue.add(new Point(i, j));
                    visited[i][j] = true;

                    while (!queue.isEmpty()) {
                        Point dequeue = queue.remove();

                        for (int d = 0; d &lt; 4; d++) {
                            int dX = dequeue.X + dx[d];
                            int dY = dequeue.Y + dy[d];

                            if (dX &lt; 0 || dX &gt;= m || dY &lt; 0 || dY &gt;= n) continue;

                            if (!visited[dY][dX] &amp;&amp; picture[dY][dX] == 1) {
                                queue.add(new Point(dX, dY));
                                visited[dY][dX] = true;
                                size++;
                            }
                        }
                    }
                    maxSize = (size &gt; maxSize) ? size : maxSize;
                }
            }
        }
        System.out.println(count + &quot;\n&quot; + maxSize);
    }
}

class Point {
    int X;
    int Y;

    Point(int X, int Y) {
        this.X = X;
        this.Y = Y;
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[🍓 라즈베리파이와 ADXL345 가속도센서 연결하기]]></title>
            <link>https://velog.io/@minjoott_dev/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4%EC%99%80-ADXL345-%EA%B0%80%EC%86%8D%EB%8F%84%EC%84%BC%EC%84%9C-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@minjoott_dev/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4%EC%99%80-ADXL345-%EA%B0%80%EC%86%8D%EB%8F%84%EC%84%BC%EC%84%9C-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 30 Dec 2023 14:15:39 GMT</pubDate>
            <description><![CDATA[<h3 id="라즈베리파이--adxl345-회로-연결">라즈베리파이 — ADXL345 회로 연결</h3>
<hr>
<p>(( 연결 표 추가 작성 필요 )) </p>
</br>
</br>

<h3 id="라즈베리파이에서-세팅하기">라즈베리파이에서 세팅하기</h3>
<hr>
<p><code>sudo apt-get update</code>
<code>sudo apt-get upgrade</code>
</br></p>
<p>라즈베리파이에서 Preferences → Raspberry Pi Configuration → Interfaces</p>
<p><code>“I2C”를 Enable</code> 설정하고 <code>sudo reboot</code></p>
<p><code>sudo apt-get install python3-dev python3-pip python3-smbus i2c-tools -y</code></p>
<p><code>i2cdetect -y 0</code>
⇒ I2C 버스에 연결된 장치의 주소 확인</p>
</br>
</br>

<h3 id="파이썬-샘플-코드">파이썬 샘플 코드</h3>
<hr>
<pre><code class="language-python">import smbus
import time

bus = smbus.SMBus(1)  # I2C 버스 번호 (라즈베리파이 2 이상일 때는 1, 라즈베리파이 1일 때는 0)
address = 0x53  # ADXL345 센서의 I2C 주소 (i2cdetect -y 0로 확인한 주소)

# ADXL345 초기화 함수
def init_ADXL345():
    bus.write_byte_data(address, 0x2D, 0x08)

# 가속도 값을 측정하는 함수
def measure_acc(adr):
    acc0 = bus.read_byte_data(address, adr)
    acc1 = bus.read_byte_data(address, adr + 1)
    acc = (acc1 &lt;&lt; 8) + acc0
    # 2의 보수 변환
    if acc &gt; 0x1FF:
        acc = (65536 - acc) * -1
    return acc

try:
    init_ADXL345()
    while True:
        # x, y, z 축의 가속도 값을 읽어옴
        x_acc = measure_acc(0x32)  # X 축 레지스터 주소
        y_acc = measure_acc(0x34)  # Y 축 레지스터 주소
        z_acc = measure_acc(0x36)  # Z 축 레지스터 주소

        # 읽어온 가속도 값을 출력
        print(f&quot;X-Axis: {x_acc}, Y-Axis: {y_acc}, Z-Axis: {z_acc}&quot;)

        time.sleep(0.5)  # 0.5초 간격으로 측정

except KeyboardInterrupt:
    pass</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1012번 : 유기농 배추 문제풀이 (java)]]></title>
            <link>https://velog.io/@minjoott_dev/BOJ-1012%EB%B2%88-%EC%9C%A0%EA%B8%B0%EB%86%8D-%EB%B0%B0%EC%B6%94-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</link>
            <guid>https://velog.io/@minjoott_dev/BOJ-1012%EB%B2%88-%EC%9C%A0%EA%B8%B0%EB%86%8D-%EB%B0%B0%EC%B6%94-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</guid>
            <pubDate>Sat, 30 Dec 2023 10:24:48 GMT</pubDate>
            <description><![CDATA[<h1 id="백준-1012번--유기농-배추"><a href="https://www.acmicpc.net/problem/1012">백준 1012번 : 유기농 배추</a></h1>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<ul>
<li>접근법 : BFS
모든 원소를 순회하면서 방문하지 않은 배추를 시작점으로 BFS를 수행하여 배추 무리를 찾아나간다.</li>
</ul>
<hr>
<h3 id="java-구현-코드">java 구현 코드</h3>
<pre><code class="language-java">package ch08_BFS;

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 p1012 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder output = new StringBuilder();
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int T = Integer.valueOf(st.nextToken());  // 테스트 케이스의 개수 T

        /*
         * 배추밭 배열 값 세팅하기
         */
        for (int t = 0; t &lt; T; t++) {

            st = new StringTokenizer(br.readLine());
            int M = Integer.valueOf(st.nextToken());  // 배추밭의 가로길이 M 
            int N = Integer.valueOf(st.nextToken());  // 배추밭의 세로길이 N 
            int K = Integer.valueOf(st.nextToken());  // 배추가 심어져 있는 위치의 개수 K

            int[][] field = new int[N][M];  // 배추밭 배열

            for (int k = 0; k &lt; K; k++) {
                st = new StringTokenizer(br.readLine());
                int X = Integer.valueOf(st.nextToken());  // 배추 위치의 X좌표
                int Y = Integer.valueOf(st.nextToken());  // 배추 위치의 Y좌표

                // field[X][Y] = 1;  // 배추가 심어져 있음을 표시
                field[Y][X] = 1;  // 배추가 심어져 있음을 표시
            }

            int[] dx = {1,0,-1,0};
            int[] dy = {0,1,0,-1};

            Queue&lt;Spot&gt; queue = new LinkedList&lt;&gt;();  // 큐 생성
            int count = 0;  // 결괏값

            /*
             * 배추밭 전체 순회하면서 방문하지 않은 배추를 시작점으로 BFS 수행
             */
            for (int n = 0; n &lt; N; n++) {
                for (int m = 0; m &lt; M; m++) {
                    if (field[n][m] == 1) {  // 방문 안 한 배추면
                        queue.add(new Spot(m, n));  // enqueue
                        field[n][m] = -1;  // 방문 표시
                        count++;  // 배추 무리 + 1
                    }

                    while (!queue.isEmpty()) {
                        Spot dequeue = queue.remove();  // dequeue

                        for (int d = 0; d &lt; 4; d++) {
                            int dX = dequeue.X + dx[d];
                            int dY = dequeue.Y + dy[d];

                            if (dX &lt; 0 || dX &gt;= M || dY &lt; 0 || dY &gt;= N) continue;  // 좌표의 유효성 검증

                            // if (field[dX][dY] == 1) {  // 유효한 좌표이고, 방문하지 않은 배추라면
                            if (field[dY][dX] == 1) {  // 유효한 좌표이고, 방문하지 않은 배추라면
                                queue.add(new Spot(dX, dY)); // enqueue
                                field[dY][dX] = -1; // 방문 표시
                            }
                        }
                    }
                }
            }
            output.append(count).append(&quot;\n&quot;);
        }
        System.out.println(output.toString());
    }
}

class Spot {
    int X;
    int Y;

    Spot(int X, int Y) {
        this.X = X;
        this.Y = Y;
    }
}</code></pre>
<hr>
<h3 id="문제-해결">문제 해결</h3>
<h4 id="x좌표와-y좌표-대입-위치-혼동으로-인해-발생한-indexoutofboundsexception-에러">X좌표와 Y좌표 대입 위치 혼동으로 인해 발생한 <code>IndexOutOfBoundsException</code> 에러</h4>
<p>최초 코드에서 <code>IndexOutOfBoundsException</code> 에러가 여기저기서 계속 발생했는데, 코드를 아무리 들여다 보아도 문제의 원인을 알아낼 수가 없었다. 그래서 결국엔 다른 사람들의 코드를 찾아 보아 원인을 알아냈다.</p>
<p>X좌표와 Y좌표의 잘못된 대입으로 <code>IndexOutOfBoundsException</code> 에러가 발생했던 것이다. 의심의 여지 없이 X좌표와 Y좌표를 (X,Y) 순서대로 대입해서 코드를 작성해 나갔는데, 그러면 안 됐다... 난 바보다ㅜ 이 실수는 나만 했을까 괜히 궁금해진다. </p>
<p>문제에서 다음과 같은 요구사항이 주어져 있다.
<code>배추밭의 가로길이 M(1 ≤ M ≤ 50)과 세로길이 N(1 ≤ N ≤ 50), 그리고 배추가 심어져 있는 위치의 개수 K(1 ≤ K ≤ 2500)</code> 앞으로 X,Y 좌표 대입에서 헷갈리면 문제 요구사항을 자세히 들여다 보고 힌트를 얻어야 겠다. 다시는 이러한 실수를 하지 않기 위해 그림도 한 번 그려보았다. 🙃</p>
<p align="center">
<img src = "https://velog.velcdn.com/images/minjoott_dev/post/654c34cb-352d-4b01-8a9d-acb4823f2f62/image.png" width="50%" height="50%"></p>

]]></description>
        </item>
        <item>
            <title><![CDATA[하 벨로그,,,]]></title>
            <link>https://velog.io/@minjoott_dev/%ED%95%98-%EB%B2%A8%EB%A1%9C%EA%B7%B8</link>
            <guid>https://velog.io/@minjoott_dev/%ED%95%98-%EB%B2%A8%EB%A1%9C%EA%B7%B8</guid>
            <pubDate>Sat, 30 Dec 2023 10:22:31 GMT</pubDate>
            <description><![CDATA[<p>나의 소중한 시간 30분을 투자해서 백준 문제풀이 글을 작성하고
출간하기 버튼을 눌렀는데 계속 눌러봐도 무반응 이길래 새로고침 했더니 글이 그냥 날라가 버렸다. 임시 저장도 안 되어 있는 상태 ㅎ
이전에 생성한 시리즈도 시리즈 메인 화면에는 남아있고 삭제는 불가능한 문제도 그렇고... 왜이렇게 버그가 많을까ㅜ </p>
<p>버그를 발생할 때마다 매번 구글링 해보면 같은 문제를 경험한 사람이 한둘이 아니다. 해결 좀 해쥬세요... 하 ㅠㅠ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[⛑ 스마트 AIoT 안전모 시스템 개발해서 2번의 최우수상 수상 🏆🏆]]></title>
            <link>https://velog.io/@minjoott_dev/AIoT-%EC%8A%A4%EB%A7%88%ED%8A%B8-%EC%95%88%EC%A0%84%EB%AA%A8%EB%A1%9C-%EC%88%98%EC%83%81</link>
            <guid>https://velog.io/@minjoott_dev/AIoT-%EC%8A%A4%EB%A7%88%ED%8A%B8-%EC%95%88%EC%A0%84%EB%AA%A8%EB%A1%9C-%EC%88%98%EC%83%81</guid>
            <pubDate>Fri, 29 Dec 2023 04:41:54 GMT</pubDate>
            <description><![CDATA[<p>((프로젝트 관련해서 다른 게시글로 작성할 예정, 이 글도 사진 수정 및 글 추가 예정ㅎ))</p>
<p>캡스톤 디자인 수업으로 진행한 &quot;AIoT 스마트 안전모&quot; 프로젝트로 
<code>&quot;AIoT Advantech AIoT Innoworks Project 2023&quot;에서 최우수상</code>, <code>&quot;2023 탄소중립 Innovation Academy 성과발표회&quot;에서 최우수상</code>을 수상했다. </p>
<p>한 학기 동안, 아니 실질적으로 기획 및 개발하는데 투자한 시간은 한 달도 안 될 것이다. 대략 한 달 동안 지민이, 민혜언니와 같이 라즈베리파이와 고군분투하며 고생한 기간에 대한 보상을 받게 되어서 정말 다행이다. 결과물이 좋았기 때문에 수상을 기대하긴 했다만,,,ㅎㅎ 이렇게 최우수상을 두 개나 받게 되어 기쁨도 배로 느껴진다. </p>
<p><img src="https://velog.velcdn.com/images/minjoott_dev/post/f7fa2212-8cc5-434b-bcb9-010d7ac27ea5/image.png" alt="">
<img src="https://velog.velcdn.com/images/minjoott_dev/post/08802b6d-71ba-464c-9db2-d6192d081005/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/minjoott_dev/post/7b64b7ad-284d-43cd-bd6e-c40b58fac397/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/minjoott_dev/post/36738250-2e87-4b6e-ae04-61b4ba7609d5/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/minjoott_dev/post/0135d76c-7eb7-4abd-aaa6-f29e78f63d56/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/minjoott_dev/post/76688c04-9a6f-4bc4-b77d-23b86032e07f/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/minjoott_dev/post/6889d47b-5409-4289-bb65-850d1c03cf63/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/minjoott_dev/post/35db835a-d75b-454e-a97f-28be29353f08/image.jpg" alt=""></p>
</br>
</br>

<p><img src="https://velog.velcdn.com/images/minjoott_dev/post/12e6b24c-e3ea-4e13-ad70-320dba200394/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/minjoott_dev/post/06dc69e5-768c-4a08-a68b-fc621713cc22/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 7576번 : 토마토 문제풀이 (java)]]></title>
            <link>https://velog.io/@minjoott_dev/BOJ-7576%EB%B2%88-%ED%86%A0%EB%A7%88%ED%86%A0-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</link>
            <guid>https://velog.io/@minjoott_dev/BOJ-7576%EB%B2%88-%ED%86%A0%EB%A7%88%ED%86%A0-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</guid>
            <pubDate>Fri, 22 Dec 2023 12:36:32 GMT</pubDate>
            <description><![CDATA[<h1 id="백준-7576번--토마토"><a href="https://www.acmicpc.net/problem/7576">백준 7576번 : 토마토</a></h1>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<ul>
<li>접근법 :BFS
모든 원소를 순회하면서, 익은 토마토를 시작점으로 BFS를 수행하여 최단 날짜를 구해나간다.</li>
</ul>
<hr>
<h3 id="java-구현-코드">java 구현 코드</h3>
<pre><code class="language-java">package ch08_BFS;

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 p7576_solved {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st;

        st = new StringTokenizer(br.readLine());

        int M = Integer.valueOf(st.nextToken());
        int N = Integer.valueOf(st.nextToken());

        Queue&lt;Position&gt; queue = new LinkedList&lt;&gt;();

        int[][] tomatoes = new int[N][M];
        boolean[][] visited = new boolean[N][M];

        for (int i = 0; i &lt; N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j &lt; M; j++) {
                tomatoes[i][j] = Integer.valueOf(st.nextToken());

                if (tomatoes[i][j] == 1) {
                    queue.add(new Position(i, j));
                    visited[i][j] = true;    
                }        
            }
        }

        int[][] minDays = new int[N][M];

        int[] dx = {1,0,-1,0};
        int[] dy = {0,1,0,-1};

        while (!queue.isEmpty()) {
            Position dequeue = queue.remove();

            for (int d = 0; d &lt; 4; d++) {
                int dX = dequeue.X + dx[d];
                int dY = dequeue.Y + dy[d];

                if ((dX &gt;= 0 &amp;&amp; dX &lt; N) &amp;&amp; (dY &gt;= 0 &amp;&amp; dY &lt; M)) {

                    if (tomatoes[dX][dY] == 0) {
                        if (visited[dX][dY] == false) {
                            queue.add(new Position(dX, dY));

                            minDays[dX][dY] = minDays[dequeue.X][dequeue.Y] + 1;
                            visited[dX][dY] = true;
                        } else { // 이미 방문한 곳이면
                            if (minDays[dequeue.X][dequeue.Y] + 1 &lt; minDays[dX][dY]) {
                                minDays[dX][dY] = minDays[dequeue.X][dequeue.Y] + 1;
                                queue.add(new Position(dX, dY));
                            }
                        }
                    }
                }
            }
        }

        int result = 0;  
        for (int i = 0; i &lt; N; i++) {  
            for (int j = 0; j &lt; M; j++) {
                if (tomatoes[i][j] == 0 &amp;&amp; visited[i][j] == false) { 
                    System.out.println(-1);  
                    return;
                }
                else if (tomatoes[i][j] == 1 || tomatoes[i][j] == 0) {  
                    result = (minDays[i][j] &gt; result) ? minDays[i][j] : result;
                }
            }
        }

        System.out.println(result);
        return;
    }

}

class Position {
    int X;
    int Y;

    Position(int X, int Y) {
        this.X = X;
        this.Y = Y;
    }
}
</code></pre>
<hr>
<h3 id="문제-해결">문제 해결</h3>
<h4 id="시간-초과-및-지저분한-코드">시간 초과 및 지저분한 코드</h4>
<pre><code class="language-java">package ch08_BFS;

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 p7576 {

    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());  // NM
        int M = Integer.valueOf(st.nextToken());  // 상자의 가로
        int N = Integer.valueOf(st.nextToken());  // 상자의 세로

        char[][] tomato = new char[N + 2][M + 2];  // 토마토 상자 배열 생성

        // 토마토 상자 배열 값 세팅하기
        for (int i = 1; i &lt;= N; i++) {
            st = new StringTokenizer(br.readLine());  // 하나의 행
            for (int j = 1; j &lt;= M; j++) {
                tomato[i][j] = st.nextToken().charAt(0);
            }
        }

        int[] dx = {1,0,-1,0};  // 우상좌하
        int[] dy = {0,1,0,-1};

        Queue&lt;Position&gt; queue = new LinkedList&lt;&gt;();  // 큐 생성 
        int[][] minDays = new int[N + 2][M +2];  // 토마토가 익기까지 최단 날짜 저장하는 배열
        // int date = 0;  // 결괏값

        // 토마토 상자의 모든 칸을 순회
        for (int i = 1; i &lt;= N; i++) {
            for (int j = 1; j &lt;= M; j++) {
                if (tomato[i][j] == &#39;1&#39;) { // 익은 토마토이면

                    queue.add(new Position(i, j));  // 해당 위치를 enqueue

                    while (!queue.isEmpty()) {  // 큐가 빌 때까지 반복
                        Position tmp = queue.remove();  // dequeue 

                        for (int d = 0; d &lt; 4; d++) {  // 인접한 칸에 대해 순회
                            int dX = tmp.X + dx[d];
                            int dY = tmp.Y + dy[d];

                            if ((dX &gt; 0 &amp;&amp; dX &lt; N + 1) || (dY &gt; 0 &amp;&amp; dY &lt; M + 1)) {  // 좌표 유효성 검증 
                                if (tomato[dX][dY] == &#39;0&#39;) {  // 1. 안 익은 토마토가 있는데, 
                                    if (minDays[dX][dY] == 0) {  // 1-1. 첫 방문이면 
                                        minDays[dX][dY] = minDays[tmp.X][tmp.Y] + 1;  // 최단 거리 바로 저장하고
                                        queue.add(new Position(dX, dY));  // enqueue 
                                    }
                                    else  { // 1-2. 이미 방문했으면 
                                        if (minDays[tmp.X][tmp.Y] + 1 &lt; minDays[dX][dY]) {  // 이미 저장되어 있는 최단 날짜와 비교해서,
                                            minDays[dX][dY] = minDays[tmp.X][tmp.Y] + 1;  // 최단 거리 갱신하고
                                            queue.add(new Position(dX, dY));  // enqueue 
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        int days = 0;  // 결괏값 
        for (int i = 1; i &lt;= N; i++) {  // 토마토 상자의 모든 칸을 순회
            for (int j = 1; j &lt;= M; j++) {
                if (tomato[i][j] == &#39;0&#39; &amp;&amp; minDays[i][j] == 0) {  // 익지 못한 토마토가 있으면 
                    System.out.println(-1);  
                    return;
                }
                else if (tomato[i][j] == &#39;1&#39; || tomato[i][j] == &#39;0&#39;) {  // 토마토가 존재하면
                    days = (minDays[i][j] &gt; days) ? minDays[i][j] : days;  // 결괏값 갱신
                }
            }
        }
        System.out.println(days);
    }

}

class Position {
    int X;
    int Y;

    Position(int X, int Y) {
        this.X = X;
        this.Y = Y;
    }
}
</code></pre>
<p>시간 초과의 원인을 내 힘으로 찾아보려고 했으나, 도저히 모르겠어서 여러 문제풀이 글을 찾아보며 이 문제의 시간 초과의 해결 방법을 알아냈다. 
평범하게 입출력 부분에서 해결할 수 있는 문제가 아니었다. 순회할 필요가 없는 부분까지 순회를 해버렸기 때문에 시간 초과가 발생한 것이었다. 
문제가 발생한 위 코드에서는 입력을 받아 토마토 상자 배열에 값을 세팅한 후, 값이 1인 경우를 찾아내기 위해서 아래와 같이 모든 상자의 칸을 순회한다. 그러나 0인 경우는 순회할 필요가 없기 때문에 모든 칸에 대해서 반복문을 돌릴 필요가 없게 된다. </p>
<p>모든 칸에 대해서 반복문을 돌리지 않고 배열값이 1인 경우만 큐에 원소를 삽입한 후 BFS 작업을 진행하려면 다음과 같이 하면 된다.</p>
<pre><code class="language-java">for (int i = 0; i &lt; N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j &lt; M; j++) {
                tomatoes[i][j] = Integer.valueOf(st.nextToken());

                if (tomatoes[i][j] == 1) {
                    queue.add(new Position(i, j));
                    visited[i][j] = true;    
                }        
            }
        }

        int[][] minDays = new int[N][M];

        int[] dx = {1,0,-1,0};
        int[] dy = {0,1,0,-1};

        while (!queue.isEmpty()) {
            Position dequeue = queue.remove();

            for (int d = 0; d &lt; 4; d++) {
                int dX = dequeue.X + dx[d];
                int dY = dequeue.Y + dy[d];

                if ((dX &gt;= 0 &amp;&amp; dX &lt; N) &amp;&amp; (dY &gt;= 0 &amp;&amp; dY &lt; M)) {

                    if (tomatoes[dX][dY] == 0) {
                        if (visited[dX][dY] == false) {
                            queue.add(new Position(dX, dY));

                            minDays[dX][dY] = minDays[dequeue.X][dequeue.Y] + 1;
                            visited[dX][dY] = true;
                        } else { // 이미 방문한 곳이면
                            if (minDays[dequeue.X][dequeue.Y] + 1 &lt; minDays[dX][dY]) {
                                minDays[dX][dY] = minDays[dequeue.X][dequeue.Y] + 1;
                                queue.add(new Position(dX, dY));
                            }
                        }
                    }
                }
            }
        }</code></pre>
<p>입력을 받아 배열에 값을 세팅하는 과정에서, 1을 만나면 바로 큐에 값을 삽입한다. 배열 값 세팅을 완료하면 큐가 빌 때까지 BFS 작업을 진행한다. </p>
<hr>
<h4 id="comment">comment</h4>
<p>풀이 날짜 : 2023/12/22 (금), 2023/12/27 (수)</p>
<p><em>231222</em>
아직 알고리즘 초보인 내가 풀기엔 좀 어려운 문제였다. 코드로 구현하는 과정이 굉장히 오래걸리긴 했지만, 코드를 완성하고 출력값이 한 번에 제대로 나왔다는 점에서 뿌듯했다. 코드가 되게 지저분하긴 하지만 어쨌든..ㅎ
백준에 코드 제출한 결과 40% 쯤에서 시간초과가 발생했다. 내일 시간초과를 해결하고 지저분한 코드를 깔끔하게 다시 구성해서 풀어볼 계획이다. </p>
<p>코드로 구현을 해나가는 과정에서, 문제의 요구사항에서 놓친 부분을 하나씩 발견하게 되어서 코드를 재구성하게 되는 일이 자꾸 발생했다. 이 문제를 푸는데 오래 걸린 원인 중 하나가 바로 이 부분이다. 
앞으로 문제를 읽을 때 요구사항들을 한 번에 제대로 캐치해내도록 주의해야겠다. 그리고 이 문제의 경우 예시 출력값에서도 하나의 요구사항을 얻어냈다. 이런 점들을 잊지 말고 문제를 잘~ 풀자 !
++ 입력을 받을 때 처리할 수 있는 부분은 바로 처리를 해버리자. </p>
<p><em>231227</em>
알고리즘 문제 하나를 며칠씩이나 붙잡고 있다보니까, 계속 자괴감에 빠진다. 알고리즘 공부 진도가 너무 더디다. 앞으로 핸드폰 하는 시간 좀 줄여서 이제는 진짜 독하게 공부해야 겠다... 이번에도 말만 그러지 말길
나중에 코딩테스트 볼 때 내 자신을 칭찬하는 날이 오길 기대하면서 열심히 공부하자 !</p>
<br>

<hr>
<h4 id="2024년-2월-3일-토-복습-코드">2024년 2월 3일 (토) 복습 코드</h4>
<pre><code class="language-java">package review;

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 p7576 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int M = Integer.parseInt(st.nextToken());  //가로
        int N = Integer.parseInt(st.nextToken());  //세로

        int[][] tomatoes = new int[N][M];

        int notTomatoeNum = 0;

        Queue&lt;Point&gt; queue = new LinkedList&lt;&gt;();
        boolean[][] visited = new boolean[N][M];
        int[][] minDays = new int[N][M];

        for (int i = 0; i &lt; N; i++) {
            st = new StringTokenizer(br.readLine());

            for (int j = 0; j &lt; M; j++) {
                tomatoes[i][j] = Integer.valueOf(st.nextToken());

                if (tomatoes[i][j] == 1) {
                    queue.add(new Point(j, i));
                    visited[i][j] = true;
                    minDays[i][j] = 0;
                }
                else if (tomatoes[i][j] == 0) {
                    notTomatoeNum++;
                }
            }
        }

        int[] dx = {0, 0, -1, 1};
        int[] dy = {1, -1, 0, 0};

        int changedTomatoeNum = 0;

        int result = 0;

        while(!queue.isEmpty()) {
            Point dequeue = queue.remove();

            for (int d = 0; d &lt; 4; d++) {
                int dX = dequeue.X + dx[d];
                int dY = dequeue.Y + dy[d];

                if (dX &lt; 0 || dX &gt;= M || dY &lt; 0 || dY &gt;= N) continue;

                if (tomatoes[dY][dX] == 0) {
                    if (visited[dY][dX] == false) {
                        queue.add(new Point(dX, dY));
                        visited[dY][dX] = true;
                        minDays[dY][dX] = minDays[dequeue.Y][dequeue.X] + 1;

                        changedTomatoeNum++;
                    }
                    else {  //visited[dY][dX] == true
                        minDays[dY][dX] = ((minDays[dequeue.Y][dequeue.X] + 1) &lt; minDays[dY][dX]) 
                                ? (minDays[dequeue.Y][dequeue.X] + 1) : minDays[dY][dX];
                    }

                    result = (minDays[dY][dX] &gt; result) ? minDays[dY][dX] : result;
                }
            }
        }

        if (changedTomatoeNum == notTomatoeNum) {
            System.out.println(result);
            return;
        }
        else {
            System.out.println(-1);
            return;
        }

    }

}

class Point {
    int X;
    int Y;

    Point(int X, int Y) {
        this.X = X;
        this.Y = Y;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 2178번 : 미로 탐색 문제풀이 (java)]]></title>
            <link>https://velog.io/@minjoott_dev/BOJ-2178%EB%B2%88-%EB%AF%B8%EB%A1%9C-%ED%83%90%EC%83%89-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</link>
            <guid>https://velog.io/@minjoott_dev/BOJ-2178%EB%B2%88-%EB%AF%B8%EB%A1%9C-%ED%83%90%EC%83%89-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</guid>
            <pubDate>Fri, 22 Dec 2023 09:29:47 GMT</pubDate>
            <description><![CDATA[<h1 id="백준-2178번--미로-탐색"><a href="https://www.acmicpc.net/problem/2178">백준 2178번 : 미로 탐색</a></h1>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<ul>
<li><p>접근법 : <strong>BFS</strong>
한 좌표로부터 인접한 좌표를 하나씩 방문해가면서 각 좌표의 최단거리를 구해낸다.</p>
</li>
<li><p>풀이 과정</p>
<ol>
<li>(1,1) 좌표를 큐에 삽입하고 최단거리로 0을 저장한다.</li>
<li>큐의 첫번째 원소를 꺼내고, 인접한 4개의 좌표에 대해 우상좌하 순으로 &#39;3번&#39; 작업을 수행한다.</li>
<li>해당 좌표가 갈 수 있는 경로이고, 아직 방문하지 않았으면(최단거리==0인 경우) 해당 좌표의 최단거리를 dequeue한 좌표의 최단거리 + 1로 저장하고 해당 좌표를 enqueue한다.</li>
<li>&#39;2번&#39;부터 &#39;3번&#39;까지의 작업을 큐가 빌 때까지 반복한다.</li>
</ol>
</li>
</ul>
<hr>
<p>java 구현 코드</p>
<pre><code class="language-java">package ch08_BFS;

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 p2178 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.valueOf(st.nextToken());  // 세로 길이 n
        int m = Integer.valueOf(st.nextToken());  // 가로 길이 m 

        char[][] mazeArr = new char[n + 2][m + 2];  // 미로를 저장할 배열

        // 미로 배열 세팅하기
        for (int i = 0; i &lt; n; i++) { 
            String input = br.readLine();

            for (int j = 0; j &lt; m; j++) {
                mazeArr[i + 1][j + 1] = input.charAt(j);
            }
        }

        int[] dx = {1, 0, -1, 0};  // 우상좌하
        int[] dy = {0, 1, 0, -1};

        // BFS 
        Queue&lt;Point&gt; queue = new LinkedList&lt;&gt;();  // 큐 생성
        int[][] distance = new int[n + 2][m + 2];  // 각 좌표에서 (1,1)까지 최단거리 저장 배열

        distance[1][1] = 0;  // (0,0)의 최단거리 값 0으로 세팅 (생략 가능)
        queue.add(new Point(1, 1));  // (1,1) 좌표 enqueue

        while(!queue.isEmpty()) {  // queue가 빌 때까지 반복
            Point tmp = queue.remove();  // dequeue

            int tmpX = tmp.X;
            int tmpY = tmp.Y;

            int tmpDistance = distance[tmpX][tmpY];

            for (int i = 0; i &lt; 4; i++) {  // 꺼낸 좌표의 우상좌하 순으로 탐색
                int dX = tmpX + dx[i];
                int dY = tmpY + dy[i];

                if (mazeArr[dX][dY] == &#39;1&#39; &amp;&amp; distance[dX][dY] == 0) {  // 갈 수 있는 경로인데 아직 방문 안 했으면 
                    distance[dX][dY] = tmpDistance + 1;  // dequeue한 좌표의 최단거리에 1 더하기
                    queue.add(new Point(dX, dY));  // enqueue
                }
            }
        }

        System.out.println(distance[n][m] + 1);

    }

}

class Point {
    int X;
    int Y;

    Point(int X, int Y) {
        this.X = X;
        this.Y = Y;
    }
}
</code></pre>
<hr>
<h4 id="comment">comment</h4>
<p>풀이 날짜 : 2023/12/22 (금)</p>
<p>내년에 코딩테스트 응시하려면 12월에 남은 며칠동안 알고리즘 공부 진도를 빨리 나가야 하는데....자꾸 공부에 집중이 잘 안 된다. 아무래도 도파민 중독으로 한 곳에 집중을 제대로 못하는 것 같다. 
오늘 오전은 집에서 뒹굴거리느라 시간을 낭비했지만 오후에 뒤늦게라도 정석에 온 내 자신에게 칭찬해주자 👏 </p>
<p>일단 오늘 하루에 후회 없도록, 핸드폰 끄고 11시까지 열심히 달려야겠다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1926번 : 그림 문제풀이 (java)]]></title>
            <link>https://velog.io/@minjoott_dev/%EB%B0%B1%EC%A4%80-1926%EB%B2%88-%EA%B7%B8%EB%A6%BC-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</link>
            <guid>https://velog.io/@minjoott_dev/%EB%B0%B1%EC%A4%80-1926%EB%B2%88-%EA%B7%B8%EB%A6%BC-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-java</guid>
            <pubDate>Wed, 20 Dec 2023 11:59:01 GMT</pubDate>
            <description><![CDATA[<h1 id="백준-1926번--그림"><a href="https://www.acmicpc.net/problem/1926">백준 1926번 : 그림</a></h1>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<ul>
<li><p>접근법 : <strong>BFS</strong>, Flood Fill
한 점에서 시작되는 각각의 그림을 BFS를 이용해 파악해낸다.</p>
</li>
<li><p>풀이 과정</p>
<ol>
<li>모든 배열 원소에 대해 아래 과정을 반복한다.</li>
<li>원솟값이 만약 1이고 아직 방문하지 않았으면 큐에 원소(좌표)를 삽입하고, <span style="color:red">방문했다는 표시를 남긴다.</span></li>
<li>큐가 비어있지 않다면, 첫 번째 원소를 꺼내고 해당 그림의 크기를 1 증가시킨다. 
그리고 해당 원소의 인접한 원소에 대해 오른쪽, 위쪽, 왼쪽, 아래쪽 순서대로 &#39;2번&#39;을 반복 수행한다. </li>
<li>&#39;3번&#39;을 큐가 빌 때까지 반복한다.</li>
<li>&#39;4번&#39; 반복문에서 탈출하면 그림의 개수를 1 증가시킨다. 
<span style="color:blue"> ⇒ 하나의 원소로부터 시작된 한 그림을 파악해낸 것!</span></li>
</ol>
</li>
</ul>
<hr>
<h3 id="java-구현-코드">java 구현 코드</h3>
<pre><code class="language-java">package ch08_BFS;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class p1926 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();  // 도화지의 세로 크기 n
        int m = sc.nextInt();  // 도화지의 가로 크기 m

        int[][] pictureArr = new int[n + 2][m + 2];  // 그림 배열
        int[][] visited = new int[n + 2][m + 2];  // 처리 여부 저장 배열

        int[] dx = {1, 0, -1, 0};  // 우 상 좌 하
        int[] dy = {0, 1, 0, -1};

        for (int i = 1; i &lt;= n; i++) {  // 그림 배열값 세팅
            for (int j = 1; j &lt;= m; j++) {
                pictureArr[i][j] = sc.nextInt();
            }
        }


        Queue&lt;Pair&gt; queue = new LinkedList&lt;&gt;();  // 큐 생성
        int count = 0;  // 그림의 개수
        int maxSize = 0;  // 그림의 최대 크기

        for (int i = 1; i &lt;= n; i++) {
            for (int j = 1; j &lt;= m; j++) {

                if (pictureArr[i][j] == 1 &amp;&amp; visited[i][j] == 0) {  // 시작 좌표가 그림이고, 아직 방문하지 않았으면
                    int size = 0;  // 그림의 크기

                    queue.add(new Pair(i, j));  // 큐에 삽입
                    visited[i][j] = 1;  // 방문 완료 갱신

                    while (!queue.isEmpty()) {  // 큐가 비어있지 않으면 (큐가 빌 때까지 반복)
                        Pair pair = queue.remove();  // 큐에서 front 좌표를 꺼내고
                        size++;  // 해당 그림의 크기 갱신

                        for (int d = 0; d &lt; 4; d++) {  // 해당 좌표의 주변 좌표를 우상좌하 순으로 탐색 
                            int tmpX = pair.X + dx[d];  // 주변 좌표 : (tmpX, tmpY)
                            int tmpY = pair.Y + dy[d];

                            if (pictureArr[tmpX][tmpY] == 1 &amp;&amp; visited[tmpX][tmpY] == 0) {  // 그림이고, 아직 방문하지 않았으면
                                queue.add(new Pair(tmpX, tmpY));  // 큐에 해당 좌표 삽입
                                visited[tmpX][tmpY] = 1;  // 방문 완료 갱신
                            }
                        }
                    }
                    count++;  // 그림의 개수 갱신
                    if (size &gt; maxSize) maxSize = size;  // 그림의 최대 크기 갱신
                }
            }
        }

        System.out.println(count + &quot;\n&quot; + maxSize);

    }

}

class Pair {  // 좌표 값을 저장할 자료구조 Pair 
    int X;
    int Y;

    Pair(int x, int y) {
        this.X = x;
        this.Y = y;
    }
}
</code></pre>
<hr>
<h3 id="문제-해결">문제 해결</h3>
<h4 id="값-갱신의-잘못된-시점으로-버그-발생">값 갱신의 잘못된 시점으로 버그 발생</h4>
<p>size값이 자꾸 크게 나오는 버그가 발생했다. 
한시간 넘게 똑같은 코드를 바라보고 있던 결과,,, visited 배열값 갱신 시점에 문제가 있음을 발견했다. 
이전에 버그가 발생한 코드는 아래와 같다.</p>
<pre><code class="language-java">for (int i = 1; i &lt;= n; i++) {
            for (int j = 1; j &lt;= m; j++) {

                if (pictureArr[i][j] == 1 &amp;&amp; visited[i][j] == 0) {  // 시작 좌표가 그림이고, 아직 방문하지 않았으면
                    int size = 0;  // 그림의 크기

                    queue.add(new Pair(i, j));  // 큐에 삽입

                    while (!queue.isEmpty()) {  // 큐가 비어있지 않으면 (큐가 빌 때까지 반복)
                        Pair pair = queue.remove();  // 큐에서 front 좌표를 꺼내고

                        for (int d = 0; d &lt; 4; d++) {  // 해당 좌표의 주변 좌표를 우상좌하 순으로 탐색 
                            int tmpX = pair.X + dx[d];  // 주변 좌표 : (tmpX, tmpY)
                            int tmpY = pair.Y + dy[d];

                            if (pictureArr[tmpX][tmpY] == 1 &amp;&amp; visited[tmpX][tmpY] == 0) {  // 그림이고, 아직 방문하지 않았으면
                                queue.add(new Pair(tmpX, tmpY));  // 큐에 해당 좌표 삽입
                            }
                        }
                        size++;  // 해당 그림의 크기 갱신
                        visited[pair.X][pair.Y] = 1;  // 방문 완료 갱신
                    }
                    count++;  // 그림의 개수 갱신
                    if (size &gt; maxSize) maxSize = size;  // 그림의 최대 크기 갱신
                }
            }
        }</code></pre>
<p>큐에서 꺼낸 원소(좌표)를 a라 하자.
만약 visited[pair.X][pair.Y] = 1; 이 라인을 위 코드처럼 a의 인접한 원소 4개를 탐색 완료한 후에 수행하게 되면 a가 큐에 여러 번 들어가게 되어 size++; 라인이 필요 이상으로 수행되게 된다. 
따라서, visited[pair.X][pair.Y] = 1; 라인을 큐에 원소를 삽입할 때 같이 수행해주어야 한다.</p>
<hr>
<h4 id="comment">Comment</h4>
<p>풀이 날짜 : 2023/12/20 (수)</p>
<p><a href="https://blog.encrypted.gg/941">바킹독 BFS 강의</a>를 듣고 파이썬 샘플 코드를 참고하여 처음으로 스스로 구현한 BFS 문제이다. 
알고리즘 문제를 단순히 코드로 구현하는 것에서 그치지 않고, 남에게 문제를 설명하고, 문제풀이 접근 방법과 내가 구현한 코드에 대해 설명할 수 있도록 실력을 키우는 것이 나의 알고리즘 공부 목표이다. 
1월에는 알고리즘 스터디에 참여해볼 계획이다. 내 코드를 남들에게 공유해도 부끄럽지 않을 수 있게, 남은 12월 동안 얼른 개념 공부 끝내고 문제 많~이 풀어야겠다. 파이팅 !</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS Certified Cloud Practitioner 덤프 문제 풀이 Q76~Q100 (3)]]></title>
            <link>https://velog.io/@minjoott_dev/AWS-Certified-Cloud-Practitioner-%EB%8D%A4%ED%94%84-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-Q76Q100-3</link>
            <guid>https://velog.io/@minjoott_dev/AWS-Certified-Cloud-Practitioner-%EB%8D%A4%ED%94%84-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-Q76Q100-3</guid>
            <pubDate>Mon, 04 Dec 2023 14:51:49 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p><strong><a href="https://aws.amazon.com/ko/elastictranscoder/?nc2=type_a">Amazon Elastic Transcoder</a></strong>
Amazon Elastic Transcoder는 클라우드에서 미디어를 트랜스코딩하는 서비스입니다. 확장성이 뛰어나고 사용하기 쉬우며 비용 효율적인 이 방법을 통해 개발자 및 비즈니스에서 소스 형식의 미디어 파일을 스마트폰, 태블릿, PC 등의 디바이스에서 재생되는 버전으로 변환(또는 &quot;트랜스코딩&quot;)할 수 있습니다.</p>
</li>
<li><p><strong>AWS Storage Gateway</strong>
AWS Storage Gateway는 거의 무제한의 클라우드 스토리지 액세스를 온프레미스에 제공하는 <u>하이브리드 클라우드 스토리지 서비스</u> 세트입니다.
사용자 및 애플리케이션 워크플로 유지 관리에 의한 비즈니스 중단 없이 클라우드 지원 스토리지에 온프레미스 애플리케이션 액세스를 제공합니다.</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/polly/?nc2=type_a">Amazon Polly</a></strong>
텍스트를 생생한 음성으로 변환
Amazon Polly는 딥 러닝 기술을 사용하여 자연스러운 사람의 음성을 합성합니다. 이 서비스를 사용하면 기사를 음성으로 변환할 수 있습니다. 실제와 같은 수십 가지 음성을 광범위한 언어로 제공하므로 Amazon Polly를 사용하여 음성 작동 애플리케이션을 구축할 수 있습니다.</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/s3/outposts/?whats-new-cards.sort-by=item.additionalFields.postDateTime&amp;whats-new-cards.sort-order=desc">AWS Outposts</a></strong>
+ 온프레미스 환경에서 데이터를 로컬로 처리하고 안전하게 저장하며, 추가 처리 또는 아카이빙을 위해 데이터를 AWS 리전의 S3로 전송합니다. S3 on Outposts는 온프레미스 객체 스토리지를 제공하여 네트워크 변동으로 인한 데이터 전송 및 버퍼를 최소화하는 동시에, AWS DataSync를 사용하여 Outposts와 AWS 리전 간에 데이터를 손쉽게 전송할 수 있도록 합니다.</p>
</li>
</ul>
<br/>



<p><strong>Question #76</strong>
AWS 클라우드 사용의 장점은 무엇입니까? (2개를 선택하세요.)
A. 필요에 따라 조정되는 컴퓨팅 용량 / 강화된 보안</p>
<p><strong>Question #77</strong>
사용자가 Amazon S3에 객체를 저장하고 있습니다. 사용자는 규정 준수 의무를 충족하기 위해 개체에 대한 액세스를 제한해야 합니다. 이 요구 사항을 충족하려면 사용자가 무엇을 해야 합니까?
A. S3 버킷의 객체에 태그를 지정합니다.</p>
<p><strong>Question #80</strong>
회사에는 여러 부서가 있습니다. 각 부서에는 해당 애플리케이션에 대한 자체 AWS 계정이 있습니다. 회사는 지불을 단순화하기 위해 모든 AWS 비용을 단일 송장으로 원하지만 회사는 각 부서에서 발생하는 비용을 알고 싶어합니다. 이 기능을 제공하는 AWS 도구 또는 기능은 무엇입니까?
A. Consolidated billing</p>
<p><strong>Question #81</strong>
회사는 온프레미스에서 워크로드를 실행합니다. 이 회사는 AWS에서 대규모 애플리케이션을 실행하는 비용을 예측하려고 합니다.
회사에서 이 정보를 얻기 위해 사용할 수 있는 AWS 서비스 또는 도구는 무엇입니까?
A. AWS Pricing Calculator 
VS Cost Explorer &lt;- 기존 서비스에 대한 비용</p>
<p><strong>Question #83</strong>
사용자에게 AWS 인프라, AWS 서비스, API 및 도구를 데이터 센터, 코로케이션 환경 또는 온프레미스 시설로 확장할 수 있는 기능을 제공하는 하이브리드 아키텍처를 지원하는 AWS 서비스
A. AWS Outposts</p>
<p><strong>Question #87</strong>
Amazon VPC에서 인바운드 및 아웃바운드 트래픽에 대한 정보를 캡처하는 데 사용할 수 있는 AWS 서비스 또는 도구는 무엇입니까?
A. VPC Flow Logs</p>
<p><strong>Question #89</strong>
회사는 어떤 상황에서 IAM 역할 대신 IAM 사용자를 생성해야 합니까? (두 가지를 선택하세요.)
A. B. 회사가 개인의 AWS 접근 자격 증명을 생성하는 경우 / 회사에서 IAM 그룹에 사용자를 추가해야 하는 경우</p>
<p><strong>Question #94</strong>
다음 중 AWS 클라우드 아키텍처에 권장되는 설계 원칙은 무엇입니까?
A. 워크로드를 세분화하여 모놀리식 아키텍처를 피하십시오.</p>
<p><strong>Question #95</strong>
한 회사는 구성 요소가 정기적으로 업데이트되고 변경 사항이 되돌릴 수 있는 작은 증분으로 이루어질 수 있도록 AWS 워크로드를 설계하고 있습니다. 이 설계는 AWS Well-Architected 프레임워크의 어떤 요소를 지원합니까?
A. 운영 우수성</p>
<p><strong>Question #96</strong>
인바운드 및 아웃바운드 액세스를 제어하는 인스턴스 수준 방화벽 역할을 하는 것
A. Security Groups</p>
<p><strong>Question #100</strong>
서브넷 수준에서 VPC 방화벽 역할을 하는 AWS 도구 또는 기능은 무엇입니까?
A. Network ACL
VS Security Groups (인스턴스 수준 방화벽)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS Certified Cloud Practitioner 덤프 문제 풀이 Q26~Q75 (2)]]></title>
            <link>https://velog.io/@minjoott_dev/AWS-Certified-Cloud-Practitioner-%EB%8D%A4%ED%94%84-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-Q26Q2</link>
            <guid>https://velog.io/@minjoott_dev/AWS-Certified-Cloud-Practitioner-%EB%8D%A4%ED%94%84-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-Q26Q2</guid>
            <pubDate>Mon, 04 Dec 2023 11:58:38 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p><strong><a href="https://docs.aws.amazon.com/ko_kr/awscloudtrail/latest/userguide/cloudtrail-user-guide.html">AWS CloudTrail</a></strong>
AWS CloudTrail은 AWS 계정의 운영 및 위험 감사, 거버넌스 및 규정 준수를 활성화하는 데 도움이 되는 AWS 서비스입니다. 사용자, 역할 또는 AWS 서비스가 수행하는 작업은 CloudTrail에 이벤트로 기록됩니다. 이벤트에는 AWS Management Console, AWS Command Line Interface 및 AWS SDK, API에서 수행되는 작업들이 포함됩니다.
<u>누가 또는 무엇이 어떤 작업을 수행했는지, 어떤 리소스에 대해 조치가 취해졌는지, 언제 이벤트가 발생했는지, AWS 계정에서 활동 분석 및 응답에 도움이 되는 기타 세부 정보를 식별할 수 있습니다.</u></p>
</li>
<li><p><strong><a href="https://docs.aws.amazon.com/shield/">AWS Shield</a></strong>
DDoS 공격으로부터 AWS에서 실행되는 애플리케이션을 보호하는 데 도움이 되는 AWS 서비스</p>
</li>
<li><p><strong>[AWS Enterprice Support] AWS 엔터프라이즈 지원 (<a href="https://aws.amazon.com/ko/premiumsupport/plans/enterprise/)%EC%97%90">https://aws.amazon.com/ko/premiumsupport/plans/enterprise/)에</a> 포함된 것</strong></p>
<ul>
<li>사전 예방적 검토</li>
<li>기술 지원 관리 - Technical Account Manager(TAM), AWS SME (주제 전문가)</li>
<li>기술 및 결제 지원 - 타사 소프트웨어 지원</li>
<li>셀프 서비스 지원 - AWS Trusted Advisor</li>
</ul>
</li>
<li><p><strong>Service Control Polities (SCPs)</strong>
AWS에서는 AWS Identity and Access Management (IAM)을 사용하여 자원 및 서비스에 대한 액세스를 관리합니다. IAM은 사용자, 그룹 및 역할을 정의하고, 이들에 대한 권한을 부여하여 AWS 리소스에 대한 액세스를 통제합니다. 또한 AWS Organizations을 사용하여 여러 AWS 계정을 조직화하고 중앙에서 관리할 수 있습니다.
SCP는 <u>AWS Organization</u>s에서 제공하는 기능 중 하나입니다. SCP를 사용하면 AWS 조직 단위에서 특정 서비스나 기능에 대한 액세스를 제어할 수 있습니다. 특정 계정 또는 그룹의 정책을 설정하여 허용되거나 차단되는 서비스 및 리소스를 지정할 수 있습니다.</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/servicecatalog/?nc2=type_a">AWS Service Catalog</a></strong>
엄선된 AWS 리소스 카탈로그를 생성, 정렬 및 통제할 수 있습니다. 이러한 리소스는 권한 수준에서 공유할 수 있으므로 기본 AWS 서비스에 직접 액세스하지 않고도 승인된 클라우드 리소스를 빠르게 프로비저닝할 수 있습니다.</p>
</li>
<li><p><strong>종량제 요금 모델의 특징</strong></p>
<ul>
<li>소비한 만큼 지불 : 사용자가 특정 서비스 또는 리소스를 얼마나 사용했느냐에 따라 비용이 발생한다.</li>
<li>유연성 : 사용자는 필요에 따라 서비스 및 리소스를 증가 또는 축소할 수 있다.</li>
<li>미리 지불하지 않음</li>
</ul>
</li>
<li><p><strong>AWS Direct Connect</strong></p>
<ul>
<li>하이브리드 네트워크 구축
AWS와 온프레미스 네트워크를 연결하여 성능의 저하 없이 여러 환경에 걸친 애플리케이션을 구축하십시오.</li>
<li>기존 네트워크 확장
네트워크를 AWS Direct Connect에 연결하면 SiteLink를 사용하여 위치 간에 데이터를 보낼 수 있습니다. SiteLink를 사용할 때 데이터는 위치 간 최단 경로를 통해 이동합니다.
AWS Direct Connect SiteLink를 사용하면 <u>AWS Direct Connect</u> 위치 간에 데이터를 전송하여 글로벌 네트워크의 데이터 센터와 사무실 사이에서 <u>프라이빗 네트워크 연결을 생성할 수 있습니다</u>.</li>
<li>대규모 데이터 집합 관리
실시간 분석, 신속한 데이터 백업 또는 방송 미디어 처리를 위해 대규모로 원활하고 안정적인 데이터 전송을 보장합니다.</li>
</ul>
</li>
<li><p><strong>관리형 데이터베이스 서비스</strong></p>
<ul>
<li>Amazon RDS</li>
<li>Amazon DynamoDB</li>
</ul>
</li>
<li><p><strong>Amazon Macie</strong>
기계 학습을 사용하여 Amazon S3 버킷에 저장된 민감한 데이터를 검색, 모니터링 및 보호하는 AWS 서비스</p>
</li>
<li><p><strong>AWS Global Accelerator</strong>
애플리케이션의 가용성, 성능 및 보안을 개선하는 데 유용한 네트워킹 서비스</p>
</li>
<li><p><strong>AWS IAM Access Analyzer</strong>
Amazon S3 버킷 또는 IAM 역할이 외부 엔터티와 공유되었는지 식별하는 AWS 서비스</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/transit-gateway/">AWS Transit Gateway</a></strong>
AWS Transit Gateway는 클라우드 라우터 역할을 하기 때문에 네트워크를 대규모로 설계하고 구현하는 데 도움이 됩니다. 네트워크 규모가 커지면 증가하는 연결을 관리하기가 복잡해지고 이로 인해 속도가 느려질 수 있습니다. AWS Transit Gateway는 중앙 허브를 통해 VPC와 온프레미스 네트워크를 연결합니다.
Question #56) 전 세계 여러 AWS 리전에 여러 VPC가 있는 대기업은 VPC 간의 네트워크 연결을 연결하고 중앙에서 관리해야 합니다.
이러한 요구 사항을 충족하는 AWS 서비스</p>
</li>
<li><p><strong>Amazon QuickSight</strong>
AWS 비용 및 사용 보고서 데이터에서 <u>시각적 보고서 생성</u>을 지원하는 AWS 서비스</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/cloudwatch/?nc2=type_a">Amazon CloudWatch</a></strong>
AWS, 온프레미스 및 기타 클라우드에서 리소스 및 애플리케이션을 관측하고 모니터링하는 서비스</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/cloudformation/?nc2=type_a">AWS CloudFormation</a></strong>
AWS CloudFormation을 사용하면 인프라를 코드로 처리하여 AWS 및 서드 파티 리소스를 모델링, 프로비저닝 및 관리할 수 있다.
Question #60) 사용자는 코드형 인프라(IaC) 원칙을 사용하여 AWS 클라우드에 서비스를 배포하려고 합니다. 이 요구 사항을 충족하는 데 사용할 수 있는 AWS 서비스</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/s3/outposts/?whats-new-cards.sort-by=item.additionalFields.postDateTime&amp;whats-new-cards.sort-order=desc">AWS Outposts</a></strong>
애플리케이션을 온프레미스로 구축 또는 테스트한 후 최종적으로 AWS 리전으로 이전하는 고객의 경우, 이제 애플리케이션에 요구되는 변경 사항을 최소화할 수 있습니다. S3 on Outposts는 AWS로 손쉽게 이동할 수 있는 이식 가능한 애플리케이션을 Outposts 온프레미스에 구축하는 기능을 지원함으로써 클라우드 마이그레이션 여정의 중간 단계를 제공합니다.</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/appstream2/?nc2=type_a">Amazon AppStream 2.0</a></strong>
우수한 보안, 신뢰성 및 확장성을 갖춘 애플리케이션 스트리밍과 저렴한 비용의 가상 데스크톱 서비스로, 모든 위치에서 애플리케이션 및 데스크톱에 안전하게 액세스하여 원격 작업자가 필요로 하는 기능을 제공하고 변화하는 상황에 빠르게 대응할 수 있습니다.
Question #66) 회사는 AWS 클라우드를 사용하여 완전히 관리되는 환경에서 실행되는 데스크톱 애플리케이션에 대한 보안 액세스를 제공하려고 합니다. 회사에서 이 요구 사항을 충족하려면 사용해야 하는 AWS 서비스</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/guardduty/?nc2=type_a">Amazon GuardDuty</a></strong>
지능형 위협 탐지로 AWS 계정을 보호하는 AWS 서비스</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/fargate/?nc2=type_a">AWS Fargate</a></strong>
서버 또는 클러스터를 관리할 필요 없이 컨테이너 실행하는, 컨테이너에 적합한 서버리스 컴퓨팅 서비스
Question #69) 회사는 Docker 컨테이너에 애플리케이션을 설치해야 합니다. 컨테이너 호스트를 프로비저닝하고 관리할 필요가 없는 AWS 서비스</p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/snowball/">AWS Snoball Edge</a></strong>
오프라인 데이터 또는 원격 스토리지를 클라우드로 신속하게 이동시키는 AWS 서비스 </p>
</li>
<li><p><strong><a href="https://aws.amazon.com/ko/kms/?nc2=type_a">AWS Key Management Service</a></strong>
데이터를 암호화하거나 디지털 서명할 때 사용하는 키를 생성 및 제어하는 AWS 서비스
Question #75) 미사용 데이터를 암호화하는 데 사용할 수 있는 AWS 서비스</p>
</li>
</ul>
<hr>
<p><strong>Question #26</strong>
온프레미스 대신 AWS 클라우드에서 애플리케이션을 호스팅하기 위해 Amazon EC2 인스턴스를 사용하면 어떤 이점이 있습니까? (두 가지를 선택하세요.)
A. EC2는 Amazon VPC, AWS CloudTrail 및 AWS Identity and Access Management(IAM)와 통합됩니다. / EC2에는 유연한 종량제 요금 모델이 있습니다.</p>
<p><strong>Question #29</strong>
Amazon EC2 인스턴스의 방화벽 역할을 하는 AWS 서비스 또는 기능은 무엇입니까?
A. Security group 보안 그룹</p>
<p><strong>Question #41</strong>
AWS 공동 책임 모델에 따라 AWS의 책임은 무엇입니까? (2개 선택)
A. 네트워크 인프라의 펌웨어를 업그레이드한다. / 엣지 로케이션의 물리적 보안을 유지한다.</p>
<p><strong>Question #42</strong>
AWS 클라우드에서 사용되는 네트워크 ACL의 기능은 무엇입니까? (2개 선택)
A. stateless 방식을 사용한다. / 트래픽 허용 여부를 결정할 때 가장 낮은 번호의 규칙부터 순서대로 처리한다.</p>
<p><strong>Question #47</strong>
AWS 클라우드에서 종속 구성 요소 간의 장애를 격리해야 하는 필요성을 설명하는 아키텍처 설계 원칙은 무엇입니까?
A. 느슨하게 결합된 구성 요소</p>
<p><strong>Question #49</strong>
한 회사에서 애플리케이션의 여러 AWS 서비스에 대해 AWS 프리 티어를 사용하고 있습니다. 프리 티어 사용 기간이 만료되거나 애플리케이션 사용이 프리 티어 사용 한도를 초과하면 어떻게 됩니까?
A. 프리 티어 사용량을 초과하는 사용량에 대해서는 표준 종량제 서비스 요금을 회사에서 청구합니다.</p>
<p><strong>Question #50</strong>
한 회사가 최근 VPC에 Amazon RDS 인스턴스를 배포했습니다. 회사는 개인 회사 네트워크에 대한 트래픽을 제한하기 위해 상태 저장 방화벽을 구현해야 합니다. 네트워크 트래픽을 RDS 인스턴스로 직접 제한하기 위해 회사에서 사용해야 하는 AWS 서비스 또는 기능은 무엇입니까?
A. Security Groups 보안 그룹</p>
<p><strong>Question #59</strong>
한 회사가 다가오는 이벤트를 위해 많은 트래픽을 받을 것으로 예상되는 새로운 웹 스토어를 시작하려고 준비하고 있습니다. 웹 스토어는 AWS에서만 실행되며 회사에는 AWS Enterprise Support 계획이 있습니다.
이벤트 기간 동안 회사가 아키텍처 및 운영 지원을 확장하는 방법에 대한 지침을 제공하는 AWS 리소스는 무엇입니까?
A. AWS Infarastructure Event Management (IEM)</p>
<p><strong>Question #62</strong>
AWS 공유 책임 모델에 따라 AWS와 고객이 공유하는 IT 제어는 무엇입니까? (두 가지를 선택하세요.)
A. 패치 관리, 클라우드 인식 및 교육</p>
<p><strong>Question #64</strong>
제조 회사에는 인터넷 연결 속도가 느린 원격 사이트에서 실행되는 중요한 응용 프로그램이 있습니다. 회사는 워크로드를 AWS로 마이그레이션하려고 합니다. 애플리케이션은 대기 시간과 연결 중단에 민감합니다. 회사는 대기 시간을 최소화하면서 이 애플리케이션을 호스팅할 수 있는 솔루션을 원합니다. 이러한 요구 사항을 충족하기 위해 회사에서 사용해야 하는 AWS 서비스 또는 기능은 무엇입니까?
A. AWS Outposts</p>
<p><strong>Question #65</strong>
회사는 온프레미스 데이터 센터에서 AWS 클라우드의 VPC로 애플리케이션을 마이그레이션하려고 합니다. 이러한 애플리케이션은 온프레미스 리소스에 액세스해야 합니다.
이러한 요구 사항을 충족하는 조치는 무엇입니까? (두 가지를 선택하세요.)
A. 온프레미스 장치와 VPC의 가상 프라이빗 게이트웨이 간에 VPN 연결을 생성합니다. / Amazon CloudFront 배포를 사용하고 온프레미스 리소스에 가까운 콘텐츠 전송을 가속화하도록 구성합니다.</p>
<p><strong>Question #68</strong>
엣지 로케이션을 사용하는 AWS 서비스
A. AWS Global Accelerator</p>
<p><strong>Qustion #70</strong>
액세스 정책을 확인하고 사용자가 안전하고 기능적인 정책을 설정하는 데 도움이 되는 실행 가능한 권장 사항을 제공하는 AWS 서비스 또는 기능은 무엇입니까?
A. AWS IAM Access Analyzer</p>
<p><strong>Qustion #72</strong>
소매 회사는 새로운 전자 상거래 플랫폼을 위한 고가용성 아키텍처를 구축해야 합니다. 이 회사는 여러 가용 영역에서 데이터를 복제하는 AWS 서비스만 사용하고 있습니다.
회사는 이 요구 사항을 충족하기 위해 어떤 AWS 서비스를 사용해야 합니까? (두 가지를 선택하세요.)
A. Amazon Aurora, Amazon DynamoDB 
=&gt; Aurora, DynamoDB는 여러 가용 영역에서 데이터 복제 가능</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[당신이 지금 알아야 할 AWS] _10장 AWS 컴퓨팅 서비스의 시작과 끝 EC2]]></title>
            <link>https://velog.io/@minjoott_dev/%EB%8B%B9%EC%8B%A0%EC%9D%B4-%EC%A7%80%EA%B8%88-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-AWS-10%EC%9E%A5-AWS-%EC%BB%B4%ED%93%A8%ED%8C%85-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%9D%98-%EC%8B%9C%EC%9E%91%EA%B3%BC-%EB%81%9D-EC2</link>
            <guid>https://velog.io/@minjoott_dev/%EB%8B%B9%EC%8B%A0%EC%9D%B4-%EC%A7%80%EA%B8%88-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-AWS-10%EC%9E%A5-AWS-%EC%BB%B4%ED%93%A8%ED%8C%85-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%9D%98-%EC%8B%9C%EC%9E%91%EA%B3%BC-%EB%81%9D-EC2</guid>
            <pubDate>Mon, 04 Dec 2023 08:55:23 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>AWS 클라우드 입문서 &quot;당신이 지금 알아야 할 AWS&quot; 를 읽고 정리한 글입니다.</p>
</blockquote>
<h3 id="ec2-서비스-요금">EC2 서비스 요금</h3>
<ul>
<li><strong>온디맨드 요금제</strong>
고정 금액으로 EC2의 컴퓨팅 파워를 시간당 또는 초당 비용으로 지불하게 된다. 온디멘드 요금제는 상대적으로 비용이 비싸기 때문에 개발용이나 테스트를 위한 인스턴스 그리고 단기간 혹은 예정되어 있지 않는 작업 등에 사용할 때 적합하다.<ol>
<li>선결제 금액이나 장기 약정 없이 저렴하고 유연하게 Amazon EC2를 사용하기 원하는 사용자</li>
<li>단기에 갑작스럽게 예측할 수 없는 워크로드가 있으며, 중단되어서는 안 되는 애플리케이션</li>
<li>Amazon EC2에서 처음으로 개발 또는 시험 중인 애플리케이션<br/>    </li>
</ol>
</li>
<li><strong>예약 인스턴스</strong>
예약 인스턴스는 계약 기간에 따라 최대 75%까지 저렴한 비용으로 사용할 수 있는 요금제이다. 통상적으로 1년 혹은 3년 약정과 같이 일정 기간 동안 계약을 하는 요금제이다.<ol>
<li>수요가 꾸준한 애플리케이션</li>
<li>예약 용량이 필요할 수 있는 애플리케이션</li>
<li>총 컴퓨팅 비용 절감을 위해 1년 또는 3년 동안 EC2를 사용하기로 약정할 수 있는 고객<br/></li>
</ol>
</li>
<li><strong>전용 호스팅</strong>
전용 호스팅은 고객 전용의 물리적 EC2 가상 서버이다.<ol>
<li>온디맨드로 구매 가능(시간당)</li>
<li>온디맨드 요금과 비교하여 최대 70% 할인된 예약 인스턴스로 구매 가능<br/></li>
</ol>
</li>
<li><strong>스팟 인스턴스</strong>
스팟 인스턴스는 입찰 가격을 정해놓고 가장 비싼 요금을 입찰한 사람에게 컴퓨팅 파워를 제공하는 요금제이다.<ol>
<li>시작 및 종료 시간이 자유로운 애플리케이션</li>
<li>컴퓨팅 가격이 매우 저렴 해야만 수익이 나는 애플리케이션</li>
<li>대량의 서버 용량 추가로 긴급히 컴퓨팅 파워가 필요한 사용자</li>
</ol>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[당신이 지금 알아야 할 AWS] _2장 AWS 서비스와 선택]]></title>
            <link>https://velog.io/@minjoott_dev/%EB%8B%B9%EC%8B%A0%EC%9D%B4-%EC%A7%80%EA%B8%88-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-AWS-2%EC%9E%A5-AWS-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%99%80-%EC%84%A0%ED%83%9D</link>
            <guid>https://velog.io/@minjoott_dev/%EB%8B%B9%EC%8B%A0%EC%9D%B4-%EC%A7%80%EA%B8%88-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-AWS-2%EC%9E%A5-AWS-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%99%80-%EC%84%A0%ED%83%9D</guid>
            <pubDate>Mon, 04 Dec 2023 08:54:35 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>AWS 클라우드 입문서 &quot;당신이 지금 알아야 할 AWS&quot; 를 읽고 정리한 글입니다.</p>
</blockquote>
<h3 id="aws-인프라-구성-요소">AWS 인프라 구성 요소</h3>
<ul>
<li><p>** <span style="color:Red"> 리전 (Region) ✔️ </span> **
AWS는 물리적으로 떨어진 지역에 여러 개의 클라우드 인프라를 운영하는데, 이 지역을 어원 그대로 리전(region)이라고 부른다. AWS는 전 세계 20여 곳의 리전을 제공하고 있고, 각 리전은 물리적으로 완전히 분리되어 있으며, AWS 콘솔 상에서도 완전히 다른 리소스로 구분한다.<br></p>
</li>
<li><p>** <span style="color:Red"> 가용 영역 (Availability Zone) ✔️ </span> **
AWS 서비스가 리전들의 집합이라면, 리전은 가용 영역(Availability Zone)들의 집합니다. 여러 개의 가용 영역이 모여 리전을 구성한다. 가용 영역은 데이터 센터이다. 각 가용 영역은 실제 물리적으로는 완전히 독립되어 있지만, AWS 콘솔에서 리소스별로 구분하지는 않는다.
하나의 리전은 여러 개의 가용 영역으로 이루어져 있다. 이는 다시 말해, 서울 리전이라는 리전 아래 여러 개의 데이터 센터가 운영되고 있다는 의미이다. <u>가용 영역을 여러 곳에 두고 운영한다면, 하나의 가용 영역에 문제가 발생해도 단순한 변경만으로 가용 영역을 운영할 수 있다.</u> 이러한 특징을 ** <span style="color:Red"> 가용성(Availability) </span> **이라고 부른다. </p>
<pre><code>컴퓨터에서 가용성은 서버, 네트워크, 프로그램 등이 정상적으로 사용 가능한 정도를 나타낸다. 서비스 가동률로 이해하면 된다. 
AWS가 높은 가용성을 자랑하는 이유는 2개 이상의 가용 영역을 사용하여 높은 가동률을 보장할 수 있기 때문이다.</code></pre><pre><code>참고: 모든 AWS상의 서비스들은 ARN(Amazon Resource Number)이라는 번호가 붙는다.</code></pre></li>
<li><p><strong>에지 로케이션 (Edge Location)</strong>
에지 로케이션(Edge Location)은 리전에 속한 ‘리전 에지 캐시’를 통해 데이터 속도를 개선한다.
에지 로케이션은 CDN(Content Delivery Network)을 이루는 캐시 서버이다. <u>CDN은 웹 콘텐츠를 전달하기 위한 최적화된 네트워크로서, 대표적인 클라우드 CDN 서비스로 AWS의 <span style="color:Red">클라우드 프론트</span> 등이 있다.</u></p>
</li>
</ul>
<br/>

<h3 id="aws-클라우딩-서비스">AWS 클라우딩 서비스</h3>
<pre><code>인스턴스는 AWS에 구축된 1대의 가상 서버를 의미한다. 
AWS 컴퓨팅 서비스는 인스턴스를 시작할 때 지정하는 유형에 따라, 인스턴스에 사용되는 호스트 컴퓨터의 하드웨어가 결정된다. 
각 인스턴스 유형은 서로 다른 컴퓨팅, 메모리, 스토리지 용량을 제공하는데, 이 용량에 따라 서로 다른 인스턴스 패밀리로 분류된다. 
인스턴스에서 실행하려는 애플리케이션 또는 소프트웨어의 요구사항에 따라 인스턴스 유형을 선택하게 된다.</code></pre><ul>
<li><p><strong>컴퓨팅</strong>
클라우드 환경에서 컴퓨팅이란 가상 서버를 중심으로 컴퓨터 인프라를 이용하는 서비스를 말한다.</p>
<ul>
<li><p><strong>EC2</strong>
EC2는 ‘엘라스틱 컴퓨터 클라우드’(Elastic Compute Cloud)의 약자로, 종량제 형태로 과금이 되는 가상 서버라고 생각하면 된다.</p>
</li>
<li><p><strong>람다</strong>
AWS 람다는 특정한 이벤트를 통해 입력 인자가 발생하면 연산 과정으로 출력 인자를 바꾸는 이벤트 기반의 컴퓨팅 서비스이다. EC2와는 다르게 오직 소스코드만 사용하여 인프라에 대한 관리가 필요하지 않은 완전 관리형 컴퓨팅 서비스이다.<br/></p>
</li>
<li><p><strong>ECS</strong>
ECS는 AWS에서 제공하는 도커 컨테이너 서비스이다.<br/></p>
</li>
<li><p><strong>라이트세일</strong><br/><br/></p>
</li>
<li><p><strong>빈스톡</strong></p>
</li>
</ul>
<p><br/> <br/></p>
</li>
</ul>
<ul>
<li><p>스토리지
스토리지란 파일을 보관하거나 관리하는 저장 장소를 의미한다.</p>
<ul>
<li><p><strong>S3 (Simple Storage Service)</strong>
아마존 웹 서비스에서 가장 역사가 오래된 서비스이며, 다른 상용 클라우드에 비해 월등한 성능을 보여주는 스토리지 서비스이다. S3는 뛰어난 안정성과 보안이 완벽한 스토리지를 손쉽게 만들 수 있게 해주며 <u>서비스 운영 시 생성되는 이미지, 동영상, 오디오 파일들을 저장</u>할 수 있게 한다.<br/></p>
</li>
<li><p><strong>글래시어 (Glacier)</strong>
<u>AWS(Amazon Web Services)의 Glacier는 저비용으로 데이터를 장기 보관(ex 백업, 아카이브 등)하는 데 사용되는 클라우드 기반의 스토리지 서비스</u>이다. S3 서비스는 언제든 빠른 시간 내에 트래픽을 처리할 수 있게 만들어졌기 때문에 항상 리소스를 대기하는 상태로 유지한다. 저렴한 저장 비용을 자랑하고, S3에 비해서 트래픽 요금이 다소 높기 때문에 저장된 데이터의 사용 빈도가 낮은 경우에는 글래시어(Glacier) 서비스가 적합하다.<br/></p>
</li>
<li><p><strong>스토리지 게이트웨이 (Storage Gateway)</strong>
스토리지 게이트웨이 서비스는 기존 온프로미스 환경과 AWS를 연결해주는 게이트웨이 서비스이다.<br/></p>
</li>
<li><p><strong>EBS (Elastic Block Storage)</strong>
EBS는 EC2와 연결할 수 있는 저장 장치 서비스이다.</p>
</li>
</ul>
</li>
</ul>
<br/>


<ul>
<li><p>데이터베이스</p>
<ul>
<li><strong>RDS</strong>
전통적인 관계형 데이터베이스(RDBMS)를 구축하는 서비스이다.<br>       
- **<span style="color:Red">다이나모 DB (Dynamo DB)</span> ✔️**
다이나모 DB는 No-SQL 기반의 완전 관리형 데이터베이스이다.
<br> 
- **엘라스틱 캐시 (Elasticache)**
RDS와 다이나모 DB가 SSD 영역에서 입출력이 수행되는데 반해, 엘라스틱 캐시(Elasticache)는 메모리에 데이터를 저장하여 더욱 빠르게 입출력이 가능하다.
<br>
- **Red Shift**
<br>
</li>
</ul>
</li>
<li><p>네트워크
AWS에서 아키텍처 3계층에 대한 서비스를 다루며, 간단히 인터넷 연결과 내부 인터넷(인프라)에 대한 서비스를 담당한다.</p>
<ul>
<li><p><strong>VPC</strong>
VPC(Virtual Private Cloud)는 AWS에서 ‘가상 네트워크망’(VPN, Virtual Private Network) 구축 지원 서비스이다. 서비스 보안 수준을 결정하거나 EC2나 RDS와 같은 AWS 서비스들에 적합한 권한이 있는 사용자들만 접속할 수 있게 한다.<br/></p>
</li>
<li><p><strong>Route53</strong>
AWS에서 제공하는 DNS(Domain Name System) 서비스이다. 도메인을 AWS 리소스와 연결할 때 사용된다.<br/></p>
</li>
<li><p><strong><span style="color:Red">클라우드 프론트 (CloudFront)</span> ✔️</strong></p>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><p>인공지능</p>
<ul>
<li><strong>폴리</strong><br/>


</li>
</ul>
</li>
</ul>
<ul>
<li><strong>렉스</strong><br/>


</li>
</ul>
<ul>
<li><strong>레코그니션</strong>
<br/><br/></li>
</ul>
<ul>
<li><p>데이터 분석</p>
<ul>
<li><p><strong>퀵사이트 (QuickSight)</strong></p>
<br/></li>
<li><p><strong><span style="color:Red"> 아테나 (Athena) </span> ✔️</strong> </p>
<p>AWS(Amazon Web Services)에서의 &quot;서버리스&quot;는 서버 관리에 대한 개발자의 부담을 줄이고 애플리케이션을 구축하고 실행하는 방식을 말합니다. 
서버리스 컴퓨팅은 개발자가 서버 인프라를 프로비저닝하거나 관리하는 데 필요한 작업을 최소화하여 개발과 배포를 단순화합니다.
아테나는 서버리스 기반 SQL 쿼리 서비스이다. 서버리스 서비스이기 때문에 따로 구축해야 할 서버가 필요하지 않고, S3에 저장된 데이터를 SQL문을 통해 원하는 결과를 얻을 수 있다.</p>
<br/>
</li>
<li><p><strong>클라우드 서치 (CloudSearch)</strong></p>
<br/></li>
<li><p><strong>EMR</strong></p>
<br/></li>
<li><p><strong><span style="color:Red">키네시스 (Kinesis)</span> ✔️</strong>
키네시스 서비스는 실시간 데이터 처리를 위한 서비스이다. AWS 데이터베이스 서비스나 외부의 데이터를 실시간으로 분석하여 처리하고 결과를 보여준다.<br/></p>
<br/>
</li>
</ul>
</li>
<li><p>개발자 도구</p>
<ul>
<li><p><strong>코드 빌드</strong></p>
</li>
<li><p><strong>코드 커밋</strong></p>
</li>
<li><p><strong>코드 디플로이</strong></p>
</li>
<li><p><strong>코드 파이프라인</strong></p>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><p><strong>AWS 마켓플레이스</strong></p>
<p>  AWS 마켓플레이스는 구매자가 AWS에서 실행되는 소프트웨어를 검색, 구매 및 빠르게 배포할 수 있는 온라인 스토어이다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[당신이 지금 알아야 할 AWS] _1장 쉽게 시작하는 클라우드]]></title>
            <link>https://velog.io/@minjoott_dev/%EB%8B%B9%EC%8B%A0%EC%9D%B4-%EC%A7%80%EA%B8%88-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-AWS-1%EC%9E%A5-%EC%89%BD%EA%B2%8C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C</link>
            <guid>https://velog.io/@minjoott_dev/%EB%8B%B9%EC%8B%A0%EC%9D%B4-%EC%A7%80%EA%B8%88-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-AWS-1%EC%9E%A5-%EC%89%BD%EA%B2%8C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C</guid>
            <pubDate>Sun, 03 Dec 2023 12:04:29 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>AWS 클라우드 입문서 &quot;당신이 지금 알아야 할 AWS&quot; 를 읽고 정리한 글입니다.</p>
</blockquote>
<p><strong>에지 컴퓨팅 (Ege Computing)</strong>
IoT 기기나 네트워크 가장자리에서 데이터를 분산 처리하는 ‘분산 클라우드 컴퓨팅’
⇒ 클라우드 컴퓨팅은 각종 디바이스에서 수집한 데이터를 멀리 떨어져 있는 데이터 센터에서 처리한 뒤, 이를 다시 기기로 송신하는 과정을 거치는 과정을 거친다. 이 과정에서 필연적으로 발생하는 지연 시간을 보완해주는 기술이 바로 ‘에지 컴퓨팅’이다.</p>
<p><strong>클라우드 컴퓨팅 (Cloud Computing)</strong>
현재는 서버를 소유하는 것이 아니라, 필요할 때마다 사용하는 클라우드 컴퓨팅 환경으로 발전하고 있다.
클라우드 컴퓨팅은 컴퓨터의 각종 연산 및 처리를 개인 PC가 아닌 인터넷 공간, 다시 말해 클라우드에서 처리하는 방식을 말한다.</p>
<p>** <span style="color:GoldenRod">오토 스케일링 (Auto Scaling)</span> ✔️ **
트래픽 폭주에 맞춰 기업이 별도로 인프라를 확충하지 않아도 알아서 인프라를 늘렸다가, 트래픽이 줄어들면 이에 맞춰 인프라를 줄이는 자동 트래픽 증감 기술, ‘오토 스케일링’이 개발되어 기업이 더욱 편리하게 관리할 수 있게 해준다.</p>
<p>**<span style="color:GoldenRod">온프레미스 (On-premise)</span> ✔️ **
기업이 자체적으로 데이터 센터를 보유하고 시스템 구축부터 운영까지, 모두 수행하는 형태</p>
<br>

<h4 id="클라우드-서비스를-배포하는-방식-3가지">클라우드 서비스를 배포하는 방식 3가지</h4>
<ul>
<li><strong>공용 클라우드(Public Cloud)</strong>
공용 클라우드를 사용할 경우 모든 하드웨어, 소프트웨어,및 기타 지원 인프라를 클라우드 공급자가 소유하고 관리한다. 사용자는 웹 브라우저를 사용해 서비스에 액세스하고 계정 관리만 하면 된다.</li>
<li><strong>사설 클라우드(Private Cloud)</strong>
사설 클라우드는 단일 비즈니스 또는 조직에서 독점적으로 사용되는 클라우드 컴퓨팅 리소스를 의미한다. 서비스와 인프라가 개인 네트워크 환경에서 유지 및 관리되는 클라우드이다.</li>
<li><strong>하이브리드 클라우드(Hybrid Cloud)</strong>
하이브리드 클라우드는 공용 클라우드와 사설 클라우드 사이 데이터와 응용 프로그램을 공유할 수 있는 기술로, 함께 연결된 공용 클라우드와 사설 클라우드를 결합하는 구조를 의미한다.</li>
</ul>
<br>

<h4 id="클라우드-컴퓨팅-서비스-유형">클라우드 컴퓨팅 서비스 유형</h4>
<p>클라우드 서비스는 어떤 자원을 제공하느냐(중앙의 컴퓨팅 활용도)에 따라 이처럼 크게 3가지로 구분된다.</p>
<ul>
<li><strong>IaaS(Infrastructure as a Service)</strong></li>
<li><strong>PaaS(Platform as s Service)</strong></li>
<li><strong>Saas(Software as a Service)</strong></li>
</ul>
<br>


<h3 id="클라우드-핵심-기술">클라우드 핵심 기술</h3>
<pre><code>가상 서버
- 가상 서버는 하나의 물리적인 서버와 마찬가지로 개별 운영체제나 애플리케이션을 실행시킬 수 있다. 
- 가상 서버는 하나의 물리적 서버를 논리적으로 나누어 CPU, 메모리 등의 자원을 할당한 것이다. 
- AWS는 포털 화면에서 가상 서버를 설정하면 몇 분 만에 사용할 수 있고, 중지 · 다시 시작 · 삭제 등도 쉽게 제어할 수 있다. 
- AWS에는 대표적으로 EC2가 있으며, 가상 서버의 서비스 가격은 가상 CPU의 성능 및 메모리 용량 등에 따라 가격이 결정된다.</code></pre><p><img src="https://velog.velcdn.com/images/minjoott_dev/post/96a7785e-6018-418a-81fd-aa4d5cc7c512/image.jpeg" alt=""></p>
<ul>
<li>가상화 기술  <ul>
<li><strong>호스트 가상화</strong>
하드웨어 위에 기본이 되는 호스트 운영체제를 설치하고, 호스트 운영체제에 가상화 SW(하이퍼바이저)를 설치한다. 호스트 가상화는 가상화 SW 위에 게스트 운영체제를 작동시키는 가상화를 말한다. 호스트 운영체제 위에 게스트 운영체제를 작동시키기 때문에 필요 이상으로 CPU나 메모리 사용이 증가하는 오버헤드가 발생한다.</li>
<li><strong>하이퍼바이저 가상화</strong>
하드웨어에 가상화를 전담하는 SW인 하이퍼바이저를 배치해 HW와 가상 환경을 제어한다. 호스트가 없는 HW를 직접 제어하기 때문에 컴퓨팅 자원을 효율적으로 사용할 수 있다. 하지만 환경별로 다른 운영체제가 작동하기 때문에 가상 환경을 사용하기 위한 오버헤드가 발생한다.</li>
<li><strong>컨테이너 가상화</strong>
호스트 가상화, 하이퍼바이저 가상화처럼 운영체제를 여러 개 가동시키면 이것만으로도 많은 자원이 필요하다. 따라서 운영체제에 논리적인 영역(컨테이너)을 만들고, 애플리케이션을 작동하는 데 필요한 라이브러리와 애플리케이션 등을 컨테이너 안에 넣어, 마치 개별 서버처럼 사용할 수 있게 한 것이 바로 이 컨테이너 가상화이다. 최근 가상화 및 클라우드 컴퓨팅 영역에서 가장 각광받고 있는 것이 바로 도커(Docker)이다.</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p><strong>분산 처리 기술</strong></p>
</li>
<li><p><strong>서버리스 (Serverless)</strong></p>
</li>
<li><p><strong>로드 밸런싱 (Load Balancing)</strong>
로드 밸런싱은 컴퓨터 자원 분산 기술의 일종으로 둘 혹은 셋 이상의 중앙처리장치 혹은 저장 장치와 같은 컴퓨터 자원들의 작업을 나누는 것을 의미한다.</p>
</li>
<li><p><strong>스케일 업과 스케일 아웃</strong></p>
<ul>
<li><strong>스케일 업(Scale-Up)</strong>
서버 자체의 성능을 업그레이드하여 처리 능력을 향상시키는 방법</li>
<li><strong>스케일 아웃(Scale-Out)</strong>
물리적으로 서버를 늘려서 시스템을 확장하는 방법 ⇒ 로드 밸런싱 기술이 필수</li>
</ul>
</li>
<li><p><strong>오토 스케일(Auto Scale)</strong>
오토 스케일은 서비스가 집중되었을 때 서버 CPU 및 메모리 사용량이 일정 사용량을 초과하면 자동으로 가상 서버 대수를 증감시키는 기능을 말한다.</p>
</li>
<li><p><strong>데브옵스(DevOps)</strong>
개발팀(Development)과 운영팀(Operation) 간의 소통이 원활히 이루어질 수 있도록 하는 것</p>
</li>
<li><p><strong>서비스 프로비저닝</strong></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS Certified Cloud Practitioner 덤프 문제 풀이 Q1~Q25  (1)]]></title>
            <link>https://velog.io/@minjoott_dev/%EB%8D%A4%ED%94%84-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-%EC%A3%BC%EC%9A%94-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@minjoott_dev/%EB%8D%A4%ED%94%84-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-%EC%A3%BC%EC%9A%94-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 03 Dec 2023 11:43:05 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p><strong>Amazon CloudFront</strong>
Amazon CloudFront는 .html, .css, .js 및 이미지 파일과 같은 정적 및 동적 웹 콘텐츠를 사용자에게 더 빨리 배포하도록 지원하는 웹 서비스이다. CloudFront는 엣지 로케이션이라고 하는 데이터 센터의 전 세계 네트워크를 통해 콘텐츠를 제공한다. CloudFront를 통해 서비스하는 콘텐츠를 사용자가 요청하면 지연 시간이 가장 낮은 엣지 로케이션으로 요청이 라우팅되므로 가능한 최고의 성능으로 콘텐츠가 제공된다.
ref) <a href="https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/Introduction.html">Amazon CloudFront란 무엇입니까?</a></p>
<br/>
</li>
<li><p><strong>AWS Well-Architected 프레임워크</strong>
AWS Well-Architected 프레임워크는 AWS 클라우드 아키텍처를 설계하고 구축할 때 최적의 방법을 제시하는 프레임워크이다. 이는 안정성, 보안, 성능 효율성, 비용 최적화 및 운영 우수성과 같은 핵심 원칙에 기반을 두고 있다.</p>
<p>Well-Architected 프레임워크는 아래 다섯 가지 핵심 피라미드로 구성되어 있다.</p>
<ol>
<li><strong>Operational Excellence (운영 우수성)</strong>: 이 원칙은 운영 프로세스 및 프로시저를 최적화하고, 작업을 자동화하며, 사람과 기술을 통합하여 지속적인 개선을 가능케 한다.</li>
<li><strong>Security (보안)</strong>: 보안은 어플리케이션, 데이터 및 인프라를 보호하고 최소한의 권한으로 액세스를 관리하는 데 중점을 둔다. 이는 보안 요건을 충족시키는 보안적 무결성과 데이터 보호를 중요시한다.</li>
<li><strong>Reliability (신뢰성)</strong>: 시스템이 예상대로 동작하고, 장애에 대비하며, 장애 발생 시 빠르게 회복할 수 있도록 하는 것이 중요하다.</li>
<li><strong>Performance Efficiency (성능 효율성)</strong>: 이 원칙은 리소스를 최대한 효율적으로 활용하여 성능을 극대화하고, 비용을 최소화하는 방법을 다룬다.</li>
<li><strong>Cost Optimization (비용 최적화)</strong>: 이는 클라우드 자원을 최대한 효율적으로 활용하여 비용을 절감하고, 예산 내에서 운영하는 것을 목표로 한다.<br/>
</li>
</ol>
</li>
<li><p><strong>AWS Organizations</strong>
AWS Organizations는 AWS 리소스 및 계정을 중앙 집중식으로 관리하고 조직화하기 위한 서비스이다. <u>이 서비스를 사용하면 여러 AWS 계정을 하나의 조직으로 그룹화</u>하고 이러한 계정 간에 리소스 및 보안 정책을 중앙 집중적으로 관리할 수 있습니다.</p>
<br/>
</li>
<li><p><strong>AWS Lambda를 사용하는 회사의 책임</strong></p>
<ul>
<li>코드 내부 보안</li>
<li>코드 작성 및 업데이트<br/>
</li>
</ul>
</li>
<li><p><strong>Amazon EC2 인스턴스에 대해 재해 복구 솔루션을 제공하는 AWS 서비스 또는 기능</strong></p>
<ul>
<li>EC2 AMI(Amazon Machine Image) </li>
<li>Amazon EBS(Elastic Block Store) 스냅샷<br/>
</li>
</ul>
</li>
<li><p><strong>AWS 서비스에 연결하고 배포할 수 있는 AWS 서비스 또는 기능</strong></p>
<ul>
<li>AWS SDKs(Software Development Kits)</li>
<li>AWS CLI<br/>
</li>
</ul>
</li>
<li><p><strong>Cost Explorer 비용 탐색기</strong>
AWS Cost Explorer는 AWS에서 제공하는 비용 관리 도구 중 하나입니다. 이 도구를 사용하면 AWS 계정에서 발생한 비용 및 사용량을 시각화하고 분석할 수 있습니다.</p>
<br/>
</li>
<li><p><strong>Saving Plans</strong>
Saving Plan은 1년 또는 3년 기간에 특정 사용량 약정(시간당 USD 요금으로 측정)을 조건으로, 온디맨드 요금에 비해 보다 저렴한 요금을 제공하는 유연한 요금 모델이다.</p>
<br/>
</li>
<li><p><strong>Cost Allocation Tags 비용 할당 태그</strong>
사용자 또는 AWS가 AWS 리소스에 할당하는 레이블이다. 비용 할당 태그를 이용하면 AWS 비용을 더 자세히 추적할 수 있다. 비용 할당 태그를 활성화하면, AWS는 비용 할당 태그를 이용해 할당 보고서의 리소스 비용을 정리하기 때문에 <u>사용자는 쉽게 AWS 비용을 분류하고 추적할 수 있다</u>.
회사가 특정 AWS 리소스를 사용하는 사업부를 결정하기 위해 사용할 수 있는 AWS 서비스 또는 기능이다.</p>
<br/>
</li>
<li><p><strong>AMS (AWS Managed Services) AWS 관리형 서비스</strong>
AWS 클라우드 컴퓨팅에 대한 전문 지식이 부족한 회사에서 워크로드를 AWS로 마이그레이션 하려고 할 때, 도움이 되는 AWS 서비스</p>
<br/>
</li>
<li><p><strong>Service Quotas 서비스 할당량</strong>
Service Quotas를 사용하여 할당량 확인, 할당량 요청, 할당량 관리, AWS 서비스 할당량 모니터링과 같은 작업을 수행할 수 있다.
Service Quotas를 사용하면 AWS 서비스를 효율적으로 관리하고 리소스의 사용량을 최적화하여 비용을 절감할 수 있다. 서비스 별 할당량을 이해하고 필요에 따라 할당량을 조정하여 리소스 사용을 최적화하는 데 도움이 된다.
회사에서 서비스 한도 증가를 중앙에서 요청하고 추적하기 위해 사용하는 AWS 서비스이다.</p>
<br/>
</li>
<li><p><strong>AWS Artifact에서 제공하는 문서</strong>
ex)AWS ISO 인증</p>
<pre><code>AWS Artifact는 AWS에서 제공하는 서비스 중 하나로, 사용자들이 AWS 보안 및 규정 준수 관련 문서에 액세스할 수 있는 플랫폼입니다. 
AWS Artifact는 다양한 보안 및 규정 준수 문서를 제공하며, 이는 사용자들이 각종 감사, 규제, 보안 검토 및 인증을 위해 필요한 문서를 쉽게 찾고 다운로드할 수 있도록 합니다.</code></pre></li>
<li><p><strong>AWS Config</strong></p>
</li>
<li><p><strong>AWS Trusted Advisor</strong></p>
</li>
<li><p><strong>AWS Service Catalog</strong></p>
</li>
<li><p><strong>AWS Budgets</strong></p>
</li>
<li><p><strong>Amazon SQS (Amazon Simple Queue Service)</strong>
Amazon SQS를 사용하면 메시지 손실을 우려하거나 다른 서비스를 제공할 필요 없이 소프트웨어 구성 요소 간에 어떤 볼륨의 메시지든 전송, 저장 및 수신할 수 있다.</p>
<br/>
</li>
<li><p><strong>AWS Site-to Site VPN 연결</strong>
기본적으로 Amazon VPC로 시작하는 인스턴스는 자체(원격) 네트워크와 통신할 수 없다. AWS Site-to-Site VPN(Site-to-Site VPN) 연결을 생성하고 연결을 통해 트래픽을 전달하도록 라우팅을 구성하여 VPC에서 원격 네트워크에 대한 액세스를 활성화할 수 있다.
<u>VPN 연결</u>이라는 용어는 <u>VPC와 자체 온프레미스 네트워크 간의 연결을 의미</u>한다.</p>
<br/>
</li>
<li><p><strong>VPC Peering</strong>
Virtual Private Cloud(VPC)는 사용자의 AWS 계정 전용 가상 네트워크이다. VPC는 AWS 클라우드에서 다른 가상 네트워크와 논리적으로 분리되어 있다. AWS 리소스(ex. Amazon EC2 인스턴스)를 VPC에서 시작할 수 있다.
VPC 피어링 연결은 프라이빗 IPv4 주소 또는 IPv6 주소를 사용하여 두 VPC 간에 트래픽을 라우팅할 수 있도록 하기 위한 두 VPC 사이의 네트워킹 연결이다.
<u>AWS는 VPC의 기존 인프라를 사용하여 VPC 피어링 연결을 생성한다</u>. 이는 게이트웨이도, VPN 연결도 아니며 물리적 하드웨어 각각에 의존하지 않는다.</p>
<br/>
</li>
<li><p><strong>AWS 공동 책임 모델</strong>
<img src="https://velog.velcdn.com/images/minjoott_dev/post/dd7b268a-4c2d-4e71-84c7-a0f42565cb1b/image.jpg" alt=""></p>
</li>
<li><p><em>AWS 책임 &#39;클라우드의 보안&#39;*</em> – AWS는 AWS 클라우드에서 제공되는 모든 서비스를 실행하는 인프라를 보호할 책임이 있습니다. 이 인프라는 AWS 클라우드 서비스를 실행하는 하드웨어, 소프트웨어, 네트워킹 및 시설로 구성됩니다.</p>
</li>
<li><p><em>고객 책임 &#39;클라우드에서의 보안&#39;*</em> – 고객 책임은 고객이 선택하는 AWS 클라우드 서비스에 따라 달라집니다. 이에 따라 고객이 보안 책임의 일부로 수행해야 하는 구성 작업량이 정해집니다. 예를 들어, Amazon Elastic Compute Cloud (Amazon EC2) 같은 서비스는 Iaas(Ifrastructure as a Service)로 분류되고 고객이 필요한 모든 보안 구성 및 관리 작업을 수행하도록 요구합니다. Amazon EC2 인스턴스를 배포하는 고객은 게스트 운영 체제의 관리(업데이트, 보안 패치 등), 고객이 인스턴스에 설치한 모든 애플리케이션 소프트웨어 또는 유틸리티의 관리, 인스턴스별로 AWS에서 제공한 방화벽(보안 그룹이라고 부름)의 구성 관리에 대한 책임이 있습니다. Amazon S3 및 Amazon DynamoDB와 같은 추상화 서비스의 경우, AWS는 인프라 계층, 운영 체제, 플랫폼을 운영하고 고객은 데이터를 저장하고 검색하기 위해 엔드포인트에 액세스합니다. 고객은 데이터 관리(암호화 옵션 포함), 자산 분류, 적절한 허가를 부여하는 IAM 도구 사용에 책임이 있습니다.
<a href="https://aws.amazon.com/ko/compliance/shared-responsibility-model/">공동 책임 모델</a></p>
<br/>


</li>
</ul>
<p><strong>Qustion #14</strong><br>회사는 Amazon S3를 사용하는 data lake를 만들 계획이다. 비용에 가장 큰 영향을 미치는 요소는 무엇입니까?
A. S3 스토리지 계층 선택</p>
<p><strong>Qustion #20</strong><br>AWS 계정 루트 사용자 자격 증명을 사용해야 하는 작업
A. AWS Support 플랜 변경</p>
<p><strong>Qustion #21</strong>
회사는 서로 다른 사용자의 수백 건의 요청을 동시에 처리해야 합니다.
회사는 운영상 효율적인 솔루션을 구축하기 위해 어떤 AWS 서비스 조합을 사용해야 합니까?
A. Amazon Simple Queue Service(Amazon SQS) 및 AWS Lambda</p>
<p><strong>Qustion #22</strong>
AWS 네트워크 내에서 VPC의 범위는 어떻게 됩니까?
A. VPC는 AWS 리전 내의 모든 가용 영역에 걸쳐 있을 수 있습니다.</p>
<p><strong>Qustion #23</strong>
다음 중 AWS Site-to-Site VPN 연결의 구성 요소는 무엇입니까? (두 가지를 선택하세요.)
A. Virtual private gateway, Customer gateway</p>
]]></description>
        </item>
    </channel>
</rss>