# [1000] A+B를 출력 solved by Python, C++, C, Java, Kotlin

문제: https://www.acmicpc.net/problem/1000


나는 이 문제가 백준코딩의 시작이었다.

백준코딩을 시작하려면 이걸 젤 먼저 풀어야 할 것 같은데 왜 1000번일까?....

function을 채워넣는 문제만 풀어봤던 나는 백준코딩 사이트의 입출력이 친절하지 않게 느껴진다.

입력은 text를 통으로 던져주고, 그걸 분석해내는 것 부터가 시작이다.

출력은 걍 바닥(콘솔)에다 뿌리는거다.

심지어 로그같은것도 찍을 수 없는데다가 출력화면이 없다.

Judge만 하지 틀린이유나 예제를 공개하지 않는다.

이러한 평가방법은 더 불친절해서 거만하게 까지 느껴진다.


어쨌든 콘솔입력을 쉽게 접하지 않은 사람에게 시작부터가 챌린지다.

콘솔입력을 받아들이는 방법은 조금씩 달라지겠지만

1000번 문제가 자신만의 입력방식을 찾고 익혀볼 수 있는 문제가 아닐까 생각한다.


1. By Python:

input()으로 한줄을 읽고 parsing한 다음 계산한다.

input 말고도 있겠지만 input()이 Python의 표준이라고 하기도 하고

parsing, converting이 상대적으로 쉽기 때문에 걍 풀어버렸다.


 

'''
input example
1 2

'''

line = input()
a, b = line.split(' ')
print(int(a) + int(b))



2. By C++:

scanf, cin도 있고 text에 예제를 저장해서 불러오는 등 다양한 방법이 있는데 C++하면 cin인것 같아서...

하지만, 속도가 느리다는 백준의 비교측정 포스트를 보고 scanf로 추후 바꾸게 된다.



#include <stdio.h>

#include <iostream>


using namespace std;


int main() {

    

    int a, b;

    cin >> a >> b;

    cout << a+b << "\n";

    

    return 0;

}

 

여기서 중요한 건, include와 "main"이라는 함수명 등이 고스란이 포함되어 있어야 한다는 것이다.

이것은 백지에서 시작하는 것이 function을 채워넣는 문제에 비하여

얼마나 불필요한 일들에 신경을 써야 하는지를 보여준다.

반면에 이렇게 함으로서 개인이 즐겨쓰는 라이브러리를 포함할 수도 있고(백준에서 지원 안해주면 컴파일에러나고 왜 그런지도 모르겠지만...)

알고리즘의 자유도는 증가하는 것 같다.



3. By C:

단순하게 scanf를 썼다.

 #include <stdio.h>


int main() {

    

    int a, b;

    scanf("%d %d", &a, &b);

    printf("%d\n", a+b);

    

    return 0;

}



4. By Java:

BufferedReader로 열심히 해봤다가

언어별 기본 포멧을 제공한다는 것을 발견하고는

부끄러워서 지우고 예제와 같은 방법을 사용하기로 했다.


import java.util.Scanner;

public class main {

public static void main_2() {
Scanner sc = new Scanner(System.in);
int a, b;
a = sc.nextInt();
b = sc.nextInt();
System.out.println(a + b);
}
}



5. By Kotlin:

Kotlin은 class를 쓰지 않고도 이렇게 메소드만 달랑 쓸수 있단다.

잘 몰라서 예제와 똑같아 했다.



import java.util.Scanner

fun main(args: Array<String>) {
val sc: Scanner = Scanner(System.`in`)
var a = sc.nextInt()
var b = sc.nextInt()
println(a + b)
}



================================================================

Reference:

- https://www.acmicpc.net/problem/1000

- https://www.acmicpc.net/help/language


"시즌 RL - Deep Reinforcement Learning" Wrap-up

학습을 마치며 전반적 강의내용에 대한 정리를 해본다.

Reinforcement의 뜻은(강화학습이지만) "어떻게 하면 좋은선택을 꾸준히 할 수 있을까?"를 목표로 최적화해 나아가는 과정으로 이해된다.

개인적으로 이 강의가 상당히 어렵고 난해하게 느껴졌는데

아마도 Supervised learning의 상식을 가지고 Reinforcement learning분야를 해결해 나아간다는 것이

어떻게 보면 진짜로 잘 될까? 이게 왜 되는거지? 왜 꼭 이렇게 하는거지? 라는 의문이 생겨서 학습을 방해한 것 같다.



몇가지 인상깊은 특징을 나열해보면

- 강의내용은 사실 많은 내용을 함축하고 있는것으로 보인다.

  왜 그렇게 접근하는가를 찾으려다 보면 다른 이론을 알아야만 풀리는 것들이 많다.

- Q-table 방식:

  다음 Action을 정할때 기대하는 가장 큰값을 찾는 논리에 있어서 최적경로 알고리즘과 유사한 부분이 있다.

  하지만, 최적경로 탐색은 path간의 weight이 이미 계산되어 있으나,

  RL에서는 탐험을 통해 이 최적경로를 찾아내는 과정 또한 포함되어 있다.

  이 때문에 탐험으로 찾아진 Q-table은 절대적인 weight도 아니고 최적이라고 판단하기 어렵다.

- Q-Network 방식:

  Q-table 방식과 비교될 수 없는 확실히 다른 것인데 이 점을 빨리 깨닫지 못해서 시간을 허비했다.

- 학습을 위해 일정구간을 저장하고, 그 자료를 샘플링해서, next Q를 더해 학습하는 방법이 DQN의 핵심으로 판단된다.



# Wrap-up

1. Frozen Lake World(OpenAI GYM)


2. Q-function

    a. Deterministic: Q-table(Q-learning)

    b. Stochastic: Q-Network

        diverges due to:

        - Correlations between samples

        - Non-stationary Target


3. Exploit VS Exploration

    a. E-greedy

    b. Decay E-greedy

    c. Add random noise


4. DQN: Deep Q-Network

    a. solutions

        1) Go Deep

        2) Capture and Replay

            - 일정구간을 저장했다가 저장된 구간을 랜덤으로 골라 학습

            - Correlations between samples 을 해결

        3) Separate networks

            - 학습하는 동안 next Q를 구할때는 학습을 반영하지 않는 별도의 DQN(target)을 사용함

            - Non-stationary Target 을 해결

    b. DQN 2013

    c. DQN 2015




Reference:

- http://hunkim.github.io/ml/

# Activation functions

여러종류의 Activation function이 존재하고 각각의 미분법이 존재하며

아래 4개의 function에 대해서 알아보기로 한다.

1. Sigmoid

2. tanh

3. ReLU

4. Leaky ReLU



1. Sigmoid

1) definition: 

 

2) derivatives:

 



2. tanh

1) definition:

 

2) derivatives:


 


3. ReLU

 

1) definition:

 

2) derivatives:

 

 



4. Leaky ReLU

 

1) definition:

 

2) derivatives:

+ Recent posts