<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Seok.velog</title>
        <link>https://velog.io/</link>
        <description>네이티브 앱개발에 관심많은 주니어 개발자</description>
        <lastBuildDate>Tue, 08 Feb 2022 02:43:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. Seok.velog. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/cheon-js" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Kotlin 기본 문법]]></title>
            <link>https://velog.io/@cheon-js/Kotlin-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@cheon-js/Kotlin-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Tue, 08 Feb 2022 02:43:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>코틀린은 Google I/O 2017에서 안드로이드의 공식 언어로 채택되었다. 그리고 이번에 다양한 회사에서 이제 코틀린으로 어플리케이션을 개발하고 있다. 필자는 Java를 통해 Android 개발을 하고 있었지만, 코틀린으로 개발하는 방향으로 코틀린 공부를 시작하였다.</p>
</blockquote>
<ul>
<li><strong>표현력이 높고 간결함</strong>: 적은 노력으로 많은 작업을 할 수 있습니다. 상용구 코드를 적게 사용하면서도 아이디어를 풍부하게 표현할 수 있습니다.
Kotlin을 사용하는 전문 개발자 중 67%가 Kotlin을 통해 생산성이 높아졌다고 말합니다.</li>
<li><strong>더 안전한 코드</strong>: Kotlin에는 null 포인터 예외와 같은 일반적인 프로그래밍 실수를 방지하는 데 도움이 되는 여러 언어 기능이 있다. Kotlin 코드가 포함된 Android 앱은 다운될 가능성이 20% 낮다.</li>
<li><strong>호환성</strong>: Kotlin에서 자바 기반 코드를 호출하거나 자바 기반 코드에서 Kotlin을 호출한다. Kotlin은 자바 프로그래밍 언어와 100% 호환되므로 프로젝트에서 Kotlin을 원하는 만큼 사용할 수 있다.</li>
<li><strong>구조화된 동시 실행</strong>: Kotlin 코루틴을 사용하면 비동기 코드를 차단 코드처럼 쉽게 사용할 수 있다. 코루틴은 네트워크 호출부터 로컬 데이터 액세스에 이르기까지 백그라운드 작업 관리를 크게 단순화한다.</li>
</ul>
<h2 id="👉-기본-문법">👉 기본 문법</h2>
<ul>
<li>코틀린은 ;을 사용하지 않고, 아래와 같이 변수 타입이 뒤에 붙는 형태이다.</li>
<li>변수 타입을 지정하지 않을 수 도 있다.<pre><code class="language-java">//java
int x = 10;</code></pre>
<pre><code class="language-kotlin">//kotlin
val x: Int = 10
var x = 15</code></pre>
</li>
</ul>
<h2 id="👉-기본-문법1--var-val">👉 기본 문법1 : var, val</h2>
<blockquote>
<p>코틀린에는 2가지 변수 선언 방식이 존재한다.</p>
</blockquote>
<ul>
<li>var : 일반적인 변수(값이 변경 가능하다.)</li>
<li>val : 변할 수 없는 상수(자바에서 final과 같다.)</li>
</ul>
<p>val는 변할 수 없는 상수로 로컬 변수이다. 즉, 초기화 이후에는 값을 변경할 수 없다. 그리고 val는 꼭 초기화를 해주어야 한다.</p>
<pre><code class="language-kotlin">//int 타입으로 x변수를 10으로 초기화
val x: Int = 10

//val 타입은 변수의 값 변경이 불가하여 오류가 발생
x = 15

//val 타입은 초기화 해주지 않으면 오류가 발생
val x: Int</code></pre>
<p>var는 일반적인 변수로 변수의 값을 변경할 수 있다.</p>
<pre><code class="language-kotlin">//int 타입으로 x 변수를 10으로 초기화
var x : Int = 10

//var 타입은 변수의 값을 변경 가능
x = 15</code></pre>
<h2 id="👉-기본-문법2--함수-생성">👉 기본 문법2 : 함수 생성</h2>
<p>자바의 경우 아래와 같이 함수를 생성한다.</p>
<pre><code class="language-java">public int sum(int a, int b){
    return a+b;
}</code></pre>
<p>코틀린의 경우 아래와 같이 함수를 생성한다.</p>
<pre><code class="language-kotlin">fun sum(a: Int, b: Int): Int{
    return a+b
}</code></pre>
<p>좀 더 단순하게 생성할 수도 있다.</p>
<pre><code class="language-kotlin">fun sum(a: Int, b: Int) = a+b // 타입을 생략하여 바로 return 할 수도 있다.</code></pre>
<p>함수에 조건식을 추가하면 아래와 같이 표현이 가능하다.</p>
<pre><code class="language-kotlin">fun min(a: Int, b: Int) = if(a &gt; b) b else a</code></pre>
<h2 id="👉-기본-문법3--코틀린에서-null-값">👉 기본 문법3 : 코틀린에서 null 값</h2>
<blockquote>
<p>코틀린의 기본 변수는 null을 가질 수 없다. 따라서 null 값을 사용하기 위해 추가적인 작업이 필요하다.</p>
</blockquote>
<p>아래와 같이 x에 null 값을 넣어주면 오류가 발생하지만, y와 같이 ?를 추가해주면 null이 가능한 변수임을 명시해줄 수 있다.</p>
<pre><code class="language-kotlin">var x: Int = 10
x= null // 오류 발생

var y: Int? = 10
y = null // 정상 수행</code></pre>
<p>코틀린은 null을 안전하게 사용하기 위해 ?.연산자를 사용한다.
자바에서 if(str != null) return str.toUpperCase() else return null 과 같은 것이다.</p>
<pre><code class="language-kotlin">val str = &quot;abc&quot;

// ?.앞의 변수가 null이 아닐 때만 함수가 실행되고 앞의 변수가 null이면 null을 반환
println(str?.toUpperCase()) </code></pre>
<p>nullable로 !!도 존재하는데, !!는 강제로 null이 아님을 선언하는 것이다. 즉, !!를 사용하면 x는 이후부터 not null로 인식한다. 하지만 그 값이 null이면 Null Point Exception이 발생한다.</p>
<pre><code class="language-kotlin">val s: String? = null
val x: String = s!!</code></pre>
<h2 id="👉-기본-문법4--loop-반복문">👉 기본 문법4 : loop 반복문</h2>
<blockquote>
<p>코틀린에서 for 반복문은 자바와 비슷하다.</p>
</blockquote>
<pre><code class="language-java">//java
ArrayList&lt;String&gt; arrayList = new ArrayList&lt;&gt;();
for(Stirng str: arrList){
    System.out.println(str);
}</code></pre>
<pre><code class="language-kotlin">//kotlin
var arrayList: ArrayList&lt;String&gt; = ArrayList&lt;&gt;()
for(str in arrayList){
    println(str)
}</code></pre>
<ul>
<li>range for 문<pre><code class="language-java">//java
for(int i=0; i&lt;5; i++){
  System.out.println(i);
}</code></pre>
<pre><code class="language-kotlin">//kotlin
</code></pre>
</li>
</ul>
<p>// 1에서 5까지 출력
for(i in 1..5){
    println(i)
}</p>
<p>// 역순으로 5부터 1까지 출력
for(i in 5 downTo 1){
    println(i)
}</p>
<p>// 일정 간격으로 출력
for(i in 1..5 step 2){
    println(i)
}</p>
<p>// 끝 번호 제외하고 출력
for(i in 1 until 5){
    println(i)
}</p>
<pre><code>## 👉 기본 문법5 : if, when 조건문

&gt; 코틀린에서 if문은 자바와 거의 동일하다.

```kotlin
val x = 10
val y = 15

if(x &lt; y) println(true)</code></pre><blockquote>
<p>코틀린에서 when은 자바의 switch문과 동일하다.</p>
</blockquote>
<pre><code class="language-java">//java
int x = 5;

switch(x){
    case 1:
        System.out.println(&quot;1&quot;);
        break;
    case 5:
        System.out.println(&quot;5&quot;);
        break;
    default:
        break;
}</code></pre>
<pre><code class="language-kotlin">//kotlin
val x = 5

when(x){
    1 -&gt; println(&quot;1&quot;)
    5 -&gt; println(&quot;5&quot;)
    else -&gt; println(&quot;10&quot;)
}</code></pre>
<h2 id="정리">정리</h2>
<blockquote>
<p>코틀린의 기본 문법에 대해 공부해보고 자바랑 어떻게 다른지에 대해 알게 되었다. 확실히 자바를 사용할 때보다 코드의 수가 많이 줄 것 같다는 것을 체감할 수 있었다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조 - 제로 문제]]></title>
            <link>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%A0%9C%EB%A1%9C-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%A0%9C%EB%A1%9C-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sat, 29 Jan 2022 15:35:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/c0f6a93d-407a-4fcb-a97c-323b77c3ef40/image.png" alt=""><img src="https://images.velog.io/images/cheon-js/post/7b1e5c85-51a7-4ef5-9c3f-a47adbb086ac/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<p><strong>이 문제는 Stack 클래스를 사용할 줄 알면 굉장히 쉽게 풀 수 있는 문제이다.</strong></p>
</blockquote>
<ol>
<li>입력 받은 K 수 만큼 숫자를 입력 받는다.</li>
<li>입력 받은 숫자가 0이냐 아니냐 라는 조건에 따라 push를 해주고 pop을 해준다.</li>
<li>마지막 숫자를 입력받고 난 뒤의 스택의 모든 값의 합을 구해준다.</li>
</ol>
<h2 id="소스-코드">소스 코드</h2>
<pre><code class="language-java">package data_structure;

import java.util.Iterator;
import java.util.Scanner;
import java.util.Stack;

public class stack_zero {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        Stack&lt;Integer&gt; stack = new Stack&lt;&gt;();
        int k = in.nextInt();
        int sum = 0;

        for(int i = 0; i&lt;k; i++){
            int input = in.nextInt();

            if(input != 0){
                stack.push(input);
            }
            else if(input == 0) {
                stack.pop();

            }


        }
        Iterator&lt;Integer&gt; iter = stack.iterator();
        while(iter.hasNext()) {
            sum += iter.next();
        }
        System.out.println(sum);
    }

}
</code></pre>
<h2 id="정리">정리</h2>
<blockquote>
<ul>
<li>이제 Stack을 이용하는 문제에 대해서는 어려움 없이 문제를 풀 수 있을 것 같다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[브루트 포스 - 분해합 문제]]></title>
            <link>https://velog.io/@cheon-js/%EB%B8%8C%EB%A3%A8%ED%8A%B8-%ED%8F%AC%EC%8A%A4-%EB%B6%84%ED%95%B4%ED%95%A9-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@cheon-js/%EB%B8%8C%EB%A3%A8%ED%8A%B8-%ED%8F%AC%EC%8A%A4-%EB%B6%84%ED%95%B4%ED%95%A9-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sat, 29 Jan 2022 11:54:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/01db44f0-13ae-4668-b01f-7c7a81d15651/image.png" alt=""><img src="https://images.velog.io/images/cheon-js/post/2b347f78-8152-42f0-b4c3-bc65868d7e1a/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<p>*<em>이 문제는 숫자를 분해하여 조합해야하는 완전 탐색 문제이다. *</em></p>
</blockquote>
<ol>
<li>1부터 입력받은 N 까지 한 개씩 모두 대입해본다.</li>
<li>만약 탐색 도중 생성자를 찾으면 종료하고 해당 생성자를 출력하며, N을 넘길 때 까지 찾지 못하면 0을 출력하면 된다.</li>
</ol>
<h2 id="소스-코드">소스 코드</h2>
<pre><code class="language-java">package brute_force;

import java.util.*;

public class digit_generator {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner in = new Scanner(System.in);

        int N = in.nextInt();
        int answer = 0;

        for(int i = 0; i&lt;N; i++) {
            int number = i;
            int sum = 0;

            while(number != 0) {
                sum += number %10;
                number = number/10;
            }
            if((sum + i) == N) {
                answer = i;
                break;
            }
        }
        System.out.println(answer);
    }

}
</code></pre>
<h2 id="정리">정리</h2>
<blockquote>
<ul>
<li>다들 브루트 포스 문제는 그렇게 어렵지 않게 풀 수 있을 것이다. 완전 탐색 알고리즘만 구현하고 만족하는 값을 찾을 때 까지 돌리면 되기 때문이다. 하지만 같은 같은 브루트 포스 알고리즘이라고 불가능한 범위를 제외시키면 성능을 향상 시킬 수 있으니 그 부분을 고려해보는 과정이 중요할 것 같다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[브루트 포스 - 블랙잭 문제]]></title>
            <link>https://velog.io/@cheon-js/%EB%B8%8C%EB%A3%A8%ED%8A%B8-%ED%8F%AC%EC%8A%A4-%EB%B8%94%EB%9E%99%EC%9E%AD-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@cheon-js/%EB%B8%8C%EB%A3%A8%ED%8A%B8-%ED%8F%AC%EC%8A%A4-%EB%B8%94%EB%9E%99%EC%9E%AD-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sat, 29 Jan 2022 11:43:39 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/8499e008-f9dc-4386-8828-6d2284ca9af2/image.png" alt=""><img src="https://images.velog.io/images/cheon-js/post/246a7978-9199-4fa2-8ba9-da404417ad68/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<p><strong>브루트 포스 문제는 완전 탐색으로써 모든 경우를 다 확인하여 구하는 알고리즘이다. 
이 문제 역시 모든 경우의 수를 확인하여 푸는 문제이다.</strong></p>
</blockquote>
<ol>
<li>입력 받은 N만큼의 사이즈를 가진 배열을 선언해준다.</li>
<li>그 배열에 두번째 줄에 입력받은 수를 넣어주고 3개씩 모든 경우의 수를 조합한다.</li>
<li>조합한 3개의 수의 합을 조합할 때마다 최대의 수로 갱신해주고 그 값을 입력 받은 M의 값과 비교하여 그 수를 넘지않는 최대한 가까운 수를 구한다.</li>
</ol>
<h2 id="소스-코드">소스 코드</h2>
<pre><code class="language-java">package brute_force;

import java.util.*;

public class blackjack {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);

        int N = in.nextInt();
        int M = in.nextInt();

        int[] card = new int[N];
        int sum = 0;
        int temp = 0;

        for(int i = 0; i&lt; N; i++) {
            card[i] = in.nextInt();
        }

        for(int i =0; i&lt; N; i++) {
            for(int j = i+1; j&lt;N; j++) {
                for(int z = j+1; z&lt;N; z++) {
                    sum = card[i] + card[j] + card[z];

                    if(temp &lt; sum &amp;&amp; sum &lt;= M) {
                        temp = sum;
                    }
                }
            }
        }


        System.out.println(temp);
    }


}
</code></pre>
<h2 id="정리">정리</h2>
<blockquote>
<ul>
<li>완전 탐색 알고리즘에 대해 이해할 수 있는 시간이었고, 어떤 경우에 완전 탐색을 사용하여 문제를 풀어야하는지 감을 잡을 수 있게 되었다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[정렬 - 수 정렬하기]]></title>
            <link>https://velog.io/@cheon-js/%EC%A0%95%EB%A0%AC-%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@cheon-js/%EC%A0%95%EB%A0%AC-%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 28 Jan 2022 13:55:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/a93d1f9b-dc27-4e5e-b4b6-139f15a02a4c/image.png" alt=""><img src="https://images.velog.io/images/cheon-js/post/c898397b-7a0a-469f-b93a-ca469619c685/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<p> <strong>이 문제는 숫자를 오름차순으로 정렬하는 문제이다. JAVA에서 sort 함수로 오름차순으로 정렬해주는 함수가 존재한다. 그 함수를 사용하면 쉽게 풀 수 있다. 하지만 시간제한 5초에 메모리 제한 8MB로 제한 되어있기 때문에 입력, 출력 부분만 잘 해결하면 쉽게 풀 수 있다.</strong></p>
</blockquote>
<ol>
<li>Scanner로 입력을 받게 되면 내부적으로 자체 정규식 검사 과정에서 시간이 엄청 소요되기 때문에 &#39;시간 초과&#39;가 발생할 수 밖에 없다. 그렇기 때문에 BufferedReader 를 사용해야 한다. </li>
<li>또한 출력도 BufferedWriter 또는 StringBuilder 를 이용하여 출력해야한다.</li>
<li>필자는 BufferedReader와 StringBuilder를 사용하여 문제를 풀었다.</li>
</ol>
<h2 id="소스-코드">소스 코드</h2>
<pre><code class="language-java">package sort;

import java.util.*;
import java.io.*;

public class number_sort2 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        //Scanner in = new Scanner(System.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

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

        int[] nums = new int[N];

        for(int i = 0; i&lt;N; i++) {
            nums[i] = Integer.parseInt(br.readLine());
        }
        Arrays.sort(nums);
        for(int i=0; i&lt;N; i++) {
            sb.append(nums[i]).append(&quot;\n&quot;);
        }
        System.out.println(sb);
    }

}</code></pre>
<h2 id="정리">정리</h2>
<blockquote>
<ul>
<li>백준 문제에서는 시간복잡도와 메모리 제한을 두어 코드를 구현했을 때 답은 나와도 시간초과나 메모리 초과로 문제가 틀리는 경우가 있다. 이러한 경우처럼 시간제한과 메모리제한을 두었을 때 만족할 수 있는 방법들에 대해 배우고 대처할 수 있게 되었다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[재귀 - 피보나치]]></title>
            <link>https://velog.io/@cheon-js/%EC%9E%AC%EA%B7%80-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98</link>
            <guid>https://velog.io/@cheon-js/%EC%9E%AC%EA%B7%80-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98</guid>
            <pubDate>Thu, 27 Jan 2022 12:56:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/6c612697-ba30-422a-949d-df4358f6dcb6/image.png" alt=""><img src="https://images.velog.io/images/cheon-js/post/db536cd4-b71c-456c-88ce-1949ed7a280e/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<p><strong>문제에 나와있는 식을 참조하거나 피보나치 수열에 대해 알고 있다면 쉽게 풀 수 있는 문제일 것이다.</strong></p>
</blockquote>
<ol>
<li>문제에 나와 있는 식 F(n) = F(n-1) + F(n-2) (n&gt;=2)과 0번째 피보나치 수는 0, 1번째 피보나치 수는 1이다.를 이용하여 문제를 푼다.</li>
<li>앞서 말했던 조건을 가지고 N&gt;=2 인 경우와 N = 0인 경우, N = 1인 경우의 조건에 따라 알맞게 구현한다.</li>
</ol>
<h2 id="소스-코드">소스 코드</h2>
<p>package recursion;</p>
<p>import java.util.*;</p>
<p>public class fibonacci {</p>
<pre><code>public static void main(String[] args) {
    // TODO Auto-generated method stub

    Scanner in = new Scanner(System.in);

    int n = in.nextInt();

    int ans = fibo(n);

    System.out.println(ans);
}

public static int fibo(int N) {
    if(N &gt;= 2) {
        return fibo(N-1) + fibo(N-2);
    }
    else if(N == 0)
        return 0;
    else
        return 1;

}</code></pre><p>}</p>
<h2 id="문제를-풀고-느낀점">문제를 풀고 느낀점</h2>
<blockquote>
<ul>
<li>우선 피보나치 수열에 대해 알고 있었고, 문제에 답이 있는 경우 이므로 재귀함수를 알고 문제의 조건들만 앎맞게 구현한다면 굉장히 쉽게 풀 수 있는 기본 문제였다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[재귀 - 팩토리얼 문제]]></title>
            <link>https://velog.io/@cheon-js/%EC%9E%AC%EA%B7%80-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@cheon-js/%EC%9E%AC%EA%B7%80-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Thu, 27 Jan 2022 12:48:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/e137279c-30de-4dd4-b785-b5758db08371/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<p><strong>이 문제는 팩토리얼 문제로 재귀함수를 사용하면 반복문을 사용하지 않아도 쉽게 풀 수 있는 재귀함수의 기본적인 문제이다.</strong></p>
</blockquote>
<ol>
<li>팩토리얼 함수 factor를 구현해준다.</li>
<li>0!은 1이므로 함수를 구현할 때 조건문으로 0인 경우는 1을 리턴하게 한다.</li>
<li>입력 받은 N X factor(N-1)을 하게 하여 재귀를 건다.</li>
</ol>
<h2 id="소스-코드">소스 코드</h2>
<p>package recursion;</p>
<p>import java.util.*;</p>
<p>public class factorial {</p>
<pre><code>public static void main(String[] args) {
    // TODO Auto-generated method stub

    Scanner in = new Scanner(System.in);

    int N = in.nextInt();

    int fac = factor(N);

    System.out.println(fac);
}

public static int factor(int n) {
    if(n == 0) return 1;

    return n * factor(n-1);

}</code></pre><p>}</p>
<h2 id="문제를-풀고-느낀점">문제를 풀고 느낀점</h2>
<blockquote>
<ul>
<li>재귀 함수의 간단한 문제를 풀어보면서 재귀 함수가 어떻게 동작이 되는지 공부할 수 있는 시간이었다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Android] MVVM 패턴과 AAC]]></title>
            <link>https://velog.io/@cheon-js/Android-MVVM-%ED%8C%A8%ED%84%B4%EA%B3%BC-AAC</link>
            <guid>https://velog.io/@cheon-js/Android-MVVM-%ED%8C%A8%ED%84%B4%EA%B3%BC-AAC</guid>
            <pubDate>Tue, 25 Jan 2022 18:21:43 GMT</pubDate>
            <description><![CDATA[<h2 id="👉-mvc-vs-mvvm">👉 MVC vs MVVM</h2>
<blockquote>
<p>Android 앱 개발을 하다보면, <strong>Activity 클래스에 모든 동작 코드를 다 집어 넣는 경우가 많았다.</strong>
그러다 보니 앱이 동작하는 데에는 큰 문제가 없었지만 체계적인 구조 없이 코드를 작성하여 추후에 유지 보수하기가 굉장히 까다롭다.
여러 프로젝트를 진행하다 보면 이렇게 코드를 작성했을 때, <strong>기능을 바꿔야하거나 추가하여야 하는 경우 어떤 부분을 수정해야 할지 막막했던 경험이 있다.</strong>
이러한 경험을 토대로 요즘 대세인 <strong>MVVM 디자인 패턴을 공부하고, 적용해봐야겠다는 생각이 들었다.</strong></p>
</blockquote>
<p>기존에 많이 쓰였던 단순한 형태의 MVC 패턴에 따라 Activity에 모든 코드를 다 집어넣으면 이러한 단점들이 발생하였다.</p>
<ul>
<li>앱 기능이 많아질 수록 <strong>Activity 자체가 무거워</strong>진다.</li>
<li><strong>View</strong>와 <strong>Model</strong> 간의 <strong>의존성이 높아지고 코드가 복잡해</strong>진다.(일명 스파게티 코드)</li>
<li><strong>View</strong>와 <strong>UI Refresh</strong>를 위해 <strong>Model</strong>을 참조하므로 <strong>앱의 규모가 커질수록 코드가 더 복잡해</strong>지게 된다.</li>
</ul>
<p>이런 단점들을 보면, MVC 패턴은 <strong>규모가 커질수록 유지보수하기가 점점 어려워진다는 것을 알 수 있다.</strong></p>
<blockquote>
<p>MVC 패턴의 동작은 아래와 같다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/cheon-js/post/d153fbdf-71a2-407d-908f-dc60b2c4069e/image.png" alt=""></p>
<blockquote>
<ol>
<li><strong>Controller</strong>가 <strong>사용자의 요청</strong>을 받아들인다.</li>
<li><strong>Controller</strong>가 사<strong>용자의 동작에 따른 Model 없데이트를 요청</strong>한다.</li>
<li><strong>Controller</strong>가 <strong>Model을 나타낼 View를 선택</strong>한다.</li>
<li><strong>View</strong>는 <strong>Model을 참조하여 UI를 업데이트</strong>한다.</li>
</ol>
</blockquote>
<p>이렇게 되다 보니 View와 Model 간의 의존성이 높아질 수 밖에 없다.
또 Controller(Activity)가 Model과 View 사이에서 바쁘게 움직이고 있다.
혼자서 요청을 보내야 하기 때문에 Controller는 당연히 동작이 무거워진다.
따라서 코드 유지보수를 하다가 잘못하면 <strong>UI 랜더링 속도가 느려져 프레임 스킵 현상 및 메모리 누수 (Memory Leak)의 위험</strong>이 생길지도 모른다.</p>
<p><strong>MVC 패턴은 구현하기에는 쉬운 장점</strong>이 있지만, <strong>기능 추가 및 수정에 있어서 유지보수하기가 어렵다.</strong>
<img src="https://images.velog.io/images/cheon-js/post/1bf41cc0-51a0-4192-a3c9-7a1298d67837/image.png" alt="">
이러한 <strong>MVC 패턴의 단점을 보</strong>완하기 위해 등장한 디자인 패턴이 바로 <strong>MVVM 패턴</strong>이다.
<strong>MVVM 패턴</strong>은 기존 MVC에서 <strong>Controlle</strong>r가 혼자 일하기 보다, 이 <strong>동작 자체를 분리</strong>하여 동작의 흐름을 더욱 더 <strong>체계적으로 만들어주고 유지보수를 편리</strong>하게 할 수 있도록 해주는 디자인 패턴이다.</p>
<blockquote>
<p><strong>MVVM 패턴</strong>은 <strong>Model, View, ViewModel</strong>로 이루어져 아래와 같은 동작을 한다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/cheon-js/post/d62d42ba-4907-45e6-b3cc-73a8dc766d42/image.png" alt=""></p>
<blockquote>
<h3 id="view">View</h3>
</blockquote>
<ol>
<li><strong>Activity</strong> 나 <strong>Fragment</strong>가 <strong>View 역할</strong>을 한다.</li>
<li><strong>사용자의 요청</strong>을 받는다.</li>
<li><strong>ViewModel의 데이터를 관찰하여 UI를 갱신한다.</strong></li>
</ol>
<blockquote>
<h3 id="viewmodel">ViewModel</h3>
</blockquote>
<ol>
<li><strong>View</strong>가 요청한 데이터를 <strong>Model로 요청</strong>한다.</li>
<li><strong>Model</strong>로 부터 <strong>요청한 데이터</strong>를 받는다.</li>
</ol>
<blockquote>
<h3 id="model">Model</h3>
</blockquote>
<ol>
<li><strong>ViewModel</strong>이 <strong>요청한 데이터를 반환한다.</strong></li>
<li>Room, Realm과 같은 <strong>DB 사용</strong>이나 Retrofit을 통한 <strong>백엔드 API 호출 (네트워킹)이 보편적이다.</strong></li>
</ol>
<p>결국 <strong>View가 필요로 하는 데이터</strong>는 <strong>ViewModel</strong>이 쥐고 있고,
<strong>View</strong>는 그것을 필요로 하기 때문에 <strong>ViewModel이 쥐고 있는 데이터를 관찰한다.</strong>
그렇기에 MVC 패턴과 다르게, <strong>View가 DB에 직접 접근하는 것이 아닌 UI 업데이트에만 집중</strong>하고 관찰하고 있는 만큼 <strong>데이터 변화에 더욱 능동적으로 움직이게 된다.</strong></p>
<p><strong>MVVM 패턴의 장점</strong>은 다음과 같다.</p>
<ul>
<li><strong>View가 ViewModel의 데이터를 관찰하고 있으므로 UI 업데이트가 간편하다.</strong></li>
<li>ViewModel이 <strong>데이터를 홀드하고 있으므로 Memory Leak 발생 가능성을 배제</strong>할 수 있다.(<strong>View</strong>가 직접 <strong>Model에 접근하지 않아서</strong> Activity나 Fragment <strong>생명주기에 의존하지 않기 때문이다.</strong>)</li>
<li><strong>기능별 모듈화가 잘 되어 유지 보수에 용이하다.</strong></li>
</ul>
<p>이러한 장점을 잘 활용하여 MVVM 패턴을 가지고 앱 개발을 한다면 좋은 앱을 만들 수 있을 것 같다. 하지만 그만큼 구조가 복잡하여 진입장벽이 높다고 한다.
<img src="https://images.velog.io/images/cheon-js/post/d68e6edb-81a9-413e-afda-c06918465aea/image.png" alt=""></p>
<p>그래서 인지** MVVM 패턴을 간편하게 적용<strong>해볼 수 있게끔 구글에서 **AAC</strong>라는 것을 제공한다.</p>
<h2 id="aac-android-architecture-component">AAC (Android Architecture Component)</h2>
<p>AAC란 구글에서 발표한 안드로이드 개발 가이드이다. 구글은 많은 개발자들에게 앱을 잘 만들게 하기 위해 이런 가이드라인을 제시하였다. 구조는 아래와 같다.
<img src="https://images.velog.io/images/cheon-js/post/fc6ab013-d88f-4a08-abc0-48ebbed25323/image.png" alt=""></p>
<h3 id="viewmodel-1">ViewModel</h3>
<p>화면 변화 시에도 변하지 않는 (사라지지 않는) 데이터를 가지고 있다.</p>
<h3 id="live-data">Live Data</h3>
<p>View가 ViewModel을 관찰할 때, 그 관찰 대상이 되는 데이터 홀더 클래스이다. Live Data는 Acivity 나 Fragment의 생명주기를 인지하지 못하므로, 화면이 활성화 되어 있을 때만 동작하여 메모리 누수를 줄여준다.</p>
<h3 id="repository">Repository</h3>
<p>ViewModel과 데이터를 주고받기 위해, 데이터 API를 포함하는 클래스이다. 사용자 동작에 따라 필요한 데이터나 외부 백엔드 서버 등에서 데이터를 가져오게 된다. Repository의 존재 덕분에 ViewModel이 데이터를 관리할 필요가 없게 된다.</p>
<h3 id="roomdatabase">RoomDatabase</h3>
<p>Room은 SQLite를 사용함에 있어 별도의 Query문 작성없이 간편하게 Insert, Delete 등의 동작을 할 수 있게끔 도와주는 ORM 라이브러리이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조-프린터 큐 문제]]></title>
            <link>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%94%84%EB%A6%B0%ED%84%B0-%ED%81%90-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%94%84%EB%A6%B0%ED%84%B0-%ED%81%90-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Tue, 25 Jan 2022 16:10:51 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/eef64e40-7e9e-4e86-8d83-daec03227769/image.png" alt=""><img src="https://images.velog.io/images/cheon-js/post/068265ac-532f-4b6a-b9dc-b834605b5d54/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<p>*<em>이 문제는 큐를 응용하는 문제로 N개의 문서 중 중요도에 따라 높은 것 순으로 출력해야하는 문제이다. 문제를 풀기 전 어떤 형태의 알고리즘으로 풀어야 할지 분석하였다. *</em></p>
</blockquote>
<ol>
<li>0번째 부터 순서대로 입력을 받아 큐에 넣어준다.</li>
<li>큐에는 순서 index와 중요도를 int 배열로 삽입한다.</li>
<li>맨 앞 인덱스의 중요도를 Pop하여 나머지 중요도의 크기와 비교하고 중요도가 더 큰 것을 큐의 맨 앞으로 오게하고 count를 증가 시킨다.</li>
<li>큐의 맨 앞의 인덱스가 M의 값과 같은지 비교한다.</li>
<li>값이 다르면 다시 반복문을 돌리고 값이 같다면 break를 하여 count의 개수를 출력한다.</li>
</ol>
<h2 id="소스-코드">소스 코드</h2>
<p>package data_structure;</p>
<p>import java.util.*;</p>
<p>public class print_queue {</p>
<pre><code>public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner in = new Scanner(System.in);

    StringBuilder sb = new StringBuilder();

    int n = in.nextInt();

    for(int i = 0; i&lt;n; i++) {
        int N = in.nextInt(); // 총 문서 개수
        int M = in.nextInt(); // 원하는 문서 위치 값

        LinkedList&lt;int[]&gt; que = new LinkedList&lt;&gt;();
        int count = 0;

        for(int j = 0; j&lt;N; j++) {
            que.offer(new int[] {j, in.nextInt()} );
        }

        while(!que.isEmpty()) {
            int[] first = que.poll();
            boolean isMax = true;

            for(int z = 0; z&lt;que.size(); z++) {
                if(first[1] &lt; que.get(z)[1]) {
                    que.offer(first);
                    for(int j = 0; j&lt;z; j++) {
                        que.offer(que.poll());
                    }
                    isMax = false;
                    break;
                }

            }
            if(isMax == false) {
                continue;
            }

            count++;
            if(first[0] == M)
                break;
        }

        sb.append(count).append(&quot;\n&quot;);

    }
    System.out.print(sb);

}</code></pre><p>}</p>
<h2 id="문제를-풀고-느낀점">문제를 풀고 느낀점</h2>
<blockquote>
<ul>
<li>큐의 응용문제라 쉽게 풀 수 있을거라 생각했지만 우선 어떻게 알고리즘을 설계하여할지 감이 도통 잡히지 않아 구글링을 통해 다양한 방법을 배웠고, 그 중 나와 가장 비슷하게 구현을 시도했던 코드를 참조하여 문제를 풀었다. 이번 응용 문제를 통해 큐에 대해 완벽히 숙지할 수 있는 시간이었던 것 같다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조-큐 문제]]></title>
            <link>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%81%90-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%81%90-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Tue, 25 Jan 2022 11:13:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/fde3a815-0627-4405-960f-e76b03ebb724/image.png" alt=""><img src="https://images.velog.io/images/cheon-js/post/ed145f35-0c93-4388-9bf4-571bb2041593/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<p><strong>자료구조 중 FIFO구조인 큐의 기본적인 동작들을 구현하는 문제로 Queue 클래스를 사용하면 쉽게 풀 수 있는 문제였다.</strong></p>
</blockquote>
<h3 id="큐queue란">큐(Queue)란?</h3>
<p>큐(Queue)는 기본 자료구조 중 하나로, 줄을 지어 순서대로 처리하는 자료구조이다. 큐는 LIFO(Last-in First-out)구조를 가진 스택(Stack)과는 다르게 FIFO(First-in First-out)구조를 가진다. 즉, 먼저 들어온 데이터가 먼제 나가는 구조이다.</p>
<h3 id="큐queue의-특징">큐(Queue)의 특징</h3>
<ul>
<li>먼저 들어간 데이터가 먼저 나간다. FIFO구조</li>
<li>접근 방법은 가장 첫 원소와 끝 원소로만 가능하다.</li>
<li>프로세스 관리, 우선순위가 같은 작업 예약에 활용된다.</li>
<li>그래프의 너비 우선 탐색(BFS)에서 사용된다.</li>
</ul>
<h3 id="큐queue클래스의-사용법">큐(Queue)클래스의 사용법</h3>
<pre><code>Queue&lt;Integer&gt; que = new LinkedList&lt;&gt;();</code></pre><h4 id="큐queue의-연산">큐(Queue)의 연산</h4>
<blockquote>
<p>큐(Queue)는 오버플로우(Overflow)나 언더플로우(Underflow)가 발생하면 예외를 던지거나 null 또는 false를 반환하는 메소드들이 있다.</p>
</blockquote>
<ol>
<li>예외를 던지는 메소드</li>
</ol>
<ul>
<li>add(A) : A를 큐(Queue)에 넣는다.</li>
<li>remove() : 맨 처음에 들어간 데이터를 제거한다.</li>
<li>element() : 큐(Queue)에서 가장 앞에 있는 것을 반환한다.</li>
</ul>
<ol start="2">
<li>null 또는 false를 반환하는 메소드 </li>
</ol>
<ul>
<li>offer(A) : A를 큐(Queue)에 넣는다.</li>
<li>poll() : 맨 처음에 들어간 데이터를 제거한다.</li>
<li>peek() : 큐(Queue)에서 가장 앞에 있는 것을 반환한다.</li>
</ul>
<h2 id="소스-코드">소스 코드</h2>
<p>package data_structure;</p>
<p>import java.util.<em>;
import java.io.</em>;</p>
<p>public class queue {</p>
<pre><code>public static void main(String[] args) throws IOException{
    // TODO Auto-generated method stub
    Queue&lt;Integer&gt; que = new LinkedList&lt;&gt;();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();

    int n = Integer.parseInt(br.readLine());
    int input = 0;
    for(int i=0; i&lt;n; i++) {
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        String str = st.nextToken();

        switch(str) {

        case &quot;push&quot;:
            input = Integer.parseInt(st.nextToken());
            que.offer(input);
            break;
        case &quot;pop&quot;:
            sb.append(que.isEmpty() ?  -1 : que.poll()).append(&quot;\n&quot;);
            break;
        case &quot;size&quot;:
            sb.append(que.size()).append(&quot;\n&quot;);
            break;
        case &quot;empty&quot;:
            sb.append(que.isEmpty() ?  1 : 0).append(&quot;\n&quot;);
            break;
        case &quot;front&quot;:
            sb.append(que.isEmpty() ?  -1 : que.peek()).append(&quot;\n&quot;);
            break;
        case &quot;back&quot;:
            sb.append(que.isEmpty() ?  -1 : input).append(&quot;\n&quot;);
            break;
        }

    }
    System.out.print(sb);
}</code></pre><p>}</p>
<h2 id="문제를-풀고-느낀점">문제를 풀고 느낀점</h2>
<blockquote>
<ul>
<li>스택과 다르게 FIFO구조를 가진 큐에 대해 공부하는 시간을 가지게 되었고, 큐 클래스를 이용하여 문제를 풀 수 있는 기본 구조를 배워 잘 활용할 수 있을 것 같다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조-괄호문제]]></title>
            <link>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B4%84%ED%98%B8%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B4%84%ED%98%B8%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Tue, 25 Jan 2022 07:49:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/2b37d96a-8567-4a22-9227-d54c11fa42b5/image.png" alt=""><img src="https://images.velog.io/images/cheon-js/post/70591a8a-73c8-47cb-8a18-bb271c9a0b12/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<p>알맞은 괄호 수식의 원리를 알면 쉽게 풀 수 있는 문제였다. 원리는 여는 괄호가 &#39;(&#39;가 있으면 반드시 이에 대응하는 닫는 괄호 &#39;)&#39;가 있어야한다는 것이다. 이것을 Stack을 이용하여 풀면 간단하게 해결할 수 있다. 여는 괄호가 있을 때는 스택에 추가하고 닫는 괄호가 있으면 여는 괄호를 하나씩 지워주면 된다.</p>
</blockquote>
<ol>
<li>여는 괄호와 닫는 괄호가 올바른 경우 - 최종적으로 스택에는 아무것도 존재하지 않을 것이다. 고로 YES를 출력해준다.</li>
<li>스택에 괄호가 남는 경우 -  여는 괄호가 많은 경우로 VPS가 아니므로 NO를 출력해준다.</li>
<li>스택에 지울 여는 괄호가 부족한 경우 - 닫는 괄호가 많은 경우로 VPS가 아니므로 NO를 출력해준다.</li>
</ol>
<h2 id="소스-코드">소스 코드</h2>
<pre><code class="language-java">package data_structure;

import java.util.*;

public class parenthesis {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();

        for(int i =0; i&lt;n; i++) {
            System.out.println(solve(in.next()));

        }



    }
    public static String solve(String s) {
        Stack&lt;Character&gt; stack = new Stack&lt;&gt;();

        for(int i = 0; i&lt;s.length(); i++) {
            char c = s.charAt(i);
            if(c == &#39;(&#39;) {
                stack.push(c);
            }
            else if(stack.isEmpty()) {
                return &quot;NO&quot;;
            }
            else
                stack.pop();
        }
        if(stack.isEmpty()) {
            return &quot;YES&quot;;
        }
        else
            return &quot;NO&quot;;
    }

}
</code></pre>
<h2 id="문제를-풀고-느낀점">문제를 풀고 느낀점</h2>
<blockquote>
<ul>
<li>스택에 대해 다시 한번 생각할 시간을 가지게 되었고, 스택을 어느 상황에 어떻게 활용해야하는지 정확히 알 수 있게 되었다. 스택을 사용하면 편리한 상황이 나올 때 잘 활용할 수 있을 것 같다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조-스택 문제]]></title>
            <link>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9D-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@cheon-js/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9D-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 24 Jan 2022 17:54:09 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/cheon-js/post/159cef42-ec8a-4a15-8662-49b0be23dc93/image.png" alt=""><img src="https://images.velog.io/images/cheon-js/post/d9c0cb9f-ef59-42e7-96f4-09997b803b74/image.png" alt=""></p>
<h2 id="문제풀이">문제풀이</h2>
<blockquote>
<h4 id="자료구조-중-lifo구조인-스택의-기본적인-동작들을-구현하는-문제로-stack-클래스를-사용하면-쉽게-풀-수-있는-문제였다">자료구조 중 LIFO구조인 스택의 기본적인 동작들을 구현하는 문제로 Stack 클래스를 사용하면 쉽게 풀 수 있는 문제였다.</h4>
</blockquote>
<h3 id="stack이란">Stack이란?</h3>
<p>자료구조 중 하나인 Stack은 상자에 물건을 쌓아 올리듯이 데이터를 쌓는 자료 구조라고 할 수 있다.</p>
<h3 id="stack의-특징">Stack의 특징</h3>
<ul>
<li>먼저 들어간 자료가 나중에 나온다. LIFO(Last In First Out) 구조</li>
<li>시스템 해킹에서 버퍼오버플로우 취약점을 이용한 공격을 할 때 스택 메모리의 영역에서 한다.</li>
<li>인터럽트 처리, 수식의 계산, 서브루틴의 복귀 번지 저장 등에 쓰인다.</li>
<li>그래프의 깊이 우선 탐색(DFS)에서 사용된다.</li>
<li>재귀함수를 호출할 때 사용된다.<h3 id="stack클래스의-사용법">Stack클래스의 사용법</h3>
<pre><code>Stack&lt;Integer&gt; s = new Stack&lt;&gt;();</code></pre>s.push(i); // 스택의 값 넣기
s.pop(); // 스택의 가장 위의 값 빼고 출력하기 
s.size(); // 스택의 크기
s.peek(); // 스택의 가장 위의 값 조회</li>
</ul>
<h2 id="소스-코드">소스 코드</h2>
<pre><code class="language-java">package data_structure;

import java.util.*;

public class stack1 {


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Stack&lt;Integer&gt; stack = new Stack&lt;&gt;();
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();

        for(int i = 0; i&lt;n; i++) {
            String str = in.next();

            switch(str) {

            case &quot;push&quot;:
                int item = in.nextInt();
                stack.push(item);
                break;
            case &quot;pop&quot;:
                System.out.println(stack.isEmpty() ? -1 : stack.pop());
                break;
            case &quot;size&quot;:
                System.out.println(stack.size());
                break;
            case &quot;empty&quot;:
                System.out.println(stack.isEmpty() ? 1 : 0);
                break;
            case &quot;top&quot;:
                System.out.println(stack.isEmpty() ? -1 : stack.peek());
                break;
            }
        }
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[멀티미디어처리응용(퍼셉트론)]]></title>
            <link>https://velog.io/@cheon-js/%EB%A9%80%ED%8B%B0%EB%AF%B8%EB%94%94%EC%96%B4%EC%B2%98%EB%A6%AC%EC%9D%91%EC%9A%A9%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0</link>
            <guid>https://velog.io/@cheon-js/%EB%A9%80%ED%8B%B0%EB%AF%B8%EB%94%94%EC%96%B4%EC%B2%98%EB%A6%AC%EC%9D%91%EC%9A%A9%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0</guid>
            <pubDate>Mon, 24 Jan 2022 15:05:13 GMT</pubDate>
            <description><![CDATA[<h1 id="report멀티미디어처리응용">REPORT#멀티미디어처리응용</h1>
<h2 id="프로그램-구현">프로그램 구현</h2>
<h3 id="단층-퍼셉트론-기계학습-구현">단층 퍼셉트론 기계학습 구현</h3>
<h4 id="소스-코드">&lt;소스 코드&gt;</h4>
<pre><code class="language-python">def fn_step(x):
    if(x&lt;=0):
        return 0
    return 1

class Perceptron:
    def __init__(self, w1, w2, b, activateFn):
        self.ws=[w1,w2]
        self.bias=b
        self.activateFn=activateFn

    def calculate(self, *xs):
        result=self.bias
        for x, w in zip(xs, self.ws):
            result+=x*w
        y=self.activateFn(result)
        return y

    def train(self, inputSet, labelSet, LT=0.05, e=0.01):
        for xs,t in zip(inputSet, labelSet):
            y=self.calculate(*xs) 
            if(abs(y-t)&lt;=e):
                continue
            self.bias=self.bias+LT*(t-y)*1 #가중치 갱신
            for i, x in enumerate(xs):
                self.ws[i]=self.ws[i]+LT*(t-y)*x

    def showWeight(self):
        print(&quot;Bias : {:.03} &quot;.format(self.bias))
        for i,w in enumerate(self.ws):
            print(&quot;Weight {} : {:.03}&quot;.format(i, w))



if __name__ == &#39;__main__&#39;:
    x1=[0,0,1,1]
    x2=[0,1,0,1]
    y= [0,0,0,1]

    perc=Perceptron(0.1,0.2,-1,fn_step)
    #5회 학습
    for i in range(5):
        perc.train(zip(x1,x2),y,0.05)
        print(&quot;train {} result &quot;.format(i+1))
        perc.showWeight()

    for i in range(4):
        print(&quot;입력값 : &quot;+str(x1[i])+ &quot;, &quot;+str(x2[i])+&quot; &quot;,end=&#39;&#39;)
        out=perc.calculate(x1[i],x2[i])
        print(&quot;예측 : &quot;+ str(out) + &quot;, 정답 : &quot;+ str(y[i]))</code></pre>
<h4 id="실행-결과">&lt;실행 결과&gt;</h4>
<p><img src="https://images.velog.io/images/cheon-js/post/700495ad-658d-47c9-b144-e83436dbf5f1/image.png" alt=""></p>
<h3 id="단층-퍼셉트론과-다층-퍼셉트론의-텐서플로우-구현">단층 퍼셉트론과 다층 퍼셉트론의 텐서플로우 구현</h3>
<h4 id="단층-퍼셉트론-소스-코드">&lt;단층 퍼셉트론 소스 코드&gt;</h4>
<pre><code class="language-python">import tensorflow as tf
import numpy as np

# AND
x_train = np.array([[0, 0],
            [0, 1],
            [1, 0],
            [1, 1]], dtype=np.float32)
y_train = np.array([[0],
            [0],
            [0],
            [1]], dtype=np.float32)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(1, input_dim = 2, activation=&#39;relu&#39;))
sgd = tf.keras.optimizers.SGD(learning_rate=0.05)
model.compile(loss=&#39;mean_squared_error&#39;,optimizer=sgd)

model.fit(x_train, y_train, epochs=1000, verbose=0)
print(model.predict(x_train))</code></pre>
<h4 id="작업화면">&lt;작업화면&gt;</h4>
<p><img src="https://images.velog.io/images/cheon-js/post/c18da385-2b15-450f-b242-a65bd29c454f/image.png" alt=""></p>
<h4 id="실행결과">&lt;실행결과&gt;</h4>
<p><img src="https://images.velog.io/images/cheon-js/post/e817b652-0728-4478-a59e-816faeda6daf/image.png" alt=""></p>
<h4 id="다층-퍼셉트론-소스-코드">&lt;다층 퍼셉트론 소스 코드&gt;</h4>
<pre><code class="language-python">import tensorflow as tf
import numpy as np

x_train = np.array([[0, 0],
            [0, 1],
            [1, 0],
            [1, 1]], dtype=np.float32)
y_train = np.array([[0],
            [1],
            [1],
            [0]], dtype=np.float32)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(2, input_dim = 2, activation=&#39;relu&#39;))
model.add(tf.keras.layers.Dense(1, activation=&#39;relu&#39;))
sgd = tf.keras.optimizers.SGD(learning_rate=0.025)
model.compile(loss=&#39;mean_squared_error&#39;, optimizer=sgd)

model.fit(x_train, y_train, epochs=1000, batch_size=1, verbose=0)
print(model.predict(x_train))</code></pre>
<h4 id="작업화면-1">&lt;작업화면&gt;</h4>
<p><img src="https://images.velog.io/images/cheon-js/post/b823e8be-b20e-4212-864b-0e2262ae0def/image.png" alt=""></p>
<h4 id="실행결과-1">&lt;실행결과&gt;</h4>
<p><img src="https://images.velog.io/images/cheon-js/post/f3dbb03f-2b96-4117-950d-d66b47ccdf77/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>