<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.2">Jekyll</generator><link href="https://allogrooming.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://allogrooming.github.io/" rel="alternate" type="text/html" /><updated>2022-05-30T02:43:39+00:00</updated><id>https://allogrooming.github.io/feed.xml</id><title type="html">Site Title</title><subtitle>An amazing website.</subtitle><author><name>Your Name</name></author><entry><title type="html"></title><link href="https://allogrooming.github.io/2022-04-04-dreamHack02/" rel="alternate" type="text/html" title="" /><published>2022-05-30T02:43:39+00:00</published><updated>2022-05-30T02:43:39+00:00</updated><id>https://allogrooming.github.io/2022-04-04-dreamHack02</id><content type="html" xml:base="https://allogrooming.github.io/2022-04-04-dreamHack02/">&lt;h1 id=&quot;문제&quot;&gt;문제&lt;/h1&gt;
&lt;p&gt;https://dreamhack.io/wargame/challenges/37/&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/161511420-4b083aaa-25ef-4c57-aa64-21faae671346.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#!/usr/bin/env python3
import os
import shutil

from flask import Flask, request, render_template, redirect

from flag import FLAG

APP = Flask(__name__)

UPLOAD_DIR = 'uploads'

@APP.route('/')
def index():
    files = os.listdir(UPLOAD_DIR)
    return render_template('index.html', files=files)


@APP.route('/upload', methods=['GET', 'POST'])
def upload_memo():
    if request.method == 'POST':
        filename = request.form.get('filename')
        content = request.form.get('content').encode('utf-8')

        if filename.find('..') != -1:
            return render_template('upload_result.html', data='bad characters,,')

        with open(f'{UPLOAD_DIR}/{filename}', 'wb') as f:
            f.write(content)

        return redirect('/')

    return render_template('upload.html')


@APP.route('/read')
def read_memo():
    error = False
    data = b''

    filename = request.args.get('name', '')

    try:
        with open(f'{UPLOAD_DIR}/{filename}', 'rb') as f:
            data = f.read()
    except (IsADirectoryError, FileNotFoundError):
        error = True


    return render_template('read.html',
                           filename=filename,
                           content=data.decode('utf-8'),
                           error=error)


if __name__ == '__main__':
    if os.path.exists(UPLOAD_DIR):
        shutil.rmtree(UPLOAD_DIR)

    os.mkdir(UPLOAD_DIR)

    APP.run(host='0.0.0.0', port=8000)

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;풀이&quot;&gt;풀이&lt;/h1&gt;
&lt;p&gt;upload는 post 방식으로 진행됨&lt;br /&gt;
하지만 서버에 저장된 파일을 읽는 방식은 get 방식&lt;br /&gt;
flag 파일을 읽어들여야 하므로&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://host1.dreamhack.games:18340/read?name=../flag.py&lt;/code&gt;&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;../&lt;/code&gt;를 적은 이유는 flag.py로만 호출하면&lt;br /&gt;
정확한 디렉토리를 모르기 때문에 어느 상위 폴더에 있는 flag 파일을 호출해야하기 때문&lt;/p&gt;</content><author><name>Your Name</name></author></entry><entry><title type="html">장고 활용</title><link href="https://allogrooming.github.io/codeLion6/" rel="alternate" type="text/html" title="장고 활용" /><published>2022-05-27T00:00:00+00:00</published><updated>2022-05-27T00:00:00+00:00</updated><id>https://allogrooming.github.io/codeLion6</id><content type="html" xml:base="https://allogrooming.github.io/codeLion6/">&lt;h1 id=&quot;1-url-패턴-활용&quot;&gt;1. URL 패턴 활용&lt;/h1&gt;
&lt;p&gt;각각 application(스프링으로 따지면 컨트롤러, 스테틱파일, 서비스레이어 묶인 느낌)&lt;br /&gt;
별 url을 지정하기에는 너무 번거로움&lt;br /&gt;
이 문제를 해결하기 위해서는&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;from django.urls import path
from board import views

urlpatterns = [
    path('', views.board),
    path('first/', views.boardFirst),
]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;먼저 하위 application 내의 urls.py 파일에서 url을 매핑한다&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;from django.contrib import admin
from django.urls import path, include
from myapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.first),
    path('second', views.second),
    path('board/',include('board.urls'))
]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;그 이후 각각 application 별로 아무것도 입력하지 않아도&lt;br /&gt;
그 application 안에서 매핑된 url 값은 board가 앞에 오도록 설정&lt;br /&gt;
또한 include를 임포트해야 함&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;2&quot;&gt;2.&lt;/h1&gt;</content><author><name>Your Name</name></author><summary type="html">1. URL 패턴 활용 각각 application(스프링으로 따지면 컨트롤러, 스테틱파일, 서비스레이어 묶인 느낌) 별 url을 지정하기에는 너무 번거로움 이 문제를 해결하기 위해서는 ``` from django.urls import path from board import views</summary></entry><entry><title type="html">캘린더 css 다 끝내기</title><link href="https://allogrooming.github.io/calendarCSS/" rel="alternate" type="text/html" title="캘린더 css 다 끝내기" /><published>2022-05-25T00:00:00+00:00</published><updated>2022-05-25T00:00:00+00:00</updated><id>https://allogrooming.github.io/calendarCSS</id><content type="html" xml:base="https://allogrooming.github.io/calendarCSS/">&lt;h1 id=&quot;1-날짜-위치-이동-&quot;&gt;1. 날짜 위치 이동 ✔&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/170079459-aa9edbd9-c10d-43f2-9bf2-51af7a2dab9d.png&quot; alt=&quot;image&quot; /&gt;
&lt;br /&gt;
이미 전역변수로 생성한 currentTitle로 가져오려는데&lt;br /&gt;
함수에서는 전역변수가 호출은 되는데 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.append()&lt;/code&gt;가 작동하지 않았다&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;let currentTitle = $('#current-year-month');

function showmain(){
    var day = dayList[today.getDay()];
    var date = today.getDate().toString().slice(0,3);
    var month = today.toLocaleString(&quot;en-US&quot;, {month : &quot;short&quot;});
    var year = today.getFullYear().toString();

    var theDate = year + '&amp;amp;nbsp;' + month + '&amp;amp;nbsp;' + date + '&amp;amp;nbsp;' + day;

    //var calendarTitle = $(&quot;#current-year-month&quot;);
    calendarTitle.empty();
    currentTitle.append(theDate);
    console.log(currentTitle);
    console.log(calendarTitle);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;콘솔로 찍어보면&lt;br /&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/170110831-179cd489-6177-4f12-9832-450a199366c9.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
이런 차이가 있다&lt;br /&gt;
그러고 currenTitle을 가져올때 doucument.getElementById로 해도 동일한 결과가 나옴&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;문제의 원인&lt;br /&gt;
생각해보니까 current-year-month를 id로 값는 객체는&lt;br /&gt;
showCalendar 함수가 실행되며 생성된다&lt;br /&gt;
자바스크립트는 인터프리터 언어! 와는 무관하지만&lt;br /&gt;
어쨌든 특정 함수가 호출되며 생성되는 current-year-month 객체이므로&lt;br /&gt;
showmain()이 호출될때는 생성이 되지 않았다! 그래서 저 차이가 있었음&lt;br /&gt;
문제 해결한 김에 전역변수를 거의 없앴다&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/170111937-fbd90029-f0e2-4485-9091-c42fd0aaa896.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;2-color-picker-변경-&quot;&gt;2. color picker 변경 ✔&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/170090913-12e4efb7-d947-4abc-bc1d-4c66c753f7fc.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &amp;lt;input type=&quot;color&quot; id=&quot;color&quot; value=&quot;#16aaad&quot; list=&quot;colors4palette&quot; /&amp;gt;
    &amp;lt;datalist id=&quot;colors4palette&quot;&amp;gt;
        &amp;lt;option&amp;gt;#355070&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;#6D597A&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;#B56576&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;#E56B6F&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;#EAAC8B&amp;lt;/option&amp;gt;
    &amp;lt;/datalist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;3-pre-next-함수-작동-안함-&quot;&gt;3. pre, next 함수 작동 안함 ✔&lt;/h1&gt;
&lt;p&gt;변수명 변경한거 js에 적용 안했음&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;4-next-함수에서-active-클래스-추가-안됨-&quot;&gt;4. next 함수에서 active 클래스 추가 안됨 ✔&lt;/h1&gt;
&lt;p&gt;똑같은 함수인 pre에서는 잘 적용되지만 next만 안됨 도대체 왜…??&lt;/p&gt;
&lt;blockquote&gt;
  &lt;blockquote&gt;
    &lt;p&gt;마찬가지로 변수명 변경한거 js에 적용 안함&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;-5-무한스크롤로-변경-뒤-insert-후에-선택된-날짜로-이동&quot;&gt;⭐ 5. 무한스크롤로 변경 뒤 insert 후에 선택된 날짜로 이동&lt;/h1&gt;</content><author><name>Your Name</name></author><summary type="html">1. 날짜 위치 이동 ✔ 이미 전역변수로 생성한 currentTitle로 가져오려는데 함수에서는 전역변수가 호출은 되는데 .append()가 작동하지 않았다</summary></entry><entry><title type="html">회원가입 폼</title><link href="https://allogrooming.github.io/joinUs/" rel="alternate" type="text/html" title="회원가입 폼" /><published>2022-05-25T00:00:00+00:00</published><updated>2022-05-25T00:00:00+00:00</updated><id>https://allogrooming.github.io/joinUs</id><content type="html" xml:base="https://allogrooming.github.io/joinUs/">&lt;h1 id=&quot;1-htmlcss-작업&quot;&gt;1. HTML/CSS 작업&lt;/h1&gt;

&lt;h1 id=&quot;2-ajax&quot;&gt;2. Ajax&lt;/h1&gt;

&lt;h1 id=&quot;3-controller-및-service-layerinsert&quot;&gt;3. Controller 및 Service layer(insert)&lt;/h1&gt;

&lt;h1 id=&quot;4-spring-security&quot;&gt;4. Spring Security&lt;/h1&gt;</content><author><name>Your Name</name></author><summary type="html">1. HTML/CSS 작업</summary></entry><entry><title type="html">스프링부트 css 적용 안됨</title><link href="https://allogrooming.github.io/calendar8/" rel="alternate" type="text/html" title="스프링부트 css 적용 안됨" /><published>2022-05-23T00:00:00+00:00</published><updated>2022-05-23T00:00:00+00:00</updated><id>https://allogrooming.github.io/calendar8</id><content type="html" xml:base="https://allogrooming.github.io/calendar8/">&lt;h1 id=&quot;css-적용-안됨&quot;&gt;css 적용 안됨?&lt;/h1&gt;
&lt;p&gt;이상한 점 : calendar.css에 대한 기존 내용은 html에 잘 적용이 되나&lt;br /&gt;
오늘 수정한 부분은 웹브라우저에서 적용이 안됨&lt;/p&gt;</content><author><name>Your Name</name></author><summary type="html">css 적용 안됨? 이상한 점 : calendar.css에 대한 기존 내용은 html에 잘 적용이 되나 오늘 수정한 부분은 웹브라우저에서 적용이 안됨</summary></entry><entry><title type="html">Django 기초</title><link href="https://allogrooming.github.io/codelion5/" rel="alternate" type="text/html" title="Django 기초" /><published>2022-05-23T00:00:00+00:00</published><updated>2022-05-23T00:00:00+00:00</updated><id>https://allogrooming.github.io/codelion5</id><content type="html" xml:base="https://allogrooming.github.io/codelion5/">&lt;h1 id=&quot;djang-시작-전&quot;&gt;Djang 시작 전&lt;/h1&gt;
&lt;ol&gt;
  &lt;li&gt;파이썬 기초
(1) dictionary&lt;br /&gt;
데이터들을 대응시켜줌&lt;br /&gt;
탐색의 기준 = key, 찾고자하는 값 = value&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;예외처리
(1) 문법에러 종류
    &lt;ul&gt;
      &lt;li&gt;파싱에러&lt;br /&gt;
오타, 문법에러, 인덱스 에러 등&lt;br /&gt;
실행 자체에 영향을 줌&lt;/li&gt;
      &lt;li&gt;예외&lt;br /&gt;
실행중 감지되는 에러&lt;br /&gt;
자료형, 이름 등&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(2) try except&lt;br /&gt;
자바의 try catch&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;try :
  시도할 코드
except:
  오류 발생시 실행할 코드
finally:
  예외 발생 여부와 상관없이 실행할 코드
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;https://docs.python.org/3/tutorial/errors.html&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;OOP
세상 모든것들을 상태와 동작으로 표현!&lt;br /&gt;
이는 변수와 함수로 표현 가능&lt;br /&gt;
클래스를 통해 변수, 함수를 찍어냄&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;모듈, 패키지, 라이브러리
모듈 : 파이썬으로 작성된 가장 작은 파일&lt;br /&gt;
&lt;br /&gt;
패키지 : 모듈의 집합, 모듈의 계층 단위&lt;br /&gt;
&lt;br /&gt;
라이브버리 : 미리 준비된 모듈 및 패키지&lt;br /&gt;
python standard library(내장)와 python index library(외장)가 있다&lt;br /&gt;
&lt;br /&gt;
pip : 라이브러리 관리 도구
&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Web Service
(1) Web
World Wide Web&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(2) URL, HTTP, HTML
URL = 정보의 위치를 나타냄&lt;br /&gt;
HTTP = 정보자원으로 접근하고 통신하게 하는 약속(get, post 등)&lt;br /&gt;
HTML = 응답으로서의 정보 자원 자체, 다른 정보 자원과 연결해줌&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(3) Server&lt;br /&gt;
웹 프로그램에 대한 정보를 저장하고 있는 컴퓨터라고 보면 쉬움&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(4) Web Service&lt;br /&gt;
HTML과 URL을 미리 준비하고 사용자 요청에 대한 응답을 보낼 수 있는 프로그램&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Web Framework&lt;br /&gt;
웹 서비스를 쉽게 만들어 주는 기계&lt;br /&gt;
정형화 되어있는 웹개발을 효율적으로 하기 위해&lt;br /&gt;
미리 만들어 놓은 웹 개발의 기능 단위, 설계 단위의 집합(구조, 설계)
    &lt;ul&gt;
      &lt;li&gt;DB와 상호작용하는 부분&lt;/li&gt;
      &lt;li&gt;사용자들 눈에 보이는 부분&lt;/li&gt;
      &lt;li&gt;내부 동작의 논리를 담당하는 부분&lt;br /&gt;
라이브러리는 도구의 모음!&lt;br /&gt;
프레임워크는 목적을 달성하기 위해 이미 설계까지 만들어진 구조!!&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;MVC, MTV패턴&lt;br /&gt;
디자인 패턴 = 설계의 원칙(앞서 말한 프레임워크의 세가지 부분이 있음)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(1) MVC
Model View Controller&lt;br /&gt;
Model : DB와 상호작용&lt;br /&gt;
View : 사용자 인터페이스 담당&lt;br /&gt;
Controller : 웹 서비스 내부 담당(서비스레이어)&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(2) MTV&lt;br /&gt;
Model Template View&lt;br /&gt;
Model : DB와 상호작용&lt;br /&gt;
Template : 사용자 인터페이스&lt;br /&gt;
View : 웹 서비스 내부 동작의 논리 담당&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;가상환경&lt;br /&gt;
독립적인 개발환경 생성 
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python -m venv 가상환경이름&lt;/code&gt;&lt;br /&gt;
가상환경 실행 코드&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source myvenv/Scripts/activate&lt;/code&gt;&lt;br /&gt;
가상환경은 저 디렉토리에 저장된 파일로 실행됨&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;실습-준비&quot;&gt;실습 준비&lt;/h1&gt;
&lt;ol&gt;
  &lt;li&gt;장고 설치 및 가상환경, 패키지 생성&lt;br /&gt;
(1) 원하는 폴더에서 우클릭 - git bash - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code .&lt;/code&gt;&lt;br /&gt;
실행하면 vs code 실행됨&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(2) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python -m venv myvenv&lt;/code&gt;&lt;br /&gt;
myvenv라는 가상환경 설치&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(3) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source myvenv/Scripts/activate&lt;/code&gt;&lt;br /&gt;
가상환경 실행&lt;br /&gt;
참고로 명령어 입력 뒤 그 디렉토리에서 m으로 시작하는 유일한 폴더가 myvenv면&lt;br /&gt;
m 입력 뒤 tab키를 누르면 자동으로 생성됨&lt;br /&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/169713940-34245814-ced2-43c2-808d-99f478699bd0.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(4) 장고 설치&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip install django&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/169713983-048a2486-7300-43c9-afba-b607737dfa7f.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(5) 설치 상태 확인&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip freeze&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/169714015-546a8567-f0b9-4a4e-8dd8-d26d786ae458.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(6) 장고 프로젝트 생성&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;django-admin startproject myproject&lt;/code&gt;&lt;br /&gt;
장고를 사용할 때는 django-admin 명령어 사용&lt;br /&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/169714157-339c8798-d93b-4e93-9ace-d147948104e8.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(7) 초기생성 파일 역할&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;init&lt;/strong&gt;.py&lt;br /&gt;
장고 패키지임을 알려주는 빈파일&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;manage.py&lt;br /&gt;
(기능)&lt;br /&gt;
서버를 켤 수 있음&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python manage.py runserver&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/169714582-f94bb2fb-429f-44b9-a2b8-24a75f61c1c5.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
서버종료 = ctrl + c&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;application 만듦&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python manage.py startapp app이름&lt;/code&gt;&lt;br /&gt;
생성된 app은 mvc 패턴을 따름&lt;br /&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/169714751-3e3b783f-c392-499c-930d-661060933847.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
생성된 app을 실행하려면 settings.py에 등록해야됨&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;DB 초기화 및 변경사항 반영&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python manage.py migrate&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;관리자 계정 생성&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python manage.py createsuperuser&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/169715105-96064738-3ea4-46de-b10a-045279ad89ef.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;settings.py
```
from pathlib import Path&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;build-paths-inside-the-project-like-this-base_dir--subdir&quot;&gt;Build paths inside the project like this: BASE_DIR / ‘subdir’.&lt;/h1&gt;
&lt;p&gt;BASE_DIR = Path(&lt;strong&gt;file&lt;/strong&gt;).resolve().parent.parent&lt;/p&gt;

&lt;h1 id=&quot;quick-start-development-settings---unsuitable-for-production&quot;&gt;Quick-start development settings - unsuitable for production&lt;/h1&gt;
&lt;h1 id=&quot;see-httpsdocsdjangoprojectcomen40howtodeploymentchecklist&quot;&gt;See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/&lt;/h1&gt;

&lt;h1 id=&quot;security-warning-keep-the-secret-key-used-in-production-secret-해시생성-키&quot;&gt;SECURITY WARNING: keep the secret key used in production secret! 해시생성 키&lt;/h1&gt;
&lt;p&gt;SECRET_KEY = ‘django-insecure-nte-7aly*-lkdqg!$h@71^ssapcwpk7w6%_gwu)l8t9^r$g)z8’&lt;/p&gt;

&lt;h1 id=&quot;security-warning-dont-run-with-debug-turned-on-in-production&quot;&gt;SECURITY WARNING: don’t run with debug turned on in production!&lt;/h1&gt;
&lt;p&gt;DEBUG = True&lt;/p&gt;
&lt;h1 id=&quot;debug--true는-서버-실행-때-개발자모드-false-사용자-인터페이스&quot;&gt;DEBUG = True는 서버 실행 때 개발자모드, False 사용자 인터페이스&lt;/h1&gt;

&lt;p&gt;ALLOWED_HOSTS = []&lt;/p&gt;

&lt;h1 id=&quot;application-definition&quot;&gt;Application definition&lt;/h1&gt;

&lt;p&gt;INSTALLED_APPS = [
    ‘django.contrib.admin’,
    ‘django.contrib.auth’,
    ‘django.contrib.contenttypes’,
    ‘django.contrib.sessions’,
    ‘django.contrib.messages’,
    ‘django.contrib.staticfiles’,
    ‘dashboard’
] # 생성한 application 작성&lt;/p&gt;

&lt;p&gt;MIDDLEWARE = [
    ‘django.middleware.security.SecurityMiddleware’,
    ‘django.contrib.sessions.middleware.SessionMiddleware’,
    ‘django.middleware.common.CommonMiddleware’,
    ‘django.middleware.csrf.CsrfViewMiddleware’,
    ‘django.contrib.auth.middleware.AuthenticationMiddleware’,
    ‘django.contrib.messages.middleware.MessageMiddleware’,
    ‘django.middleware.clickjacking.XFrameOptionsMiddleware’,
]&lt;/p&gt;

&lt;p&gt;ROOT_URLCONF = ‘myproject.urls’&lt;/p&gt;

&lt;p&gt;TEMPLATES = [
    {
        ‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’,
        ‘DIRS’: [],
        ‘APP_DIRS’: True,
        ‘OPTIONS’: {
            ‘context_processors’: [
                ‘django.template.context_processors.debug’,
                ‘django.template.context_processors.request’,
                ‘django.contrib.auth.context_processors.auth’,
                ‘django.contrib.messages.context_processors.messages’,
            ],
        },
    },
]&lt;/p&gt;

&lt;p&gt;WSGI_APPLICATION = ‘myproject.wsgi.application’&lt;/p&gt;

&lt;h1 id=&quot;database&quot;&gt;Database&lt;/h1&gt;
&lt;h1 id=&quot;httpsdocsdjangoprojectcomen40refsettingsdatabases&quot;&gt;https://docs.djangoproject.com/en/4.0/ref/settings/#databases&lt;/h1&gt;

&lt;p&gt;DATABASES = {
    ‘default’: {
        ‘ENGINE’: ‘django.db.backends.sqlite3’,
        ‘NAME’: BASE_DIR / ‘db.sqlite3’,
    }
}&lt;/p&gt;

&lt;h1 id=&quot;password-validation&quot;&gt;Password validation&lt;/h1&gt;
&lt;h1 id=&quot;httpsdocsdjangoprojectcomen40refsettingsauth-password-validators&quot;&gt;https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators&lt;/h1&gt;

&lt;p&gt;AUTH_PASSWORD_VALIDATORS = [
    {
        ‘NAME’: ‘django.contrib.auth.password_validation.UserAttributeSimilarityValidator’,
    },
    {
        ‘NAME’: ‘django.contrib.auth.password_validation.MinimumLengthValidator’,
    },
    {
        ‘NAME’: ‘django.contrib.auth.password_validation.CommonPasswordValidator’,
    },
    {
        ‘NAME’: ‘django.contrib.auth.password_validation.NumericPasswordValidator’,
    },
]&lt;/p&gt;

&lt;h1 id=&quot;internationalization&quot;&gt;Internationalization&lt;/h1&gt;
&lt;h1 id=&quot;httpsdocsdjangoprojectcomen40topicsi18n&quot;&gt;https://docs.djangoproject.com/en/4.0/topics/i18n/&lt;/h1&gt;

&lt;p&gt;LANGUAGE_CODE = ‘en-us’&lt;/p&gt;

&lt;p&gt;TIME_ZONE = ‘UTC’&lt;/p&gt;

&lt;p&gt;USE_I18N = True&lt;/p&gt;

&lt;p&gt;USE_TZ = True&lt;/p&gt;

&lt;h1 id=&quot;static-files-css-javascript-images&quot;&gt;Static files (CSS, JavaScript, Images)&lt;/h1&gt;
&lt;h1 id=&quot;httpsdocsdjangoprojectcomen40howtostatic-files&quot;&gt;https://docs.djangoproject.com/en/4.0/howto/static-files/&lt;/h1&gt;

&lt;p&gt;STATIC_URL = ‘static/’&lt;/p&gt;

&lt;h1 id=&quot;default-primary-key-field-type&quot;&gt;Default primary key field type&lt;/h1&gt;
&lt;h1 id=&quot;httpsdocsdjangoprojectcomen40refsettingsdefault-auto-field&quot;&gt;https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field&lt;/h1&gt;

&lt;p&gt;DEFAULT_AUTO_FIELD = ‘django.db.models.BigAutoField’&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;br&amp;gt;

- urls.py  
각종 url을 관리  

&amp;lt;br&amp;gt;

# 실습 - hello world
(1) application 안에 templates 폴더 생성 뒤 html 파일 생성  
![image](https://user-images.githubusercontent.com/86642180/169716475-a36c4aa7-bab1-4cd7-be0a-a01c8beb4c76.png)  

&amp;lt;br&amp;gt;

(2) settings.py의 installed_apps에 앱 추가  
![image](https://user-images.githubusercontent.com/86642180/169716500-72ec7fd3-510f-426a-a238-349cee4333d3.png)  

&amp;lt;br&amp;gt;

(3) views(controller)에 html 파일 리턴하는 함수 추가  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;def home(request):
    return render(request, ‘index.html’)&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&amp;lt;br&amp;gt;

(4) urls.py에 path 추가  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;from django.contrib import admin
from django.urls import path
import dashboard.views&lt;/p&gt;

&lt;p&gt;urlpatterns = [
    path(‘admin/’, admin.site.urls),
    path(‘’, dashboard.views.home, name=”hello world”),
    path(‘url경로명’, 실행원하는 함수 디렉토리, url이름)
]
```
dashboard 앱 폴더 내의 view 임포트 필요!&lt;/p&gt;</content><author><name>Your Name</name></author><summary type="html">Djang 시작 전 파이썬 기초 (1) dictionary 데이터들을 대응시켜줌 탐색의 기준 = key, 찾고자하는 값 = value</summary></entry><entry><title type="html">Carve Party</title><link href="https://allogrooming.github.io/dreamhack4/" rel="alternate" type="text/html" title="Carve Party" /><published>2022-05-23T00:00:00+00:00</published><updated>2022-05-23T00:00:00+00:00</updated><id>https://allogrooming.github.io/dreamhack4</id><content type="html" xml:base="https://allogrooming.github.io/dreamhack4/">&lt;h1 id=&quot;문제-분석&quot;&gt;문제 분석&lt;/h1&gt;

&lt;p&gt;https://dreamhack.io/wargame/challenges/96/&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
var pumpkin = [ 124, 112, 59, 73, 167, 100, 105, 75, 59, 23, 16, 181, 165, 104, 43, 49, 118, 71, 112, 169, 43, 53 ];
var counter = 0;
var pie = 1;

function make() {
  if (0 &amp;lt; counter &amp;amp;&amp;amp; counter &amp;lt;= 1000) {
    $('#jack-nose').css('opacity', (counter) + '%');
  }
  else if (1000 &amp;lt; counter &amp;amp;&amp;amp; counter &amp;lt;= 3000) {
    $('#jack-left').css('opacity', (counter - 1000) / 2 + '%');
  }
  else if (3000 &amp;lt; counter &amp;amp;&amp;amp; counter &amp;lt;= 5000) {
    $('#jack-right').css('opacity', (counter - 3000) / 2 + '%');
  }
  else if (5000 &amp;lt; counter &amp;amp;&amp;amp; counter &amp;lt;= 10000) {
    $('#jack-mouth').css('opacity', (counter - 5000) / 5 + '%');
  }

  if (10000 &amp;lt; counter) {
    $('#jack-target').addClass('tada');
    var ctx = document.querySelector(&quot;canvas&quot;).getContext(&quot;2d&quot;),
    dashLen = 220, dashOffset = dashLen, speed = 20,
    txt = pumpkin.map(x=&amp;gt;String.fromCharCode(x)).join(''), x = 30, i = 0;

    ctx.font = &quot;50px Comic Sans MS, cursive, TSCu_Comic, sans-serif&quot;; 
    ctx.lineWidth = 5; ctx.lineJoin = &quot;round&quot;; ctx.globalAlpha = 2/3;
    ctx.strokeStyle = ctx.fillStyle = &quot;#1f2f90&quot;;

    (function loop() {
      ctx.clearRect(x, 0, 60, 150);
      ctx.setLineDash([dashLen - dashOffset, dashOffset - speed]); // create a long dash mask
      dashOffset -= speed;                                         // reduce dash length
      ctx.strokeText(txt[i], x, 90);                               // stroke letter

      if (dashOffset &amp;gt; 0) requestAnimationFrame(loop);             // animate
      else {
        ctx.fillText(txt[i], x, 90);                               // fill final letter
        dashOffset = dashLen;                                      // prep next char
        x += ctx.measureText(txt[i++]).width + ctx.lineWidth * Math.random();
        ctx.setTransform(1, 0, 0, 1, 0, 3 * Math.random());        // random y-delta
        ctx.rotate(Math.random() * 0.005);                         // random rotation
        if (i &amp;lt; txt.length) requestAnimationFrame(loop);
      }
    })();
  }
  else {
    $('#clicks').text(10000 - counter);
  }
}

$(function() {
  $('#jack-target').click(function () {
    counter += 1;
    if (counter &amp;lt;= 10000 &amp;amp;&amp;amp; counter % 100 == 0) {
      for (var i = 0; i &amp;lt; pumpkin.length; i++) {
        pumpkin[i] ^= pie;
        pie = ((pie ^ 0xff) + (i * 10)) &amp;amp; 0xff;
      }
    }
    make();
  });
});
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;counter가 100, 1200, 3200, 5500일 때&lt;br /&gt;
make 함수의 각각 if문에서 잭오랜턴의 눈코입이 나타남(opacity가 100이되어서)&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;counter += 1&lt;/code&gt;과 그 이후 if문,&lt;br /&gt;
각각 make 함수의 if문에 break point를 설정한 뒤&lt;br /&gt;
scope에서 counter 값을 변경한 뒤 실행한다&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;풀이&quot;&gt;풀이&lt;/h1&gt;
&lt;p&gt;하나 유의할 점은 counter는 make 함수나 jquery 안의 if문에서 local 변수가 아니다&lt;br /&gt;
왜냐면 전역변수로 생성되었기 때문에&lt;br /&gt;
scope에서 global(전역변수)란에서 counter 값을 변경하여 실행하면 된다&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;정답화면&quot;&gt;정답화면&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/169763445-9350b071-fd3b-4bbe-b765-3cf2473d9728.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;</content><author><name>Your Name</name></author><summary type="html">문제 분석</summary></entry><entry><title type="html">select, update</title><link href="https://allogrooming.github.io/calendar6/" rel="alternate" type="text/html" title="select, update" /><published>2022-05-19T00:00:00+00:00</published><updated>2022-05-19T00:00:00+00:00</updated><id>https://allogrooming.github.io/calendar6</id><content type="html" xml:base="https://allogrooming.github.io/calendar6/">&lt;h1 id=&quot;select&quot;&gt;select&lt;/h1&gt;
&lt;p&gt;(1) 캘린더 첫페이지에서 오늘날짜(today)가 선택되도록 classList.add(‘active’) ✔&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    var clickedDate1 = document.getElementById(today.getDate());
    clickedDate1.classList.add('active');
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;(2) input 버튼 클릭되면 insert 뒤에 planDate에 해당하는 날짜로 이동&lt;br /&gt;
함수는 전부 정리가 되고 완성 되었으나&lt;br /&gt;
html파일의 js 쪽에서 가상의 클릭 이벤트를 만들어야함&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;👉 문제점&lt;br /&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/169680167-80c33968-4444-493c-8881-73ec1c9879b8.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
애초에 달력을 한 달 단위로 끊어놔서&lt;br /&gt;
테이블의 각각 id를 일에 대해서만 지정해놓음&lt;br /&gt;
조금이라도 늦기 전에 무한스크롤 형식으로 바꾼 뒤&lt;br /&gt;
출력되는 달력 날짜들의 id 값을 YYYY-MM-DD로 지정하는 방식으로 구현할 것&lt;/p&gt;

&lt;h1 id=&quot;무한스크롤로-바꾸기&quot;&gt;무한스크롤로 바꾸기?&lt;/h1&gt;
&lt;p&gt;https://velog.io/@lky9303/%EC%9E%90%EB%91%90-%EC%BA%98%EB%A6%B0%EB%8D%94-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9B%84%EA%B8%B0&lt;br /&gt;
https://velog.io/@dev-tinkerbell/%EB%AC%B4%ED%95%9C%EC%8A%A4%ED%81%AC%EB%A1%A4-%EA%B5%AC%ED%98%84%EB%B0%A9%EB%B2%95&lt;br /&gt;
리엑트로 많이 쓴다고하는데&lt;br /&gt;
바닐라 JS로 아예 못할것은 없어보인다&lt;br /&gt;
대신 스크롤 업할 때가 조금 골치아플듯&lt;/p&gt;</content><author><name>Your Name</name></author><summary type="html">select (1) 캘린더 첫페이지에서 오늘날짜(today)가 선택되도록 classList.add(‘active’) ✔ var clickedDate1 = document.getElementById(today.getDate()); clickedDate1.classList.add('active');</summary></entry><entry><title type="html">12865번</title><link href="https://allogrooming.github.io/12865knapsack/" rel="alternate" type="text/html" title="12865번" /><published>2022-05-18T00:00:00+00:00</published><updated>2022-05-18T00:00:00+00:00</updated><id>https://allogrooming.github.io/12865knapsack</id><content type="html" xml:base="https://allogrooming.github.io/12865knapsack/">&lt;h1 id=&quot;knapsack-algorithm&quot;&gt;Knapsack Algorithm&lt;/h1&gt;
&lt;p&gt;결국은 재귀하는 알고리즘이었던걸로 기억한다&lt;br /&gt;
수업 때 배웠는데….&lt;br /&gt;
파이썬으로 배울 때 아주 간단한데 어떻게 해서 재귀가 이뤄지는지?&lt;br /&gt;
이 과정이랑 코드 볼줄 몰라서 엄청 어려웠던거같다..&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/86642180/168999054-fbb3c20f-2147-4cf1-af5b-7ee5531347b0.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
출처 : https://www.geeksforgeeks.org/0-1-knapsack-problem-dp-10/&lt;/p&gt;</content><author><name>Your Name</name></author><summary type="html">Knapsack Algorithm 결국은 재귀하는 알고리즘이었던걸로 기억한다 수업 때 배웠는데…. 파이썬으로 배울 때 아주 간단한데 어떻게 해서 재귀가 이뤄지는지? 이 과정이랑 코드 볼줄 몰라서 엄청 어려웠던거같다..</summary></entry><entry><title type="html">백준 자바 2891번</title><link href="https://allogrooming.github.io/2891/" rel="alternate" type="text/html" title="백준 자바 2891번" /><published>2022-05-18T00:00:00+00:00</published><updated>2022-05-18T00:00:00+00:00</updated><id>https://allogrooming.github.io/2891</id><content type="html" xml:base="https://allogrooming.github.io/2891/">&lt;h1 id=&quot;그리디-알고리즘greedy-algorithm&quot;&gt;그리디 알고리즘(Greedy Algorithm)&lt;/h1&gt;
&lt;p&gt;당장 눈 앞에 최적의 상황만을 쫓는 알고리즘&lt;br /&gt;
극단적인 경우로 정렬 기법이 함께 쓰인다&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;문제-분석&quot;&gt;문제 분석&lt;/h1&gt;
&lt;p&gt;카약을 더 챙겨온 팀은 -1 혹은 +1한 팀 번호의 팀에게만 대여 가능&lt;br /&gt;
전체 팀에 대한 리스트를 생성 뒤&lt;br /&gt;
카약이 부러진 팀에 대한 정보, 여분 카약이 있는 팀에 대한 정보를 리스트에 담기&lt;br /&gt;
그러고 두 번째 줄에서 입력받은 카약 부서진 팀의 값과 일치하는 지 비교&lt;br /&gt;
만약 리스트 값에 카약 부서진 팀 번호가 없으면 변수 answer +1&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;처음-코드&quot;&gt;처음 코드&lt;/h1&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
import java.io.IOException;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
		
		int N = Integer.parseInt(st.nextToken()); // 전체 팀의 수
		int S = Integer.parseInt(st.nextToken()); // 카약이 부러진 팀의 수
		int R = Integer.parseInt(st.nextToken()); // 여분 카약이 있는 팀의 수
		
		int team[] = new int[N]; // 전체 팀에 대한 배열
		
		// 모든 팀에게 카약을 1로 분배
		for(int i=0; i&amp;lt;N; i++) {
			team[i] = 1;
		}
		
		// 카약이 부러진 팀을 입력 받음
		StringTokenizer s = new StringTokenizer(br.readLine(), &quot; &quot;);
		
		// 카약이 부러진 팀을 전체 배열에도 표시(0)
		for(int i=0; i&amp;lt;S; i++) {
			int sNum = Integer.parseInt(s.nextToken()) - 1;
			team[sNum] -= 1;
		}
		
		// 여분 카약이 있는 팀을 입력 받음
		StringTokenizer r = new StringTokenizer(br.readLine(), &quot; &quot;);
		
		// 여분 카약이 있는 팀을 전체 배열에 표시(2)
		for(int i=0; i&amp;lt;R; i++) {
			int rNum = Integer.parseInt(r.nextToken()) - 1;
			team[rNum] += 1;
		}
		
		// 여분 카약이 있는 팀은 2를 가지고 있고 카약이 부러진 팀은 0을 가지고 있음
		// 카약이 부러진 팀 전에 2를 가지고 있다면 team[i-1] = 1로 바꾸고 team[i]=1으로 변경
		// 왼쪽한테 빌려주기 &amp;gt; 안되면 오른쪽한테 빌리기로 진행
		// team[0]와 team[last index]일 경우는 따로 구함
		
		for(int i=0; i&amp;lt;N; i++) {
			
			if(team[i] == 2) {
				if(team[i-1] == 0) {
					team[i-1] = 1;
					team[i] = 1;
					
				}else if(team[i+1] == 0) {
					team[i] = 1;
					team[i+1] = 1;
				}
				
			}
		}
		
		int answer = 0;
		
		for(int i=0; i&amp;lt;N; i++) {
			if(team[i]==0) {
				answer += 1;
			}
		}
		
		System.out.println(answer);
		bw.flush();
		bw.close();
		br.close();	
	}	
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이러고 런타임 오류가 떴다&lt;br /&gt;
생각해보니 team[N]은 배열 범위 밖이다&lt;br /&gt;
그리고 i=0인데 team[0]==2일 경우&lt;br /&gt;
조건식에 따라 team[i-1]을 구하게 되는데 이것도 범위 밖이다&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;정답-코드&quot;&gt;정답 코드&lt;/h1&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
import java.io.IOException;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
		
		int N = Integer.parseInt(st.nextToken()); // 전체 팀의 수
		int S = Integer.parseInt(st.nextToken()); // 카약이 부러진 팀의 수
		int R = Integer.parseInt(st.nextToken()); // 여분 카약이 있는 팀의 수
		
		int team[] = new int[N]; // 전체 팀에 대한 배열
		
		// 모든 팀에게 카약을 1로 분배
		for(int i=0; i&amp;lt;N; i++) {
			team[i] = 1;
		}
		
		// 카약이 부러진 팀을 입력 받음
		StringTokenizer s = new StringTokenizer(br.readLine(), &quot; &quot;);
		
		// 카약이 부러진 팀을 전체 배열에도 표시(0)
		for(int i=0; i&amp;lt;S; i++) {
			int sNum = Integer.parseInt(s.nextToken()) - 1;
			team[sNum] -= 1;
		}
		
		// 여분 카약이 있는 팀을 입력 받음
		StringTokenizer r = new StringTokenizer(br.readLine(), &quot; &quot;);
		
		// 여분 카약이 있는 팀을 전체 배열에 표시(2)
		for(int i=0; i&amp;lt;R; i++) {
			int rNum = Integer.parseInt(r.nextToken()) - 1;
			team[rNum] += 1;
		}
		
		// 여분 카약이 있는 팀은 2를 가지고 있고 카약이 부러진 팀은 0을 가지고 있음
		// 카약이 부러진 팀 전에 2를 가지고 있다면 team[i-1] = 1로 바꾸고 team[i]=1으로 변경
		// 왼쪽한테 빌려주기 &amp;gt; 안되면 오른쪽한테 빌리기로 진행
		// team[0]와 team[last index]일 경우는 따로 구함
		
		for(int i=0; i&amp;lt;N; i++) {
			
			if(i==0) {
				if(team[0] == 2 &amp;amp;&amp;amp; team[1] == 0) {
					team[0] = 1;
					team[1] = 1;
				}
				
			}else if(i == N-1) {
				if(team[i] == 2 &amp;amp;&amp;amp; team[i-1] == 0) {
					team[i] = 1;
					team[i-1] = 1;
				}
				
			}else if(team[i] == 2) {
					if(team[i-1] == 0) {
						team[i-1] = 1;
						team[i] = 1;
						
					}else if(team[i+1] == 0) {
						team[i] = 1;
						team[i+1] = 1;
					}
			}
		}
		
		int answer = 0;
		
		for(int i=0; i&amp;lt;N; i++) {
			if(team[i]==0) {
				answer += 1;
			}
		}
		
		System.out.println(answer);
		bw.flush();
		bw.close();
		br.close();	
	}	
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Your Name</name></author><summary type="html">그리디 알고리즘(Greedy Algorithm) 당장 눈 앞에 최적의 상황만을 쫓는 알고리즘 극단적인 경우로 정렬 기법이 함께 쓰인다</summary></entry></feed>