【Ubutnu】 ubuntu 기본 명령어/ Vim editor 사용하기

(ubuntu) ubuntu 기본 명령어/ Vim editor 사용하기

우분투 기본 명령어

https://www.youtube.com/watch?v=6Sr3e5MEUvI

  1. history
  2. !
  3. ctrl a // ctrl e
  4. whoami
  5. adduser
  6. ps -ef
  7. ll
  8. passwd
  9. deluser
  10. su -
  11. exit
  12. pwd
  13. echo print 해준다. echo $HOME : HOME이라고 이름 지어진 환경변수의 path를 print해준다. echo $PATH : 여기에 있는 프로세스 파일은 무조건 실행 가능 echo “ttt” » : 파일내부에 이 문자열을 추가해준다. echo "tt" > <임의의 파일=""> : 원래 있던 내용 다 지우고, 지금 문자열만 추가해준다.
  14. cat : 내부 내용을 뿌려준다.(파일 내용을 본다) cat ./.bashrc
  15. touch 파일을 만들어 준다.
  16. which
  17. cd - == cd ..
  18. rmdir
  19. rm -rf
  20. cp : copy
  21. mv : mv, rename
  22. find . -name : .은 pwd아래의 모든 폴더를 뒤져본다.
  23. df dist 정보를 보여준다. df -m : 메가 바이트 단위로 알려준다.
  24. du -sm /home 해당 부위에 사용하고 있는 용량 검색. 메가 바이트 단위
  25. free -m 메모리 사용량 검색
  26. top space bar를 이용해서 갱신해 준다. 1을 누루면 cpu의 core에 관한 정보가 보여진다
  27. vmstat 좀 더 간단하게 하드웨어 사용량 vmstat 1 : 1초 단위 그려준다
  28. grep 단어 뽑아 내기 ps -ef | grep bash bash가 들어간 내용만 뽑아준다.
  29. sh tt.sh touch tt.sh echo ‘#!/bin/sh’ » tt.sh echo ‘ls’ > tt.sh sh tt.sh와 같이 sh내부의 명령어 실행 sh말고 bash라고 처도 된다.
  30. chmod 나(root) /그룹(group) /다른사람들(users) rwe : 읽기 쓰기 실행 111 111 111 -> 7 7 7 chmod 777 .sh파일은 권한이 허락된다면 $ tt.sh만으로 실행이 가능하다.
  31. chown 파일의 소유자를 바꿔준다. chown :<groupName(group이 없으면 user 이름 그대로)>
  32. ln ln -s : symbolic link 달기 : 바로가기 만들기 ln -s <목적지> <바로가기 파일이름="">
  33. export 터미널에 새로운 변수를 만들어 준다.
  34. env export했던 것등 모든 변수들을 보여준다.
  35. grep ctrl + f 같은 느낌이다. 다양한 옵션과 표현식을 넣어줌으로써 다양한 방식으로 내가 원하는 문자의 위치를 찾을 수 있다. (grep 명령어 사용법 구글검색해보기)

ubuntu variable setting

$ A="/user/home/workspace" # Shell에 새로운 변수 Define
$ A=/user/home/workspace   
$ echo ${A}
$ echo $A

Refer site1 : https://blog.gaerae.com/2015/01/bash-hello-world.html

  • Shell의 Variable이란 무엇인가?
  • 변수 지정하기
  • ‘위치 매개 변수’ $0, $1, $2, $3 …

Refer site2 : https://mug896.github.io/bash-shell/positional_parameters.html

  • set 명령어를 사용해서 ‘위치 매개 변수’ 정의하는 방법

vim 기본 사용법

1. 모드 기반의 편집기이다.

삽입모드 : 키보드로 문자열 추가

명령모드 : 키보드는 단추키일 뿐이다

라인모드 : 저장, 종료 등 Esc를 눌러서 라인모드로 들어간다.

2. 각 모드로 들어가는 방법

i를 누르면 삽입모드로

esc를 누르면 명령모드가 된다.

ecs를 마구 누르면 결국 명령모드이다.

여기서 : 를 누루면 삽입모드로 들어간다.

3. 라인모드 명령어 w : 저장하기

q : 종료하기. 닫기

wq : 저장하고 종료하기

! : 무시하고 실행하라

q! : 저장하지말고 무시하고 종료하라

%s :

set nu : line num 보여줘

set noun : line num 지워줘

paste : 전체 복사하기

4. 명령모드 명령어

u : 뒤로 되돌리기 ctrl + z

ZZ : 저장하고 종료하기 :wq와 같은 기능

i : 삽입모드로 가기(글자 왼쪽에서)

a : 삽입모드로 가기(글자 오른쪽에서)

A : line 끝에서 입력모드로

o : 다음줄에 입력모드 시작

O : 윗질에서 입력모드 시작

hjkl : 방향키 좌 하 상 우

w : 단어단위 점프

ctrl+f : 페이지 다운

ctrl+u/b : 페이지 업

cw : 하나의 단어 변경

dw : 한 단어 삭제

v : 드래그/ 블록지정

y : 복사

p : 붙여넣기

yy : 라인 복사

dd : 라인 지우기

x : 글자 지우기

X : 백스페이스

r : 한글자만 바꾸기

/<검색어> : 다음 단어 찾고 싶으면 n 누르기. 이전 단어는 b

【Algorithm】 [프머] 2018 KAKAO BLIND RECRUITMENT 자동완성

(Algo) [프머] 2018 KAKAO BLIND RECRUITMENT 자동완성

1. sort

a. 앞과 뒤 문자와 비교하기

def solution(words):
    answer = 0
    words.sort()
    
    
    for idx in [0, len(words)-1]:
        cases = -1 if idx > 0 else 1
        for order in range(len(words[idx])):
            try:
                if words[idx][order] == words[idx+cases][order]:
                    answer += 1
                else:
                    answer += 1
                    break
            except:
                answer += 1
                break
                
    
    for idx in range(1,len(words)-1):
        left = 0
        right = 0
        for order in range(len(words[idx])):
            try:
                if words[idx-1][order] == words[idx][order]:
                    left += 1
                else:
                    left += 1
                    break
            except:
                left += 1  
                break
        for order in range(len(words[idx])):
            try:
                if words[idx][order] == words[idx+1][order]:
                    right += 1
                else:
                    right += 1
                    break
            except:
                right += 1  
                break
        answer += max(left,right)
    return answer

b. 맨앞 알파벳부터 모든 단어 비교하기(나의 풀이)

img

def solution(words):    
    
    words.sort()
    
    # make zero vector
    counter_vector = []
    for i in range(len(words)):
        counter_vector.append([0 for j in range(len(words[i])+1)])
    
    # fill counter_vector
    word_stack = ['0']*MAX_COUNT
    for i in range(len(words)):
        fill_current_vector(i,words,counter_vector,word_stack)
    
    #print(counter_vector)

    # return answer
    answer = 0
    for i in range(len(words)):
        answer += sum(counter_vector[i])
    return answer




MAX_COUNT = 1000


def fill_current_vector(current_word,words,counter_vector,word_stack):
    while(1):
        current_step = counter_vector[current_word].index(0)
        word_stack[current_step] = words[current_word][current_step]
        
        for i in range(current_word,len(words)):
            if current_step > len(words[i])-1 : break
            if word_stack[current_step] == words[i][current_step] and counter_vector[i].index(0) == current_step :
                counter_vector[i][current_step] = 1
            else : break
        
        # break condition 1
        if counter_vector[current_word][-2] == 1 : break
        # break condition 2, 3
        if current_word == len(words)-1 : break
        else:
            if counter_vector[current_word+1][current_step] == 1 : pass
            else : break

2. Trie

Trie구조를 사용하기 위한 python 기본 지식cur = dict()ccur = {}cur[‘c’] = ‘value’ cur[‘c’] = {‘num’ :1}print(cur) » {‘c’: {‘num’: 1}}

a.

img

def solution(words):
    char_freq = {}
    for word in words:
        cur = char_freq
        for char in word:
            try:
                cur[char]['num'] += 1
            except:
                cur[char] = {'num':1}
            cur = cur[char]  # cursor 를 마지막에 갱신

    res = 0

    for word in words:
        cur = char_freq
        for char in word:
            res += 1
            if cur[char]['num'] == 1:
                break
            else:
                cur = cur[char]
    return res

b.

def solution(words):
    word_dict = build_dict(words)
    total_num = 0
    for word in words:
        for i in range(len(word)):
            if len(word_dict[word[:i+1]]) == 1:
                total_num += i + 1
                break
        else:
            total_num += len(word)
            
    return total_num

def build_dict(words):
    d = {}
    for word in words:
        for i in range(len(word)):
            if not d.get(word[:i+1]):
                d[word[:i+1]] = [word]
            else:
                d[word[:i+1]].append(word)
    return d

【Ubuntu】 필수 Ubuntu 설치 과정 Tip

(ubuntu) 몇번째 설치 중 인지 모르겠을 Ubuntu

0. SSD 포멧하기

우분투 설치 USB로 포멧이 가능하다고 믿지만, 사실은 아니다.

SSD에 원래 우분투가 있었다면, 그 곳에 덮어쓰기하면서 문제가 발생할 수 있다.

따라서 꼭 포멧하고 설치하기

1. 바이오스 환경설정

  • fast bootup & fast setup : OFF
  • UEFI booting으로 설정
  • securiry boot : OFF

2. 우분투 설치

하드 2개 이용해서 설치하기 :

https://askubuntu.com/questions/1033497/dual-boot-windows-10-and-linux-ubuntu-on-separate-ssd

$ sudo update-grub
# 모든 우분투 설치가 완료되고 마지막에 할 것. # 결과는 Microsoft의 새로운 EFI가 감지되었다고 하며, 새로운 EFI를 add처리한다.

설정 방법 :

/dev/nvmeOn1p1 : 134MB

/dev/nvmeOn1p1 swap : 12287MB

/dev/nvmeOn1p1 efi : 500MB #legacy boot first로 하면 이것으로 설정 불가능

/dev/nvmeOn1p1 ext4 / : 나머지MB

3. 잘 설치 되었나 확인

a. apt-get 잘되는지 확인

sudo apt-get update sudo apt-get install kolourpaint4 kolourpaint

b. 문제 발생시 서버 사이트 변경

koreaUbuntu -> daum.kakao

https://twpower.github.io/99-change-apt-get-source-server

c. 한영키 전환

언어 설정 고급관리에서 -> 언어팩 자동 다운로드

ibus-setup https://tobelinuxer.tistory.com/15

img

이거 하고 재부팅!

그리고 ibut-setup 설정을 위 사이트처럼 하기

d. chrome 설치

e. chrome 북마크등 synchronizing하기

4. docker설치 & git config하기

$ git config –global user.name “junha1125” $ git config –global user.email sb020518@naver.com

5. graphic driver설치

이 사이트 이용

Nvidia driver를 설치하지 않으면 Dual Moniter에 문제가 발생할 수 있다. -> black screen

$ sudo apt-get update $ ubuntu-drivers devices $ sudo ubuntu-drivers autoinstall $ sudo reboot

6. anaconda 설치

https://hiseon.me/python/ubuntu-anaconda-install/

https://pytorch.org/get-started/locally/

7. visual studio code 설치

https://code.visualstudio.com/docs/setup/linux

$ sudo snap install –classic code $ code # VScode 실행하기 [항상 터미널로 code실행]

8. cuda&cudnn 설치

https://hiseon.me/linux/ubuntu/cuda-install/

【강화학습】 CS285 Lecture 5 정리노트

(강화학습) CS285 Lecture 5 정리노트

**BackGround

Importance sampling

통계 및 머신 러닝 문제에서 많은 경우는 어떠한 확률 분포 p의 기댓값 (expected value)을 구하는 것(샘플들을 추출해, 그 샘플에 대한 실험을 하고 실험한 결과를 평균을 낸다.)과 밀접한 연관이 있다. Importance sampling은 효율적으로 기댓값을 추정하기 위해 고안되었으며, 확률 밀도 추정 및 강화 학습 등의 다양한 활용에 이용되고 있다. Importance sampling의 목적은 기댓값을 계산하고자 하는 확률 분포 p(x)의 확률 밀도 함수 (probability density function, PDF)를 알고는 있지만 p에서 샘플을 생성하기가 어려울 때, 비교적 샘플을 생성하기가 쉬운 q(x)에서 샘플을 생성하여 p의 기댓값을 계산하는 것이다. 우리는 [식 1]과 같이 q에서 생성된 샘플을 이용하여 p의 기댓값을 계산할 수 있다.

img

[식 1]에서 p(x)/q(x)를 likelihood ratio라고 하며, p를 nominal distribution, q를 importance distribution이라고 한다. Importance sampling에서는 p의 기댓값 Ex∼p[f(x)]를 [식 2]와 같이 추정한다.

img


공부내용

img img img img img img img img img img img img img img img img img img img img img img img img img img img img img img img img img img img img img

【Docker】 docker 실습/ docker sudo 없이 실행하기

(docker) docker 실습/ docker sudo 없이 실행하기

1.원하는 docker ubuntu Image를 만들어보자

$ sudo docker run -it –name ubun18 ubuntu:latest bash

ls cat /etc/issue apt update apt install python
python sudo apt install python3-dev python3-pip pip3 –help pip3 install numpy python3 –version python3 exit

$ sudo docker start <container ID> $ sudo docker attach <container ID>

$ sudo docker container ls -q # container ID만 출력

$ docker commit <container ID> ub_with_numpy:1


2.tensorflow를 실행해보자

$ sudo docker pull tensorflow/tensorflow:latest

$ sudo docker run -it tensorflow/tensorflow bash

$ docker run -it –rm -v /home/junha/Documents:/tmp -w /tmp tensorflow/tensorflow bash

주피터 실행

$ docker run -it -p 8888:8888 tensorflow/tensorflow:nightly-py3-jupyter ( $ docker run –runtime=nvidia -it -rm -p 8888:8888 -p 6006:6006 tensorflow/tensorflow:nightly-gpu-py3-jupyter ) $ sudo docker run -it –rm -p 8888:8888 -p 6006:6006 –name tf16 tensorflow/tensorflow:1.6.0

tenserflow-gpu 실행

$ sudo docker run –runtime=nvidia -it –rm -p 8888:8888 -p 6006:6006 –name tf16 tensorflow/tensorflow:1.6.0-gpu-py3

여기서 –rm은 container를 exit하면 자동으로 container를 삭제하는 옵션이다. 따라서 나는 아래와 같은 명령어를 많이 사용했다.

그리고 8888은 주피터를 위한 서버이고, 6006은 텐서보드를 위한 서버라고 한다.

$ docker run –runtime=nvidia -it -p 8888:8888 -p 6006:6006 –name tf16_rbox 6bdfac5fa12a

참고로 이미지는 나의 허브에 있는 이미지이다.

[sb020518/tf16_with_rbox latest 6bdfac5fa12a 2.99GB]


3.sudo 없이 실행하기

아래의 명령어를 순서대로 처준다.

$ sudo groupadd docker

$ sudo usermod -aG docker $USER #그대로 치기 users(whoami)로 바꾸지 마세요

$ reboot # 컴퓨터를 한번 껐다 켜준다.

이제 sudo 없이 docker가 실행이 될것이다. 하지만

WARNING: Error loading config file: /home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied 이게 뜬다면, 아래의 2줄을 터미널에 차근히 입력해준다.

$ sudo chown “$USER”:”$USER” /home/”$USER”/.docker -R

$ sudo chmod g+rwx “$HOME/.docker” -R


4.docker image push하기

https://nicewoong.github.io/development/2018/03/06/docker-commit-container/

https://seulcode.tistory.com/227

정리

우선 docker hub에 로그인 한다.

$ docker login

이미지의 이름(태그)를 바꾸어서 복제를 한다.

$ docker tag <old image> <sb020518즉 userID>/<new docker-image-name[:tag-name]>

이제 hub로 push해보자

$ docker push <sb020518즉 userID>/<new docker-image-name[:tag-name]>

이와 같이 hub에 새로운 image가 생성된 것을 확인할 수 있다.

img

【Python】 2020.02 새로 안 사실

(Python) 2020.02 새로 안 사실

1. list의 인덱스는 무조건 // 연산자를 써야 한다.

list[i/2]를 사용하면 에러가 난다. / 연산자를 써서 나오는 결과는 무조건 float형이다. 그게 8/2 = 4.0 이 된다.

따라서 i/2가 4.0이라 할지라도 list[i//2]를 사용해야한다.

2. list에서 * 연산자를 함부러 쓰면 안된다.

[1] * 10 = [1,1,1,1,1,1,1,1,1,1] 이다.깊은 복사이다. (주소 복사 아님)

하지만 [[1]2]3 = [[1,1][1,1][1,1]] 에서 [1,1]들은 모두 얕은 복사이다. (포인터, 참조 복사임)

[1 for i in range(100)] 을 사용하는 것이 유리하다.

순서대로 ABC

img

A : 변수 for는!

0을 , 로 나누어 100개 나열해준다. []는 밖의 []가 묶어줌

[]을 ,로 나누어 100개 나열해준다. []는 밖의 []가 묶어줌

C : [] *는! <주의!! 리스트 복사만! sallaw copy이다! 주소복사임.. 사용하지 말것>

[ ]안에 있는 0을 ,로 나누어 100개 나열하고 []로 묶어 준다. [ 이건 깊은 복사 ]

[[ ]]안에 있는 []를 ,로 나누어 100개 나열하고 []로 묶어 준다. [ 이건 얕은 복사]

list의 * 연산자는 사용하지 말것.

3. list dir tuple을 사용한 함수 매개변수 전달만이 얕은 복사이다.

만약 output정보를 담을 매개변수를, 외부함수에 전달하고 싶으면 위와 같은 자료형의 변수를 사용해야 한다.

4. input이 0일 때 항상 문제가 발생한다.

백준이든 프로그래머스이든 input이 0과 max일 때 꼭 고려하기

5. sort를 하고 문제를 푼다.

주어진 문자열 리스트, 숫자 리스트에 대해 sort를 먼저 하는 행위는 시간초과의 위험이 있다.

하지만 sort를 사용해서 문제를 풀어야 하는 경우도 존재한다.

sort를 해서 문제를 푸는 것은 가장 마지막 방법으로 생각하자.

6. 내가 생각할 수 있는 풀이 방법이 이 1개라고 단어하지 말아라.

문제를 보고 풀이 방법 1개가 생각났다고 하자. 그럼 그 방법으로 풀려고 코딩하지 말아라.

시점을 바꿔서 다른 방법으로 풀이를 생각해 보아라.

7. copy

얕은 복사 : YES 참조 선언. A is B == True. 서로 id가 같음.

깊은 복사 : NO 참조 선언. A is B == False. 서로 id가 다름.

좀 더 자세히 공부해보자. [이 사이트 정리][추가 사이트]

8. 파이썬 객체와 변수

9. copy

- 파이썬에서 모든 것은 객체이다. 객체는 유일하고 ID는 변하지 않는다. 그 ID가 C처럼 실제 메모리 주소는 아니다.

- 변수는 그 객체를 가리키는 역할만 한다.

- 깊은 복사 : copy of value 얕은 복사 : copy of reference

mutable에서는 값이 변하면 객체 그냥 새로 만들어 버린다.

immutable에서는 단순복사 : copy of reference 얕은 복사 : copy of value + reference 깊은 복사 : copy of value

list, set, dict 객체들객체가 만들어진 메모리 공간에 다가가 그 객체 값 수정 가능(mutble)b=a연산자를 통한 복사로, 같은 객체를 가리킨다. 객체가 수정가능하니 b를 위한 새로운 객체를 만들지 않는다.
int, float, complex, bool, string, tuple, frozen set 객체들객체가 만들어진 메모리 공간에 다가가 그 객체 값 수정 불가능(immutble)b=a연산자를 통한 복사로, 같은 객체를 가리킨다. 하지만 객체가 수정 불가능하니 b를 위한 새로운 객체를 만든다.

정수(int)

- 변수는 객체를 가리킬 뿐이다. 변수에 사칙연산을 하면, 사칙연산 결과의 객체가 새로 생기고, 그 객체를 변수가 가리킨다.

- 변수가 가리키고 있는 ‘객체’의 값을 비교하고 싶다면 ==연산자를 사용해야 한다.

- ‘객체의 값’이 같더리도 (같은 값을 가지는, 다른 메모리에 위치하는, 2개의 객체) Id가 다를 수 있다.

- 0~255의 값을 가지는 객체는 모두 같은 메모리에 위치한다. 이를 제외한 나머지는 모두 바로 위 조건을 따른다.

실수(float)

- ‘객체의 값’이 같더리도 (같은 값을 가지는, 다른 메모리에 위치하는, 2개의 객체) Id가 다를 수 있다.

-a ~ z, A ~ Z, 0~9, _를 문자열의 요소로 가지는 객체는 모두 같은 메모리에 위치한다. 이를 제외한 나머지는 모두 바로 위 조건을 따른다. (하지만 input으로 받은 문자열은 어떤 값이든 다 다른 메모리에 위치한다.)

리스트(list)

- immutable객체 이므로 위 표의 조건을 따른다.

- immutable객체의 경우, 얕은 복사(shallow copy)와 깊은 복사(deep copy)간에 차이가 없다. 앝은 복사(copy.copy(Object)), 깊은 복사(copy.deepcopy(Object))으로 생성한 각각의 객체들은, == 연산자로 true이지만, Id를 확인하면 모두 다른 id이다.

- 하지만 2차원 이상 list는 얕은 복사와 깊은 복사가 다르다. 얕은 복사를 하면 이 2차원 list([ [], [] ])에서 ** 는 참조복사 된다.

- 2차원 이상의 list도 깊은 복사를 하고 싶으면, list 깊은 복사(deepcopy)를 해줘야 한다.

튜플(tuple)

- 튜플은 값 수정이 불가능하다. 하지만 같은 값을 가지는 객체 더라도 서로 id가 다르다.

- 튜플 내부의 원소가 mutable이면, 그 원소는 수정 가능하다. a = ([1, 2, 3]) » a[0].append(4) 가능!

항상 mutable한 객체가 문제이다.

immutable한 객체는 거의 문제가 되지 않는다. 값이 변하면 ‘바로 그냥 새로운 메모리 할당!’이라고 생각하자

10. 블로그 읽을 때, 마우스 잡지 말기!! -> 집중해서 또박또박 읽기. Just Do It

11. 클래스 변수는 전역변수이고, 생성자 맴버 변수는 지역변수 이다.

image

12. 클래스 변수는 전역변수이고, 생성자 맴버 변수는 지역변수 이다.

만약 2개의 변수를 return하는 iter에 대해서,
for x in dataloader_iter : 를 사용하면 x에 len=2짜리 list로써 변수가 들어간다.
for x,y in dataloader_iter : 를 사용하면 x와 y에 iter가 주는 변수를 나눠가진다.

**13. **

【Algorithm】 [백준] 16549 숨바꼭질 3

문제는 다음과 같습니다.

https://www.acmicpc.net/problem/13549

  1. 수빈이는 *2배를 0초만에 갈 수 있다.

  2. 수빈이는 +1 -1을 각각 1초만에 갈 수 있다.

문제 풀이 - dynamic programming

  1. 0부터 N까지 먼저 채워놓고, N부터 차근차근 하나씩 앞으로 나가면서 해당 자리에 오는데 걸리는 최단시간을 찾는다.

img

def fineMaxTime(N,K):
    MaxTime = K-N
    i = 2
    while(1):
        dist = K - N*i
        if MaxTime <= abs(dist) :
            max_num_list = N*(i) if N != 0 else K+10    # 0문제 해결
            return MaxTime, max_num_list
        i += 1

def findtime(N,K):
    if N >= K :
        return (N-K)

    Maxtime, max_num_list = fineMaxTime(N,K)
    lst = [Maxtime+1] * (max_num_list+1)

    # complex case
    for i in range(N+1):
        lst[N-i] = i

    for i in range(N+1, max_num_list+1):
        if i % 2 == 1:
            lst[i] = lst[i-1]+1
        else :
            if lst[i-1]+1 > lst[i//2]:      # /연산을 해서 나오는 것의 자료형은 무조건 float
                lst[i] = lst[i//2]
                for j in range(1,100000):        # 뒤를 보고 숫자가 너무 크면 줄여준다.
                    if lst[i-j] > lst[i-j+1]+1:	 
                        lst[i-j] = lst[i-j+1]+1
                    else : break

            else : lst[i] = lst[i-1]+1
    return lst[K]
    
            
if __name__ == "__main__":
    N, K = map(int, input().split())
    print(findtime(N,K))

문제 풀이 - deque

img

  1. que알고리즘을 사용한다

  2. dist에 그 위치에 가는데 걸리는 시간을 계산한다.

원래 큐는 오른쪽에서 들어가서 오른쪽에서 나온다.(first input first output)

deque를 사용해서 스택과 큐를 동시에 사용할 수 있다.

deque(double-ended queue) 설명 :

  1. https://excelsior-cjh.tistory.com/96

  2. https://godoftyping.wordpress.com/2015/04/24/python-%EB%8D%B0%ED%81%ACdeque/

    from collections import deque

    MAX = 100000
    N, K = map(int, input().split())
    q = deque()
    dist = [-1] * MAX * 2
    dist[N] = 0
    q.append(N)
    solution_second = None

    while q:
        x = q.popleft()
        if x == K:
            solution_second = dist[K]
            break

        for op in (x, 1, -1):
            nx = x + op
            if 0 <= nx < MAX * 2 and dist[nx] == -1:
                if op == x:
                    dist[nx] = dist[x]
                    q.appendleft(nx)
                else:
                    dist[nx] = dist[x] + 1
                    q.append(nx)

【Algorithm】 [백준] 17404 RGB거리 2

주의해야 했던 점 :

첫번째 집과 마지막 집도 이웃이다.

처음에 생각했던 방법과 손코딩 :

가장 단순한 방법으로, 모든 경우의 수를 찾는 방법이다.

이를 위해 reculsive function을 사용했다. (재귀함수)

하지만 역시.. 시간 초과

img

정답 :

아래의 사이트 참고해서 공부할 것

https://m.blog.naver.com/occidere/220785383050

https://copy-driven-dev.tistory.com/m/78?category=837580

https://taekho-nology.tistory.com/100

Pagination


© All rights reserved By Junha Song.