<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>su-mmer TIL</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 18 Jan 2023 07:27:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. su-mmer TIL. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/su-mmer" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[230118]]></title>
            <link>https://velog.io/@su-mmer/230118</link>
            <guid>https://velog.io/@su-mmer/230118</guid>
            <pubDate>Wed, 18 Jan 2023 07:27:33 GMT</pubDate>
            <description><![CDATA[<p>docker-compose version 맞추기</p>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/dd69dc4f-f6a1-4cf6-b7a2-5eaa523c63fe/image.png" alt=""></p>
<pre><code>FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD [&quot;flask&quot;, &quot;run&quot;]</code></pre><p>docker-compose로 Django 실행하기</p>
<p><img src="https://docs.docker.com/samples/django/" alt="Docker sample site"></p>
<p><img src="https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/django/" alt="Github readme"></p>
<pre><code># mysql

version: &quot;3&quot;
services:
  db:
    image: mysql:latest
    container_name: mysql-server
    ports:
      - &quot;3306:3306&quot;
    environment:
      MYSQL_ROOT_PASSWORD: root
    command: # 명령어 실행
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./data/:/var/lib/mysql</code></pre><h1 id="virtual-box-xshell">virtual box xshell</h1>
<p>관리자</p>
<ol>
<li>NAT Network 생성, 포트 설정</li>
</ol>
<p>머신</p>
<ol>
<li>유선 네트워크 설정 &gt; ipv4 설정 &gt; 네트워크 껐다 켜기</li>
<li>인터넷 확인</li>
<li>openssh 설치</li>
<li>xshell 연결</li>
</ol>
<h1 id="쿠버네티스-환경-설정">쿠버네티스 환경 설정</h1>
<pre><code># master, node1, node2 동일
swapoff -a &amp;&amp; sed -i &#39;/ swap / s/^\(.*\)$/#\1/g&#39; /etc/fstab

sysctl params required by setup, params persist across reboots
cat &lt;&lt;EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo apt-get install -y apt-transport-https ca-certificates curl

sudo mkdir /etc/apt/keyrings

sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat &lt;&lt;EOF | tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/kubernetes-xenial main
EOF

echo &quot;deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main&quot; | sudo tee /etc/apt/sources.list.d/kubernetes.list

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null

sudo apt-get update

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

sudo systemctl status docker
sudo systemctl start docker
sudo systemctl enable docker

sudo apt-get install -y kubelet kubeadm kubectl

# 고정
sudo apt-mark hold kubelet kubeadm kubectl

systemctl start kubelet

systemctl enable kubelet

# master 설정
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
kubeadm init
&gt; kubeadm join~으로 시작하는 키 저장해두기

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get node
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

# node1, node2 설정
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
kubeadm join~으로 시작하는 키 입력

# master에서 확인
kubectl get node</code></pre><p><img src="https://velog.velcdn.com/images/su-mmer/post/1abd667e-03f1-4fde-b530-7e5839cab3bb/image.png" alt=""></p>
<p>kubectl
kubelet(-&gt;daemon)
<img src="https://velog.velcdn.com/images/su-mmer/post/0362e8c2-aa7b-4151-8442-f2e6568a260d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[230117]]></title>
            <link>https://velog.io/@su-mmer/230117</link>
            <guid>https://velog.io/@su-mmer/230117</guid>
            <pubDate>Tue, 17 Jan 2023 08:19:29 GMT</pubDate>
            <description><![CDATA[<p><code>DOCKER OFFICIAL IMAGE</code> 마크가 붙은 이미지만 사용할 것
<img src="https://velog.velcdn.com/images/su-mmer/post/e47f15f1-b20e-46cd-836d-e54c6d852cc7/image.png" alt=""></p>
<pre><code class="language-bash"># docker image를 hub에서 찾기
docker search &lt;image_name&gt;

# container 자세히보기
docker inspect [OPTIONS] NAME|ID [NAME|ID...]

# container 로그 확인
docker logs [OPTIONS] CONTAINER

# docker port 보이기
docker port CONTAINER [PRIVATE_PORT[/PROTO]]

# 컨테이너에서 실행중인 프로세스 출력
docker top CONTAINER [ps OPTIONS]

# 이미지에 태그 설정
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]</code></pre>
<p>각 컨테이너들은 컨테이너 ID를 가진다.
컨테이너 내부에 데이터 볼륨 및 저장소를 가진다.</p>
<pre><code># 도커 전체에 대한 정보 확인
docker info</code></pre><p>3GB = 3000MB
3GiB = 1024*3MB</p>
<p>보안 구성 - 해킹 방지</p>
<hr>
<pre><code>#compose 설치
curl -SL https://github.com/docker/compose/releases/download/v2.14.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version</code></pre><hr>
<pre><code># volume 경로 찾기 실습
docker run -d -p 5000:5000 --restart always --name registry registry:2

docker tag httpd:latest localhost:5000/httpd:latest

docker push localhost:5000/httpd:latest</code></pre><blockquote>
<p>volume 경로
/var/lib/docker/volumes/[Container_ID]/_data/docker/registry/v2/repositories/httpd</p>
</blockquote>
<hr>
<pre><code># 스트레스 테스트
cat &gt; dockerfile

FROM debian
MAINTAINER kwjeon31 &lt;kwjeon31@gmail.com&gt;
run apt-get update; apt-get install -y stress
CMD [&quot;bin/sh&quot;, &quot;-c&quot;, &quot;stress -c 2&quot;]

docker build -t stress .

# memory-swap으로 100M를 쓰고 cpu는 2개 io 4, vmbyte 90m, timeout 1초
docker run -m 100m --memory-swap 100m stress:latest stress --cpu 2 --io 4 --vm-bytes 90m --timeout 1</code></pre><p><img src="https://velog.velcdn.com/images/su-mmer/post/78f6d857-eee5-4892-b2c5-b1cba5942ca5/image.png" alt=""></p>
<pre><code># mysql 설치
docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:latest
</code></pre><p><img src="https://velog.velcdn.com/images/su-mmer/post/d88e7c00-3ae6-4f08-af9f-f1e8de610a35/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/0068bd2c-d198-4abe-80cd-56af4f3a47ba/image.png" alt=""></p>
<pre><code># 
echo &quot;&lt;h1&gt; Docker Environment Test&lt;/h1&gt;&quot; &gt; index.html

docker run -d --name web -v /home/guru/workspace/webdata:/usr/share/nginx/html:ro --rm -p 80:80 nginx:latest

docker cp /webdata/index.html  web:/usr/share/nginx/html

# 어디에 쓰는거?
docker run -it --name c1 busybox</code></pre><pre><code># 라우팅 정보 확인
sudo apt install bridge-utils

brctl show
alias crm=&#39;docker rm -f $(docker ps -aq)&#39;</code></pre><pre><code># cat &gt; df.sh

#!/bin/bash
mkdir -p /webdata
while true
do
   df -h / &gt; /webdata/index.html
   sleep 10
done

---
# dockerfile

FROM ubuntu:18.04
ADD df.sh /bin/df.sh
RUN chmod +x /bin/df.sh
ENTRYPOINT [&quot;/bin/df.sh&quot;]</code></pre><pre><code># docker network 생성

docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.254 mynet

docker run -it --name c1 --net mynet --ip 192.168.100.100 --rm busybox</code></pre><p><img src="https://velog.velcdn.com/images/su-mmer/post/e3209ef0-9909-4f49-afb4-52af66758f5c/image.png" alt="">
<img src="https://velog.velcdn.com/images/su-mmer/post/c259372a-796b-46d9-89c4-655128b39198/image.png" alt=""></p>
<pre><code># 안 됨
docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql:5.7

docker run -p 80:80 -d --name wordpress -e WORDPRESS_DB_PASSWORD=root --link wordpressdb:mysql wordpress</code></pre><pre><code># 안 됨

import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host=&#39;redis&#39;, port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr(&#39;hits&#39;)
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route(&#39;/&#39;)
def hello():
    count = get_hit_count()
    return &#39;Hello World! I have been seen {} times.\n&#39;.format(count)

---
# dockerfile

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD [&quot;flask&quot;, &quot;run&quot;]

---
# docker-compose.yml

version: &#39;3&#39;
services:
  web:
    build: .
    ports:
      - &quot;5000:5000&quot;
  redis:
    image: &quot;redis:alpine&quot;</code></pre><p><img src="https://velog.velcdn.com/images/su-mmer/post/1ecc0087-44a7-45a4-9a21-d3bcc454729a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[230116]]></title>
            <link>https://velog.io/@su-mmer/230116</link>
            <guid>https://velog.io/@su-mmer/230116</guid>
            <pubDate>Mon, 16 Jan 2023 10:24:32 GMT</pubDate>
            <description><![CDATA[<p>scale up
scale out
scale in</p>
<p>업무 단위 서비스임
기간이 오래걸림
시간 단위로 클라우드에 이용 신청(peak때 서버 터짐 방지)</p>
<p>컨테이너
(OS+DB+WAS+WEB)
3tier 이중화(DRS때문에)</p>
<ol>
<li>네트워크 장비 가상화 필요</li>
<li>CPU 가상화 필요</li>
<li>OS 가상화 필요</li>
<li>WAS 가상화 필요</li>
</ol>
<p>-&gt; 1234 묶어 쓰는 것이 Docker</p>
<p>서버의 도입 기간이 필요 없다.
필요 없는 공간을 scale-in 하여 남는 자원이 없게 한다. (자원 절약)
이것을 잘 이용 할수록 회사에 이득</p>
<h1 id="docker">Docker</h1>
<h2 id="ubuntu-설치">Ubuntu 설치</h2>
<h2 id="window-설치">Window 설치</h2>
<p><img src="https://www.docker.com/products/docker-desktop/" alt="Docker Desktop Download(Window)">
윈도우 버전이 안 맞아서 실패!</p>
<h2 id="docker-이미지">Docker 이미지</h2>
<p>시스템을 3가지로 운영: 개발 서버, 테스트 서버, 운영 서버(main)</p>
<ul>
<li>개발 서버 DB WAS WEB
고객, 임직원 개인정보/영업데이터/연구데이터 -&gt; 노출되면 안됨</li>
<li><blockquote>
<p>편집(암호화) -&gt; 제공(API 형식??)</p>
</blockquote>
</li>
</ul>
<p>-&gt; 개발 서버에서 테스터 서버로 데이터 제공하여 테스트 후 개발자에게 제공</p>
<ul>
<li><p>개발 서버에서 단위 테스트</p>
</li>
<li><p>테스트서버에서 통합 테스트(integration)</p>
</li>
<li><p>마지막에 운영책임자가 인수테스트(메인서버에서 잘 돌아갈지)</p>
</li>
<li><p>테스트에만 2~3개월</p>
</li>
<li><p>docker run
= pull+start</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[230113 - Linux]]></title>
            <link>https://velog.io/@su-mmer/230113-Linux</link>
            <guid>https://velog.io/@su-mmer/230113-Linux</guid>
            <pubDate>Mon, 16 Jan 2023 00:11:11 GMT</pubDate>
            <description><![CDATA[<h1 id="shell">Shell</h1>
<h3 id="shell의-기능">shell의 기능</h3>
<ul>
<li>명령어 해석기</li>
<li>프로그래밍: shell 스크립트</li>
<li>사용자 환경설정</li>
</ul>
<h3 id="shell-기본-사용법">shell 기본 사용법</h3>
<p><code>/etc/passwd</code>에 위치</p>
<h3 id="로그인-shell">로그인 shell</h3>
<p>서브 shell: 사용자가 프롬프트에서 다른 셸을 실행하여 생긴 셸</p>
<h2 id="사용법">사용법</h2>
<h3 id="출력">출력</h3>
<p>echo 입력받은 대로 출력(개행있음)
printf 개행 없이 입력받은 대로 출력</p>
<h3 id="특수문자">특수문자</h3>
<p>ls *
cp * /tmp
ls -F t*
cp <em>.txt _/ch3
ls -l h</em>d</p>
<p>? 한글자 대체
[]</p>
<p>; 차레대로 명령 실행
| 명령을 전달해서 실행</p>
<p>&#39;&#39;
&quot;&quot;
`` 가 명령으로 해석된다.
\ 
&gt; 왼쪽의 결과를 오른쪽 파일에 덮어씀
&gt;&gt; 왼쪽의 결과를 오른쪽 파일에 이어붙임
&lt; 오른쪽 파일을 왼쪽 명령어로 실행</p>
<h2 id="입출력-방향-변경">입출력 방향 변경</h2>
<h3 id="출력-리다이렉션">출력 리다이렉션</h3>
<p>&gt; 파일 덮어쓰기
0&lt; 표준입력
1&gt; 표준출력을 오른쪽 파일에 저장
2&gt; 표준에러를 오른쪽 파일에 저장</p>
<h2 id="환경변수">환경변수</h2>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/21946116-3cd3-4415-8af1-36338603231b/image.png" alt=""></p>
<p>숫자도 문자로 읽는다. 띄어쓰기는 못 알아먹으니까 &quot;&quot;로 감싸주어야한다. $가 들어간 문자를 출력하려면 묶어주거나 \을 붙인다. </p>
<pre><code class="language-bash">myvar=&quot;Hi Woo&quot;
echo $myvar
echo &quot;$myvar&quot;
echo &#39;$myvar&#39;
echo \$myvar
read myvar
echo &#39;$myvar&#39;=$myvar</code></pre>
<pre><code class="language-bash">testval=7+10
echo $testval</code></pre>
<pre><code class="language-bash">#!/bin/sh
num1=100
num2=$num1 + 200
echo $num2
num3=`expr $num1 +  200`
echo $num3
num4=`expr  \(  $num1 + 200  \) / 10  \*  2`
echo $num4
exit 0</code></pre>
<h3 id="if-else-문">if-else 문</h3>
<blockquote>
</blockquote>
<p>if [조건]
then
참일 경우 실행
else
거짓인 경우 실행
fi</p>
<pre><code class="language-bash">#!/bin/sh
if [ &quot;woo&quot; != &quot;woo&quot; ]
then
    echo &quot;참입니다&quot;
else
   echo &quot;거짓입니다&quot;
fi
exit 0</code></pre>
<h3 id="비교-연산자">비교 연산자</h3>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/cee1bcec-2669-4e9e-9ff1-52722279f42a/image.png" alt=""></p>
<pre><code class="language-bash">#!/bin/sh
if [ 100 -eq 200 ]
then
   echo &quot;100과 200은 같다.&quot;
else
   echo &quot;100과 200은 다르다.&quot;
fi
exit 0</code></pre>
<h3 id="파일과-관련된-조건">파일과 관련된 조건</h3>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/113ef5b4-91f8-4a86-af47-26a5b1af04d0/image.png" alt=""></p>
<pre><code class="language-bash">#!/bin/sh
fname=/lib/systemd/system/cron.service
if [ -f $fname ]
then
   head -5 $fname
else
   echo &quot;cron 서버가 설치되지 않았습니다.&quot;
fi
exit 0</code></pre>
<h3 id="caseesac문">case~esac문</h3>
<ul>
<li>if문은 참과 거짓만 가능</li>
<li>여러가지 경우의 수일 경우 case문 사용<pre><code class="language-bash">#!/bin/sh
case &quot;$1&quot; in
 start)
    echo &quot;시작~~&quot;;;
 stop)
    echo &quot;중지~~&quot;;;
 restart)
    echo &quot;다시 시작~~&quot;;;
 *)
    echo &quot;뭔지 모름~~&quot;;;
esac
exit 0</code></pre>
</li>
</ul>
<pre><code class="language-bash">#!/bin/sh
echo &quot;리눅스가 재미있나요? (yes / no)&quot;
read answer
case $answer in
   yes | y | Y | Yes | YES)
      echo &quot;다행입니다.&quot;
      echo &quot;더욱 열심히 하세요 ^^&quot;;;
   [nN]*)
      echo &quot;안타깝네요. ㅠㅠ&quot;;;
   *)
      echo &quot;yes 아니면 no만 입력했어야죠&quot;
      exit 1;;
esac
exit 0</code></pre>
<h3 id="and-or-연산자">and, or 연산자</h3>
<pre><code class="language-bash">#!/bin/sh
echo &quot;보고 싶은 파일명을 입력하세요.&quot;
read fname
if [ -f $fname ] &amp;&amp; [ -s $fname ] ; then
   head -5 $fname
else
   echo &quot;파일이 없거나, 크기가 0입니다.&quot;
fi
exit 0</code></pre>
<h3 id="for--in-문">for ~ in 문</h3>
<pre><code class="language-txt">for 변수 in 값1 값2 ..
do
    반복할 문장
done</code></pre>
<pre><code class="language-bash">#!/bin/sh
hap=0
for i in 1 2 3 4 5 6 7 8 9 10
do
   hap=`expr $hap + $i`
done
echo &quot;1부터 10까지의 합: &quot;$hap
exit 0</code></pre>
<pre><code class="language-bash">#!/bin/sh
for fname in $(ls *.sh)
do
   echo &quot;--------$fname-------&quot;
   head -3 $fname
done
exit 0</code></pre>
<h3 id="while문">while문</h3>
<pre><code class="language-bash">#!/bin/sh
while [ 1 ]
do
   echo “우분투 16.04 LTS”
done
exit 0</code></pre>
<pre><code class="language-bash">#!/bin/sh
hap=0
i=1
while [ $i -le 10 ]
do
   hap=`expr $hap + $i`
   i=`expr $i + 1`
done
echo &quot;1부터 10까지의 합 : &quot;$hap
exit 0</code></pre>
<pre><code class="language-bash">#!/bin/sh
echo &quot;비밀번호를 입력하세요.&quot;
read mypass
while [ $mypass != &quot;1234&quot; ]
do
   echo &quot;틀렸음. 다시 입력하세요.&quot;
   read mypass
done
echo &quot;통과~~&quot;
exit 0</code></pre>
<h3 id="그-외">그 외</h3>
<ul>
<li>until</li>
<li>break, continue, exit, return<pre><code class="language-bash">#!/bin/sh
echo &quot;무한반복 입력을 시작합니다(b: break, c: continue, e: exit)&quot;
while [ 1 ] ; do
read input
case $input in
  b | B )
      break ;;
  c | C )
      echo &quot;continue를 누르면 while의 조건으로 돌아감&quot;
      continue ;;
  e | E )
      echo &quot;exit를 누르면 프로그램(함수)를 완전히 종료함&quot;
      exit 1 ;;
esac;
done
echo &quot;break를 누르면 while을 빠져나와 지금 이 문장이 출력됨.&quot;
exit 0</code></pre>
</li>
</ul>
<pre><code class="language-bash">#!/bin/sh
hap=0
i=1
until [ $i -gt 10 ]
do
   hap=`expr $hap + $i`
   i=`expr $i + 1`
done
echo &quot;1부터 10까지의 합 : &quot;$hap
exit 0</code></pre>
<h3 id="사용자-정의-함수">사용자 정의 함수</h3>
<pre><code>func_name() {
    definition
    $1, $2등 사용
}
func_name 10 20 &lt;- call</code></pre><pre><code class="language-bash">#!/bin/sh
hap () {
   echo `expr $1 + $2`
}
echo &quot;10 더하기 20을 실행합니다&quot;
hap 10 20
exit</code></pre>
<h3 id="eval">eval</h3>
<ul>
<li>문자열을 명령문으로 인식하고 실행</li>
</ul>
<pre><code class="language-bash">#!/bin/sh
str=&quot;ls -l test18.sh&quot;
echo $str
eval $str
exit 0</code></pre>
<h3 id="export">export</h3>
<ul>
<li>외부 변수로 선언, 다른 프로그램에서도 사용할 수 있도록 함.</li>
</ul>
<pre><code class="language-bash">// test1.sh
#!/bin/sh
echo $var1
echo $var2
exit 0</code></pre>
<pre><code class="language-bash">// test2.sh
#!/bin/sh
var1=&quot;지역 변수&quot;
export var2=&quot;외부 변수&quot;
sh test1.sh
exit 0</code></pre>
<h3 id="set-">set, $</h3>
<ul>
<li>리눅스 명령어를 결과를 사용하기 위해서는 $형식 사용</li>
<li>결과를 파라미터에 저장<pre><code class="language-bash">echo &quot;오늘 날짜는 $(date)입니다.&quot;
set $(date)
echo &quot;오늘은 $4요일 입니다.&quot;
exit 0</code></pre>
<h3 id="shift">shift</h3>
</li>
<li>파라미터 변수를 왼쪽으로 한 단계씩 아래로 이동(shift)<pre><code class="language-bash">#!/bin/sh
myfunc() {
  str=&quot;&quot;
  while [ &quot;$1&quot; != &quot;&quot; ] ; do
      str=&quot;$str $1&quot;
      shift
  done
  echo $str
}
myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
exit 0</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[23 01 12]]></title>
            <link>https://velog.io/@su-mmer/23-01-12</link>
            <guid>https://velog.io/@su-mmer/23-01-12</guid>
            <pubDate>Thu, 12 Jan 2023 13:40:47 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th>구분</th>
<th>리눅스</th>
<th>window cmd</th>
</tr>
</thead>
<tbody><tr>
<td>디렉토리 파일 목록</td>
<td>ls</td>
<td>dir</td>
</tr>
<tr>
<td>디렉토리 변경</td>
<td>cd</td>
<td>cd</td>
</tr>
<tr>
<td>디렉토리 생성</td>
<td>mkdir</td>
<td>mkdir</td>
</tr>
<tr>
<td>디렉토리 삭제</td>
<td>rmdir</td>
<td>rmdir</td>
</tr>
<tr>
<td>파일 생성</td>
<td></td>
<td></td>
</tr>
<tr>
<td>파일 복제</td>
<td>cp</td>
<td>copy</td>
</tr>
<tr>
<td>파일 삭제</td>
<td>rm</td>
<td>del</td>
</tr>
<tr>
<td>파일 이동</td>
<td>mv</td>
<td>move</td>
</tr>
</tbody></table>
<h1 id="파일-관련-명령어">파일 관련 명령어</h1>
<ul>
<li><p>tail &lt;file_name&gt;</p>
<ul>
<li>파일 내용의 뒷부분 출력하기</li>
<li><code>-&lt;숫자&gt;</code> 뒤에서 n줄</li>
</ul>
</li>
<li><p>ln link</p>
<ul>
<li>ln &lt;원본&gt; &lt;링크&gt;</li>
<li><code>-s</code> 심볼릭 링크 생성<ul>
<li>원본을 사용할 수 있는 권한이 있어야 링크를 걸 수 있다.
<img src="https://velog.velcdn.com/images/su-mmer/post/8a76ab1a-66e2-4af9-9cb6-933dc75c1b66/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
<li><p>touch</p>
<ul>
<li>파일이 없으면 파일을 새로 생성하고, 만들어진 파일은 해당 파일의 시간을 변경해준다.</li>
<li><code>-t</code> 변경할 시간 지정</li>
<li>ccyymmdd
<img src="https://velog.velcdn.com/images/su-mmer/post/a5504daa-f404-4845-8ff3-f20b410f1efb/image.png" alt=""></li>
</ul>
</li>
<li><p>grep</p>
<ul>
<li>내용 찾기</li>
<li><code>grep &lt;option&gt; &lt;pattern&gt; &lt;file&gt;</code>
<img src="https://velog.velcdn.com/images/su-mmer/post/a0328392-aa7f-4dac-b340-40094291b9c2/image.png" alt=""></li>
</ul>
</li>
<li><p>find</p>
<ul>
<li>파일 찾기</li>
<li><code>find &lt;path&gt; &lt;조건&gt; &lt;동작&gt;</code>
<img src="https://velog.velcdn.com/images/su-mmer/post/79885c6c-375f-4a1f-80aa-fc7c316344dc/image.png" alt=""></li>
</ul>
</li>
<li><p>which</p>
<ul>
<li>위치를 찾아서 출력(환경path 내에서)</li>
</ul>
</li>
<li><p>whereis</p>
<ul>
<li>위치를 찾아서 출력</li>
<li>환경 path 내에서 찾는 것은 동일하지만 실행 파일, 소스코드, 디렉토리, 매뉴얼 파일 등 전부 찾음
<img src="https://velog.velcdn.com/images/su-mmer/post/9b2516d5-0745-4ad3-be15-0fe30b77231e/image.png" alt=""></li>
</ul>
</li>
</ul>
<h1 id="문서-편집">문서 편집</h1>
<h2 id="vi">vi</h2>
<h3 id="vi-입력-키">vi 입력 키</h3>
<table>
<thead>
<tr>
<th>명령키</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td>i</td>
<td>현재 커서에서 입력 시작</td>
</tr>
<tr>
<td>a</td>
<td>현재 커서 다음부터 입력 시작</td>
</tr>
<tr>
<td>o</td>
<td>현재 커서를 다음줄로 내려 빈 행에서 입력 시작</td>
</tr>
<tr>
<td>I</td>
<td>현재 커서 행의 처음으로 이동해서 입력 시작</td>
</tr>
<tr>
<td>A</td>
<td>현재 커서 행의 마지막으로 이동해서 입력 시작</td>
</tr>
<tr>
<td>O</td>
<td>현재 행을 다음줄로 내리고 커서는 안 움직임</td>
</tr>
</tbody></table>
<h3 id="이동-키">이동 키</h3>
<table>
<thead>
<tr>
<th>명령키</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td>k/j</td>
<td>커서 위/아래</td>
</tr>
<tr>
<td>l/h</td>
<td>왼쪽/오른쪽</td>
</tr>
<tr>
<td>^또는 0/$</td>
<td>줄의 첫 문자/마지막으로 이동</td>
</tr>
<tr>
<td>-/+ 또는 엔터</td>
<td>커서를 앞/다음 행의 처음으로 이동</td>
</tr>
<tr>
<td>H/M/L</td>
<td>커서를 화면의 맨위/중간/맨아래 행으로 이동</td>
</tr>
<tr>
<td>w/e</td>
<td>커ㅓ를 다음 단어의 처음/마지막 글자로 이동</td>
</tr>
<tr>
<td>b</td>
<td>커서를 앞 단어의 첫 글자로 이동</td>
</tr>
</tbody></table>
<h3 id="검색">검색</h3>
<p>/&lt;검색할 단어&gt;
n 다음으로 이동</p>
<h3 id="내용-수정">내용 수정</h3>
<p>r 커서가 위치한 문자 한 개 변경
cw, #cw 커서 위치부터 단어 한 개 수정(#은 단어 갯수)
s, #s 커서 위치부터 esc 입력할 때까지 수정
cc 커서가 위치한 행의 내용 모두 수정
C 커서 위치부터 행의 끝까지 수정</p>
<h3 id="내용-삭제">내용 삭제</h3>
<p>x, #x 커서 한개 삭제
dw 단어 삭제
dd, #dd 행 삭제
D(shift+d) 커서 위치부터 행의 끝까지 삭제
. 반복</p>
<h3 id="이전-명령-취소">이전 명령 취소</h3>
<p>u (undo)명령 취소
U 해당 행에서 한 모든 명령 취소
:e! 변경 내용 초기화</p>
<h3 id="복사-및-잘라-붙이기">복사 및 잘라 붙이기</h3>
<p>yy, #yy 한 줄 복사(yank)
p 붙이기
P 뭐더라?</p>
<h3 id="검색-1">검색</h3>
<p>/문자열 순방향 검색
?문자열 역방향 검색
n 다음 단어
N 이전 단어</p>
<h3 id="바꾸기">바꾸기</h3>
<p>:s/문자열1/문자열2/ 행에서 처음 나오는 문자열1 찾아서 변경
:%s/문자열1/문자열2/g 파일 전체에서 찾아서 변경</p>
<h3 id="파일-읽어오기">파일 읽어오기</h3>
<p>:r &lt;파일&gt; 지정한 파일을 읽어들여 현재 커서 위치에 삽입
:e &lt;파일&gt; 지정한 파일로 전환</p>
<h3 id="셸-명령">셸 명령</h3>
<p>:!&lt;셸 명령&gt; vi 작업을 잠시 중단하고 셸 명령 실행
:sh vi를 빠져나가서 셸 명령 실행</p>
<h1 id="파일-접근-권한-명령어">파일 접근 권한 명령어</h1>
<h2 id="파일-접근-권한-변경">파일 접근 권한 변경</h2>
<p>chmod
r(=4) w(=2) x(=1)
umask</p>
<h2 id=""></h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[리눅스 기초 230111]]></title>
            <link>https://velog.io/@su-mmer/%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B8%B0%EC%B4%88-230111</link>
            <guid>https://velog.io/@su-mmer/%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B8%B0%EC%B4%88-230111</guid>
            <pubDate>Wed, 11 Jan 2023 02:33:08 GMT</pubDate>
            <description><![CDATA[<h1 id="리눅스-지식">리눅스 지식</h1>
<p>Open Source software를 사용한 software도 무료로 배포해야 한다.
20.04(LTS: Long Term Service 5년 간 지원) 버전 사용 </p>
<h1 id="리눅스-기초-명령어">리눅스 기초 명령어</h1>
<ul>
<li>pwd 현재 위치</li>
<li>cd change directory</li>
<li>ls list<ul>
<li><code>-a</code> 옵션으로 숨김 파일까지 모두 보기</li>
<li><code>-l</code> 옵션으로 한 줄씩 나타내기</li>
<li>d는 디렉토리, l은 심볼릭 링크, -은 파일을 나타냄</li>
<li>rwxrwxrwx에서 처음 3개는 user의 권한, 두번째 3개는 group의 권한, 마지막 3개는 other의 권한</li>
<li>링크 갯수, uid, gid, size, date, name
<img src="https://velog.velcdn.com/images/su-mmer/post/a829dd69-bf33-49b0-a531-f556add2e073/image.png" alt=""></li>
</ul>
</li>
<li>date 날짜, 시간 출력</li>
<li>clear</li>
<li>man manual<ul>
<li><code>man &lt;command&gt;</code></li>
</ul>
</li>
<li>passwd password 변경<ul>
<li><code>password &lt;user&gt;</code></li>
</ul>
</li>
</ul>
<blockquote>
</blockquote>
<p>~ home에서 user의 directory
/ root directory</p>
<h1 id="리눅스의-파일과-디렉토리">리눅스의 파일과 디렉토리</h1>
<ul>
<li>파일: 관련있는 정보들의 집합</li>
<li>리눅스는 디렉토리도 파일로 취급<ul>
<li>장치파일: 장치도 파일로 취급</li>
</ul>
</li>
<li>심볼릭 링크<h2 id="파일">파일</h2>
</li>
<li>file<ul>
<li><code>file &lt;file_name&gt;</code> 해당 파일의 종류 알려줌<h2 id="디렉토리">디렉토리</h2>
</li>
</ul>
</li>
<li>usr (Unix System Resource) 기본 실행 파일과 라이브러리 파일, 헤더 파일 등</li>
<li>sys 터미널 관련 파일</li>
<li>opt 추가 패키지 설치되는 디렉토리</li>
<li>mnt 파일 시스템 임시 마운트</li>
<li>proc 커널 관련 정보<blockquote>
<p><code>tty</code>로 내가 현재 사용중인 터미널 번호 확인</p>
</blockquote>
</li>
</ul>
<h2 id="파일디렉토리-이름의-규칙">파일/디렉토리 이름의 규칙</h2>
<ul>
<li><code>/</code>을 사용할 수 없다.</li>
<li><code>알파벳, 숫자, -, _, .</code> 사용 가능</li>
<li><code>&gt;, |, :, &amp;, 공백</code>은 피한다.</li>
<li>대소문자 구분</li>
<li><code>.</code>로 시작하면 숨김 파일</li>
<li><code>\0</code>을 사용하지 않음</li>
</ul>
<h1 id="디렉토리-관련-명령">디렉토리 관련 명령</h1>
<ul>
<li><p>cd 옵션 없으면 home으로 이동</p>
</li>
<li><p>ls</p>
<ul>
<li><code>-i</code> 첫번째 행에 inode 출력</li>
<li><code>-A</code> .와 ..을 제외한 모든 파일</li>
<li><code>-F</code> 파일의 종류 함께 출력(* 실행 파일, / 디렉토리, @ 심볼릭 링크)</li>
<li><code>-L</code> 심볼릭 링크의 경우 원본 파일의 정보 출력</li>
<li><code>-R</code> 하위 디렉토리까지 출력</li>
</ul>
</li>
<li><p>mkdir make directory</p>
<ul>
<li><code>-p</code> 중간 디렉토리가 없을 경우 자동 생성하고 하위 디렉토리까지 생성함</li>
</ul>
</li>
<li><p>rmdir remove directory</p>
<ul>
<li><code>-p</code> 부모 디렉토리가 비었을 경우 부모 디렉토리까지 삭제(디렉토리가 비어있어야 삭제 가능)</li>
</ul>
</li>
</ul>
<h1 id="파일-관련-명령">파일 관련 명령</h1>
<ul>
<li>cat 파일 내용 출력<ul>
<li><code>-n</code> 행 번호 같이 출력</li>
</ul>
</li>
<li>more 파일 내용 화면 단위로 출력</li>
<li>less 파일 내용 화면 단위로 출력</li>
<li>cp copy<ul>
<li><code>cp &lt;복사할 대상&gt; &lt;새 파일&gt;</code></li>
<li><code>-i</code> 파일이 이미 존재할 때 덮어쓸지 물어봄</li>
<li><code>-r</code> 디렉토리 복사</li>
</ul>
</li>
<li>mv move 이동하거나 이름 변경<ul>
<li><code>mv &lt;이동할 대상&gt; &lt;새 파일&gt;</code></li>
<li><code>-i</code> 파일이 이미 존재할 때 덮어쓸지 물어봄</li>
</ul>
</li>
<li>rm remove<ul>
<li><code>-i</code> 파일을 진짜 삭제할건지 확인</li>
<li><code>-r</code> 디렉토리 삭제 (=rmdir)</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 함수2]]></title>
            <link>https://velog.io/@su-mmer/JS-%ED%95%A8%EC%88%982</link>
            <guid>https://velog.io/@su-mmer/JS-%ED%95%A8%EC%88%982</guid>
            <pubDate>Mon, 31 Oct 2022 13:11:06 GMT</pubDate>
            <description><![CDATA[<h1 id="rest연산자-">Rest연산자 <code>...</code></h1>
<p>인수의 마지막에 위치한다.
자동으로 남은 모든 인수를 가진다.
const sumUp = (a, b, ...numbers)
sumUp(1, 5, 10, -3, 6, 10) -&gt; a=1, b=5, ...numbers=10, -3, 6, 10</p>
<h2 id="arguments-키워드">arguments 키워드</h2>
<p>for(const num of arguments): function 키워드를 사용할 수 있는 함수 내에서만 사용 가능
배열과 비슷한 객체 제공(실제 배열은 아님)
rest 연산자가 생기기 전에 사용하던 방법</p>
<h1 id="콜백-함수">콜백 함수</h1>
<p>return 대신 함수를 사용할 수 있다.</p>
<pre><code class="language-js">const sumUp = (resultHandler, ...numbers) =&gt; {
    const validateNumber = (number) =&gt; {
        return isNaN(number) ? 0 : number;
    };

    let sum = 0;
    for (const num of numbers) {
        sum += validateNumber(num);
    }
    resultHandler(sum);
};

const showResult = (result) =&gt; {
    alert(&#39;The result after addign all numbers is: &#39; + result);
}

sumUp(showResult, 1, 4, &#39;fdsa&#39;, -3, 6, 10);</code></pre>
<p>sumUp으로 showResult를 호출하여 인자로써 전달하고 sumUp에서 sum을 showResult로 인자로써 전달한다.
js에는 신기한 기능이 정말 많다,,</p>
<h1 id="bind-함수">bind() 함수</h1>
<p>함수를 호출할 때 combine(showResult.bind(this, &#39;result is: &#39;), &#39;ADD&#39;, 1, 5);식으로 호출하게 되면 새로운 함수, 새로운 참조가 생성된다.</p>
<ul>
<li>this 인자 필수</li>
<li>받은 인자에 따라 새로운 함수를 만들어낸다.</li>
<li>함수의 인자를 &#39;사전 구성&#39;하려는 상황에서 함수를 직접 호출하지 않을 때</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[구름 먼데이 챌린지 3-3]]></title>
            <link>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-3-3</link>
            <guid>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-3-3</guid>
            <pubDate>Mon, 31 Oct 2022 06:00:47 GMT</pubDate>
            <description><![CDATA[<p><a href="https://level.goorm.io/l/challenge">구름 먼데이 챌린지 참여하기</a></p>
<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/9d161660-2b32-45b5-8cda-350b649f125d/image.png" alt="">
<img src="https://velog.velcdn.com/images/su-mmer/post/145eaaa1-3265-4c98-8790-01cf5de7e752/image.png" alt=""></p>
<h1 id="입력">입력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/a33c4745-6128-4b96-9738-aaa81ac7ffc8/image.png" alt=""></p>
<h1 id="출력">출력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/90035194-60aa-4088-aa53-9ca6b0315c56/image.png" alt=""></p>
<h1 id="예제">예제</h1>
<ul>
<li>입력1<pre><code>6 6 2
1 4
4 2
2 6
4 3
1 2
3 1</code></pre></li>
<li>출력1<pre><code>YES</code></pre></li>
<li>입력2<pre><code>6 6 2
1 2
2 3
3 4
3 5
5 6
5 2</code></pre></li>
<li>출력2<pre><code>NO</code></pre></li>
<li>입력3<pre><code>3 1 1
1 2</code></pre></li>
<li>출력3<pre><code>NO</code></pre></li>
</ul>
<h1 id="풀이">풀이</h1>
<p>문제 보고 아.. BFS인건 알겠다 했는데 못 풀었다. 난 언제쯤.. 코테 문제를 잘 풀 수 있게 될까.............힘내자</p>
<p><code>defaultdict</code>를 이용해 인접리스트를 구현한다. &lt;섬번호: 해당 섬과 연결된 섬들의 번호리스트&gt;의 형태로 저장한다.
<code>queue</code>를 이용해 다음에 방문할 섬 번호를 저장한다. 앞에서부터 하나씩 꺼내서 섬을 방문한다.
BFS 방식으로 탐색한다.
visited 리스트를 두어 다리를 몇 번 건너서 해당 섬에 도착했는지 저장한다.</p>
<h1 id="파이썬-코드">파이썬 코드</h1>
<pre><code class="language-python">import sys
input = sys.stdin.readline
from collections import deque
from collections import defaultdict

n, m, k = map(int, input().split())
dict = defaultdict(list)  # graph
for i in range(m):  # 인접리스트 구현
    s, e = map(int, input().split())
    dict[s].append(e)
    dict[e].append(s)
# print(dict)

q = deque()
# 건너는 다리 갯수 visited, -1로 채움
visited = [-1 for _ in range(n+1)]
visited[1] = 0  # 1번 노드 시작이므로 0으로 바꾸고 queue에 추가(한 번 방문)
q.append(1)

# q는 탐색 후보 노드들이니, 탐색 후보가 없다면 반복문 종료
while q:
    cur = q.popleft()
    for next in dict[cur]:
        if visited[next] != -1:
            continue
        q.append(next)
        visited[next] = visited[cur] + 1

# print(visited)
# 한 번도 방문하지 않은 경우가 있을 수 있으니 1이상
if 1 &lt;= visited[n] &lt;= k:
    print(&quot;YES&quot;)
else:
    print(&quot;NO&quot;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[구름 먼데이 챌린지 3-2]]></title>
            <link>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-3-2</link>
            <guid>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-3-2</guid>
            <pubDate>Fri, 28 Oct 2022 14:00:54 GMT</pubDate>
            <description><![CDATA[<p><a href="https://level.goorm.io/l/challenge">구름 먼데이 챌린지 참여하기</a></p>
<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/051aafe5-b1e0-425d-9500-7ec943d4d65b/image.png" alt="">
<img src="https://velog.velcdn.com/images/su-mmer/post/3d5e73ec-ac23-4b03-bbf1-05ba01a2f820/image.png" alt=""></p>
<h1 id="입력">입력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/346def43-cb03-429c-9d0e-2045eb93772d/image.png" alt=""></p>
<h1 id="출력">출력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/94e7ed49-2fbd-4818-8ec5-ca9172985936/image.png" alt=""></p>
<h1 id="예시">예시</h1>
<ul>
<li>입력1<pre><code>2
11</code></pre></li>
<li>출력1<pre><code>.</code></pre></li>
<li>입력2<pre><code>14
44433355556666</code></pre></li>
<li>출력2<pre><code>HELO</code></pre></li>
</ul>
<h1 id="풀이">풀이</h1>
<p>dictionary에 저장하고 필요한 key에 맞춰 꺼내 쓴다.
같은 숫자의 반복 횟수를 세고 해당 숫자의 반복이 주어진 횟수를 넘어가지 않았는지 검사한다.(cnt %= )
답이 될 문자를 추출한다.</p>
<h1 id="파이썬-코드">파이썬 코드</h1>
<pre><code class="language-python">import sys
input = sys.stdin.readline

n = int(input())  # 수열의 길이
dic = {
    1: &quot;1.,?!&quot;,  2: &quot;2ABC&quot;, 3: &quot;3DEF&quot;, 4: &quot;4GHI&quot;, 5: &quot;5JKL&quot;, 6: &quot;6MNO&quot;, 7: &quot;7PQRS&quot;, 8: &quot;8TUV&quot;, 9: &quot;9WXYZ&quot;,
}
command = input()  # 입력받을 수열
ans = &#39;&#39;  # 답 저장할 문자열
cnt = 0

for i in range(n):
    if i == n:
        break
    else:
        if command[i+1] == command[i]:  # 같은 숫자면
            cnt += 1
            continue
        else:
            cnt %= len(dic[int(command[i])])
            ans += dic[int(command[i])][cnt]
            cnt = 0
print(ans)</code></pre>
<p>cnt%=부분 어떻게 해결할지 생각 안나서 하다 던졌던건 기억난다,,</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1764 - 듣보잡]]></title>
            <link>https://velog.io/@su-mmer/%EB%B0%B1%EC%A4%80-1764-%EB%93%A3%EB%B3%B4%EC%9E%A1</link>
            <guid>https://velog.io/@su-mmer/%EB%B0%B1%EC%A4%80-1764-%EB%93%A3%EB%B3%B4%EC%9E%A1</guid>
            <pubDate>Fri, 28 Oct 2022 08:56:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/su-mmer/post/4345bd12-2c16-4b4f-bdb2-51dfa01e2292/image.png" alt=""></p>
<h1 id="문제">문제</h1>
<p>김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.</p>
<h1 id="입력">입력</h1>
<p>첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.</p>
<p>듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.</p>
<h1 id="출력">출력</h1>
<p>듣보잡의 수와 그 명단을 사전순으로 출력한다.</p>
<h1 id="예제">예제</h1>
<ul>
<li>입력<pre><code>3 4
ohhenrie
charlie
baesangwook
obama
baesangwook
ohhenrie
clinton</code></pre></li>
<li>출력<pre><code>2
baesangwook
ohhenrie</code></pre></li>
</ul>
<h1 id="풀이">풀이</h1>
<h1 id="파이썬-코드">파이썬 코드</h1>
<pre><code class="language-python">import sys
input = sys.stdin.readline
from collections import defaultdict

&quot;&quot;&quot;
1. 듣도 못한 사람 n, 보도 못한 사람이 m 줄 주어진다.
2. 교차되는 사람의 수와 명단을 사전순으로 출력하라.
3. defaultdict 값으로 명단을 저장해 겹치는 사람을 출력한다.
&quot;&quot;&quot;

n, m = map(int, input().split())  # n = 듣도못한사람, m = 보도못한사람
dic = defaultdict(int)  # defaultdict를 사용하여 요소 추가시 value가 자동으로 0으로 초기화되도록 한다.

# rstrip()을 이용하여 마지막 \n을 제거하고 이름들을 입력받는다.
for _ in range(n+m):
    dic[input().rstrip()] += 1

name = []  # 중복되는 이름을 저장할 리스트
for i in dic.items():
    if i[1] &gt; 1:
        name.append(i)

name = sorted(name)  # 사전순 정렬
print(len(name))
for i in name:
    print(i[0])</code></pre>
<p>파이썬 문법 공부 좀 해야겠는데...ㅠㅠ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 10806 - 숫자 카드 2]]></title>
            <link>https://velog.io/@su-mmer/%EB%B0%B1%EC%A4%80-10806-%EC%88%AB%EC%9E%90-%EC%B9%B4%EB%93%9C-2</link>
            <guid>https://velog.io/@su-mmer/%EB%B0%B1%EC%A4%80-10806-%EC%88%AB%EC%9E%90-%EC%B9%B4%EB%93%9C-2</guid>
            <pubDate>Thu, 27 Oct 2022 09:02:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/su-mmer/post/0dbc36d4-688c-4ea1-aeb2-40c4d00d6ea4/image.png" alt=""></p>
<h1 id="문제">문제</h1>
<p>숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.</p>
<h1 id="입력">입력</h1>
<p>첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.</p>
<p>셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.</p>
<h1 id="출력">출력</h1>
<p>첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.</p>
<h1 id="예제">예제</h1>
<ul>
<li>입력1<pre><code>10
6 3 2 10 10 10 -10 -10 7 3
8
10 9 -5 2 3 4 5 -10</code></pre></li>
<li>출력1<pre><code>3 0 0 1 2 0 0 2</code></pre></li>
</ul>
<pre><code class="language-python"># -*- coding: utf-8 -*-
# UTF-8 encoding when using korean

import sys
input = sys.stdin.readline
from collections import defaultdict

n = int(input())
arr = list(map(int, input().split()))
m = int(input())
find = list(map(int, input().split()))
dic = defaultdict(int)

# 가진 숫자카드 명단을 해시화한다.
for i in arr:
    dic[i] += 1
# 찾을 숫자카드의 갯수를 출력한다.
for i in find:
    print(dic[i], end=&quot; &quot;)</code></pre>
<p>해시 한 김에 해시 문제도 찾아서 풀어봤다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[구름 먼데이 챌린지 3-1]]></title>
            <link>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-3-1</link>
            <guid>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-3-1</guid>
            <pubDate>Thu, 27 Oct 2022 08:01:04 GMT</pubDate>
            <description><![CDATA[<p><a href="https://level.goorm.io/l/challenge">구름 먼데이 챌린지 참여하기</a></p>
<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/49360943-1392-4191-8304-ee3d12184bce/image.png" alt=""></p>
<h1 id="입력">입력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/befc4ce8-b545-4873-a503-7948d5a14018/image.png" alt=""></p>
<h1 id="출력">출력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/1e4472e5-6888-472d-84c0-ad334d81c779/image.png" alt=""></p>
<h1 id="예제">예제</h1>
<ul>
<li>입력1<pre><code>8
1 2 3 4 -1 -2 -3 -5</code></pre></li>
<li>출력1
```</li>
<li>1
```</li>
<li>입력2
```
8</li>
<li>1 1 2 -2 3 -3 4 5
```</li>
<li>출력2<pre><code>9</code></pre></li>
</ul>
<h1 id="풀이">풀이</h1>
<h2 id="hash-기반-자료구조">Hash 기반 자료구조</h2>
<p>Hash Fuction을 이용해 Key 값들을 정수로 변환한 뒤, 변환한 각 정수에 고유한 메모리 주소를 할당해서 O(1)의 시간 복잡도에 저장된 값들에 접근할 수 있게끔 하는 자료구조(Python의 dict)</p>
<h2 id="절댓값의-개수를-이용">절댓값의 개수를 이용</h2>
<p>절댓값들이 몇 번 등장하는지 센 후, 점수의 절댓값이 한 번만 등장하는 경우 다시 배열을 순회하면서 그 절댓값에 해당하는 사람의 점수를 답에 더해준다.</p>
<h2 id="창의력">창의력</h2>
<p>소개팅을 진행하지 않은 두 사람의 점수의 합은 전체 점수의 합에서 소개팅을 진행한 사람들의 점수의 합을 뺀 값과 같다. 그런데 소개팅을 진행한 사람들의 점수의 합은 항상 0이므로 문제의 답은 항상 전체 접수의 합이다.</p>
<h1 id="파이썬-코드">파이썬 코드</h1>
<pre><code class="language-python"># -*- coding: utf-8 -*-
# UTF-8 encoding when using korean

import sys
input = sys.stdin.readline
from collections import defaultdict

n = int(input())
dic = defaultdict() # dict에서 키-값 생성 시 값 디폴트가 공백으로 설정됨
score = list(map(int, input().split()))
for i in score:
    if abs(i) in dic:  # abs(i)가 dic에 있으면 pop
        dic.pop(abs(i))
    else: # abs(i)가 dic에 없으면 dic에 추가
        dic[i] = 1
print(sum(dic.keys()))</code></pre>
<p>나는 map으로 받은 score를 정렬하고 앞뒤로 하나씩 더해서 0이 아니면 합했다... 되게 이상하게 풀었구나..?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 함수1]]></title>
            <link>https://velog.io/@su-mmer/JS-%ED%95%A8%EC%88%981</link>
            <guid>https://velog.io/@su-mmer/JS-%ED%95%A8%EC%88%981</guid>
            <pubDate>Thu, 27 Oct 2022 07:12:12 GMT</pubDate>
            <description><![CDATA[<h1 id="함수">함수</h1>
<ol>
<li>Functions are &quot;Code on Demand&quot;</li>
</ol>
<ul>
<li>JS가 스크립트를 읽으면 전체 스크립트를 먼저 확인하고 추가한 함수 선언을 찾아서 함수를 등록하면 함수를 원할 때마다 호출할 수 있다.</li>
</ul>
<ol start="2">
<li>Variables and constants created in functions &quot;belong&quot; to that function</li>
</ol>
<ul>
<li>함수 내에서 상수나 변수를 생성하면 해당 함수에 속한다.</li>
</ul>
<ol start="3">
<li>Function CAN take parameters(arguments) and CAN return a value</li>
</ol>
<ul>
<li>함수는 인수라는 매개변수를 취해 값을 반환할 수 있다.</li>
</ul>
<ol start="4">
<li>Functions can be called multiple times(with different arguments)</li>
</ol>
<ul>
<li>함수는 여러 번 호출할 수 있고 매번 다른 인수를 전달할 수 있다.</li>
</ul>
<ol start="5">
<li>Functions can be called &quot;directly&quot; and &quot;indirectly&quot;</li>
</ol>
<ul>
<li>함수를 직접, 간접적으로 호출할 수 있다.</li>
<li>직접적으로 호출하는 경우는 함수 이름 뒤에 괄호를 추가하는 것이고, 간접적으로 호출하는 경우는 이벤트 리스너를 호출해서 바인딩하거나 버튼에 함수를 추가하는 경우.</li>
</ul>
<h2 id="매개변수parameter-vs-인자argument">매개변수(parameter) vs 인자(argument)</h2>
<ul>
<li>매개변수는 함수를 정의할 때 괄호 안에 지정하는 변수<pre><code>function sayHi(name){...}</code></pre></li>
<li>인자는 함수를 호출할 때 함수에 전달하는 값<pre><code>sayhi(&#39;Max&#39;);</code></pre></li>
</ul>
<h2 id="함수-vs-메서드">함수 vs 메서드</h2>
<p>객체에 함수를 프로퍼티로 저장할 수 있다. 키나 객체에 저장된 함수를 메서드라고 한다.</p>
<pre><code class="language-js">const person = {
    name: &#39;Max&#39;,
    greet: function greet() {
        console.log(&#39;Hello there!&#39;);
    } // greet은 person 함수의 메소드
};

startGameBtn.addEventListener(&#39;click&#39;, startGame);  // addEventListener는 startGameBtn 함수의 메소드</code></pre>
<h2 id="함수는-객체다">함수는 객체다</h2>
<p>함수는 힙에 저장된다.</p>
<h2 id="a-different-way-of-defining-functions">A different Way of Defining Functions</h2>
<h3 id="function-declaration--function-statement">Function Declaration / Function Statement</h3>
<pre><code class="language-js">function multiply(a, b) {
return a * b;
}</code></pre>
<ul>
<li>Hoisted to top, can be declared anywhere in the file (i.e. also after it&#39;s used)</li>
<li>JS가 자동으로 함수를 맨 위로 hoist하고 초기화한다. 함수를 정의하기 전 호출이 가능하다.</li>
</ul>
<h3 id="function-expression">Function Expression</h3>
<pre><code class="language-js">const multiply = function(a, b) {
return a * b;
}</code></pre>
<ul>
<li>Hoisted to top but not initialized/defined, can&#39;t be declared anywhere in the file (i.e. not after it&#39;s used)</li>
<li>상수가 정의되지 않은 상태로 hoist되기 때문에 정의되기 전까지 함수를 호출할 수 없다.</li>
</ul>
<h2 id="annonymous-function">annonymous function</h2>
<p>익명함수에 이름을 주어야하는 이유</p>
<ul>
<li>함수가 오류를 발생시켜도 어떤 함수인지 찾을 수 없다.<pre><code class="language-js">startGameBtn.addEventListener(&#39;click&#39;, function () {
  console.log(&#39;Game is starting...&#39;);
});  // 익명 함수를 작성할 수 있다.</code></pre>
</li>
</ul>
<pre><code class="language-js">startGameBtn.addEventListener(&#39;click&#39;, function startGame () {
    console.log(&#39;Game is starting...&#39;);
});  // 함수에 이름을 주어 디버깅이나 브라우저에서 오류 표시가 되었을 때 함수를 찾을 수 있게 한다.</code></pre>
<h2 id="화살표-함수">화살표 함수</h2>
<ul>
<li>함수를 전달하는 경우나 익명 함수를 사용할 때 사용한다.</li>
<li>화살표 함수가 있고 1개의 표현식만 있다면 중괄호 생략 가능</li>
<li>코드를 줄일 수 있다.</li>
</ul>
<p>&lt;General Syntax: (arg1, arg2) =&gt; {...}&gt;</p>
<ul>
<li>No Arguments/Parameters: () =&gt; {...}<ul>
<li>Empty pair parentheses is required 빈 괄호 필수</li>
</ul>
</li>
<li>Exactly one (1) Arguments/Parameter: arg =&gt; {...}<ul>
<li>Parentheses can be omitted 괄호 추가/생략 가능</li>
</ul>
</li>
<li>Exactly one expression in function body: (a, b) =&gt; a + b<ul>
<li>Curly braces can be omitted, result is returned 중괄호 생략 가능, result는 return된다.</li>
</ul>
</li>
<li>More than one expression in function body: (a, b) =&gt; { a*=2; return a+b;}<ul>
<li>Curly braces and return statement required 중괄호랑 return문 필수</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 백그라운드]]></title>
            <link>https://velog.io/@su-mmer/JS-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C</link>
            <guid>https://velog.io/@su-mmer/JS-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C</guid>
            <pubDate>Wed, 26 Oct 2022 08:10:30 GMT</pubDate>
            <description><![CDATA[<p>ES5와 ES6</p>
<h1 id="es">ES</h1>
<p>ES: ECMAScript, ECMA 국제기구에 의해 표준화된 언어
Javascript는 ECMAScript의 특정 버전
개발되고 있는 언어이며 다양한 브라우저를 지원하기 때문에 새로운 기능만 추가할 수 있고 기존의 기능을 제거하기 어렵다.
ES5에서 ES6으로 바뀌면서 많은 기능이 추가되었다.</p>
<h2 id="es5">ES5</h2>
<ul>
<li>Supported in basically all browser, including old IE</li>
<li>Only had var, not let or const</li>
</ul>
<h2 id="es6">ES6</h2>
<ul>
<li>Supported in modern browsers, can (mostly) be transpiled to ES5</li>
<li>Many new features that help us write cleaner, better &amp; faster code</li>
</ul>
<h1 id="var-vs-let--const">var vs let &amp; const</h1>
<ul>
<li>let, const를 사용함으로써 변수 범위를 제어할 수 있게 되었다.</li>
</ul>
<h2 id="var">var</h2>
<ul>
<li>Creates a variable</li>
<li>Available since .. ever</li>
<li>Function &amp; Global scope</li>
</ul>
<h2 id="let">let</h2>
<ul>
<li>Creates a variable</li>
<li>Available since ES6</li>
<li>Block scope</li>
</ul>
<h2 id="const">const</h2>
<ul>
<li>Creates a constant</li>
<li>Available since ES6</li>
<li>Block scope</li>
</ul>
<h2 id="hoisting">Hoisting</h2>
<ul>
<li>var로 생성한 변수는 변수의 선언을 파일의 시작부분으로 가져오고 undefined를 할당한다. 초기화 부분은 원래 위치에 그대로 두어서 실제 코드를 작성한 위치에서 값을 할당한다. 에러가 발생하지 않고 undefined라는 값이 도출된다.</li>
<li>let, cost도 마찬가지로 선언을 파일의 시작부분으로 가져오지만 선언만 할 뿐 초기값을 할당하지 않는다. 따라서 초기화되지 않았다는 에러가 발생한다.</li>
</ul>
<h2 id="strict-모드">strict 모드</h2>
<ul>
<li>var를 사용하면 재선언이 가능하다. 피해야한다.</li>
<li>var를 사용하면 예약어도 재선언할 수 있다. 피해야한다.</li>
<li>키워드 없이 변수를 생성할 수 있다. JS에서 자동으로 var를 추가한 것. 피해야한다.</li>
<li>이런 부분들을 피하기 위해 ES5에서 엄격 모드를 활성화할 수 있다.
<code>&#39;use strict&#39;;</code> 명령어를 함수 앞에 배치해서 엄격 모드를 활성화할 수 있다.</li>
</ul>
<h1 id="구문-분석--컴파일링">구문 분석 &amp; 컴파일링</h1>
<p>스크립트 코드를 HTMl 파일에 임포트하면 브라우저가 HTML 파일을 읽는다.
브라우저가 HTMl 스크립트를 실행한다.</p>
<ol>
<li>JS Parsing &amp; Execution: 브라우저가 JS 코드를 읽어서 로딩하는 작업. 브라우저는 JS 엔진을 이용한다. Interpreter와 Compiler로 나뉜다.</li>
<li>스크립트 분석: Interpreter가 스크립트를 로드하고 읽고 바이트코드로 변환하고 컴파일러에 전달하고 스크립트를 실행한다.</li>
<li>컴파일링: Interpreter가 스크립트를 실행하는 동안 Interpreter에서 받은 코드를 머신 코드로 변환한다. (JIT 컴파일러는 코드를 읽고 실행 중에 컴파일링을 시작하고 동시에 컴파일 된 코드를 실행한다.) 코드 변환이 끝나면 컴퓨터로 전달되어 실행 단계로 들어간다.</li>
<li>이전 실행한 코드일 때 달라진 부분이 없는 코드는 재컴파일링을 거치지 않고 재사용한다.</li>
</ol>
<p>Browser APIs: Communication Bridges between JS and Logic built into the Browser</p>
<ul>
<li>네이티브 API 호출이나 빌트인 브라우저 기능 호출은 인터프리터 또는 컴파일된 코드에 포함된다.</li>
</ul>
<h2 id="js-실행">JS 실행</h2>
<p>Inside the JS Engine: Heap &amp; Stack</p>
<ul>
<li><p>The Thing that executes your code (코드를 실행하는 주체)</p>
</li>
<li><p>메모리와 실행 단계에 대한 관리</p>
</li>
<li><p>Heap: 장기 메모리. 시스템 메모리 데이터 저장. 브라우저 작업.</p>
<ul>
<li>Memory allocation</li>
<li>Stores data in your system memory and manages access to it</li>
</ul>
</li>
<li><p>Stack: 단기 메모리. 프로그램의 흐름 관리. 주로 현재 실행되고 있는 함수 관리.</p>
<ul>
<li>Execution Context</li>
<li>Manages your program flow(function calls and communication)</li>
<li>stack은 익명 코드 실행에서부터 시작된다. 이 익명 파일은 스크립트 파일 자체이다. 전체 스크립트를 평가한 뒤에 이루어진다.</li>
<li>크롬 개발자도구 Sources부분에 Scope에서 확인 가능</li>
</ul>
</li>
<li><p>JS는 단일 스레드로 한 번에 하나의 작업만 수행한다.</p>
</li>
<li><p>이벤트 루프: 비동기 코드 실행. JS 엔진이 아닌 브라우저 개념.</p>
</li>
<li><p>엔진에는 힙, 스택이 포함된 것이 전부지만 엔진과 소통하는 브라우저에 다른 기능들이 있다. (e.g. Event Loop)</p>
</li>
</ul>
<h1 id="primitive-vs-reference-types">Primitive vs Reference Types</h1>
<ul>
<li>매우 중요!!<h2 id="primitive-values">Primitive Values</h2>
</li>
<li>Strings, Numbers, Booleans, null, undefined, Symbol</li>
<li>Stored in memory(normally on Stack), variable stores value itself 실제 값을 저장</li>
<li>Copying a variable (=assign to different variable) copies the value 값을 복사</li>
</ul>
<h2 id="reference-values">Reference Values</h2>
<ul>
<li>All other objects(&quot;more expensive to create&quot;)</li>
<li>Stored in memory(Heap), variable stores a pointer(address) to location in memory 변수가 포인터만 저장(메모리 주소만)</li>
<li>Copying a variable (=assign to different variable) copies the pointer/reference 복사 시, 포인터만 복사(주소를 복사)<ul>
<li>전개 연산자 <code>...</code>을 사용하여 객체의 값만 복사할 수 있다.</li>
</ul>
</li>
<li><code>push</code>를 사용하면 상수로 생성한 배열에 값을 추가할 수 있다. 새로운 메모리를 할당하는 것이 아니기 때문에 가능하다.</li>
<li>상수 객체를 새로 할당하는 것은 안되지만 데이터를 수정하는 것은 가능. 즉, 주소값을 건드리는 것이 아니라면 내용 수정은 가능하다.</li>
</ul>
<h1 id="garbage-collection">Garbage Collection</h1>
<ul>
<li>JS 엔진은 Garbage Collection을 갖고 있다.</li>
<li>사용되지 않은 객체에 대한 힙 메모리를 주기적으로 확인하여 메모리에서 제거</li>
<li>예를 들어 같은 EventListener를 호출할 경우 새로운 리스너를 계속 생성하는 대신 기존 리스너를 새로운 리스너로 교체한다. 그렇지 않으면 메모리 누수가 수도 없이 일어날 것이기 때문에..</li>
<li>익명 함수를 호출하면 호출할 때마다 새로운 함수가 만들어지기 때문에 메모리 누수가 야기된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 제어구조(if문, 반복문, 오류처리)]]></title>
            <link>https://velog.io/@su-mmer/JS-%EC%A0%9C%EC%96%B4%EA%B5%AC%EC%A1%B0if%EB%AC%B8-%EB%B0%98%EB%B3%B5%EB%AC%B8-%EC%98%A4%EB%A5%98%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@su-mmer/JS-%EC%A0%9C%EC%96%B4%EA%B5%AC%EC%A1%B0if%EB%AC%B8-%EB%B0%98%EB%B3%B5%EB%AC%B8-%EC%98%A4%EB%A5%98%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Tue, 25 Oct 2022 14:12:29 GMT</pubDate>
            <description><![CDATA[<h1 id="if문">if문</h1>
<ul>
<li>==와 ===의 차이<ul>
<li>==는 값이 같은지만 확인한다.</li>
<li>===는 유형까지 확인한다.
JS에서는 ===을 선호한다.</li>
</ul>
</li>
<li>&lt;, &gt;을 사용해 문자 크기 비교 가능<ul>
<li>첫번째 문자가 같을 경우 다음 문자로 넘어감</li>
<li>대문자는 소문자보다 작음<pre><code class="language-javascript">&#39;ab&#39; &gt; &#39;aa&#39; //true
&#39;a&#39; &gt; &#39;B&#39; // true
&#39;a&#39; &gt; &#39;b&#39; // false</code></pre>
</li>
</ul>
</li>
</ul>
<h2 id="객체와-배열-비교">객체와 배열 비교</h2>
<p>같은 내용을 가진 객체 또는 배열 두 개를 비교하면 false로 나옴
내용이 같다고 같은 객체가 아님
하지만 const a = obj1, a==obj1은 true임
객체 또는 배열 내의 값을 따로 비교할 수는 있음</p>
<h2 id="and-or">AND, OR</h2>
<p>AND &amp;&amp;
OR ||</p>
<h2 id="연산자-우선순위">연산자 우선순위</h2>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence">연산자 우선순위</a></p>
<h2 id="truthyfalsy">Truthy/Falsy</h2>
<p>0: false
ANY other number(incl. negative numbers): true
&quot;&quot;(empty string): false
ANY other non-empty string: true
{}, [] &amp; all other objects or arrays: true(빈 객체도 참)
null, undefined, NaN: false</p>
<ul>
<li>비교 연산자 없이 조건문에서 변수를 사용할 수 있다.</li>
</ul>
<pre><code class="language-js">const userName = &#39;Max&#39;;
const altName = &#39;&#39;;
console.log(userName === &#39;Max&#39;); // 불리언 값 참을 생성하고 출력
console.log(userName); // 문자열 &#39;Max&#39;에서 변경되지 않음

console.log(userName || null); // userName이 Truthy이므로 ||로 &#39;Max&#39;가 반환됨
console.log(altName || &#39;Max&#39;); // altName은 (빈 문자열이므로)Falsy이며 &#39;Max&#39;가 반환됨
console.log(altName || &#39;&#39;); // altName과 &#39;&#39;는 모두 Falsy이지만 만일 첫 피연산자가 Falsy라면 항상 두 번째 피연산자가 반환되므로 &#39;&#39;이 반환됨

console.log(altName || null || &#39;Anna&#39;); // altName과 null은 Falsy이므로 &#39;Anna&#39;가 반환됨

console.log(userName &amp;&amp; &#39;Anna&#39;); // userName은 Truthy이므로 두 번째 (!) 값인 &#39;Anna&#39;가 반환됨
console.log(altName &amp;&amp; &#39;Anna&#39;); // altName은 Falsy이므로 첫 번째 값인 &#39;&#39;이 반환됨
console.log(userName &amp;&amp; &#39;&#39;); // userName은 Truthy이므로 두 번째 값인 &#39;&#39;이 반환됨</code></pre>
<blockquote>
<p>===, &gt;등은 단지 비교에 쓰이는 불값만 생성합니다. || 와 &amp;&amp; 는 불리언을 생성하는 것이 아니라, 연산자 전후에 있는 값을 조건으로 취급합니다 (따라서 불값을 산출하고 필요한 경우 불리언으로 강제 변환됩니다).</p>
</blockquote>
<p>위에서 설명한 작동 방식 때문에 JavaScript에서는 || 으로 변수/상수에 기본/대체 값을 할당합니다.</p>
<pre><code class="language-js">const enteredValue = &#39;&#39;; // let&#39;s assume this is set based on some input provided by the user, therefore it might be an empty string

const userName = enteredValue || &#39;PLACEHOLDER&#39;; // will assign &#39;PLACEHOLDER&#39; if enteredValue is an empty string</code></pre>
<h2 id="boolean-tricks">Boolean Tricks</h2>
<p>단일 느낌표는 truthy 값을 실제 거짓 값으로 변환
또 다른 느낌표로 
빈 문자열 앞에 !!을 사용하면 falsy 해석 대신 실제 true, false 값이 된다.</p>
<ul>
<li>Boolean Coercion via double NOT (double bang) operator<ul>
<li>!!</li>
<li>e.g. !!&quot;&quot; -&gt; false</li>
<li>e.g. !!1 -&gt; true</li>
</ul>
</li>
<li>Default value assignment via OR operator<ul>
<li>||</li>
<li>e.g. const name = someInput || &#39;Max&#39; -&gt; someInput if not falsy, &#39;Max&#39; otherwise</li>
<li>OR 연산자와 AND 연산자는 불리언을 생성하지 않는다.</li>
</ul>
</li>
<li>Use value if condition is true via AND operator<ul>
<li>&amp;&amp;</li>
<li>e.g. const name = isLoggedIn &amp;&amp; &#39;Max&#39; -&gt; &#39;Max&#39; is set if isLoggedIn is true, false otherwise</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/c4c2e855-b829-4a97-b7fd-e1ac1a0b7690/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/75be9460-2729-46ac-a361-842863ea3450/image.png" alt=""></p>
<h1 id="반복문">반복문</h1>
<h2 id="for">for</h2>
<ul>
<li>Execute code a certain amount of times(with counter variable)<pre><code class="language-js">for (let i = 0; i &lt; 3; i++) {
  console.log(i);
}</code></pre>
</li>
</ul>
<h2 id="for-of">for-of</h2>
<ul>
<li>Execute for every element in an array</li>
<li>배열의 모든 요소에 대해 코드 적용</li>
<li>보통은 상수를 생성하여 한 번에 배열의 한 요소에만 액세스할 수 있게 한다.<pre><code class="language-js">for (const el of array) {
  console.log(el);
}</code></pre>
</li>
</ul>
<h2 id="for-in">for-in</h2>
<ul>
<li>Execute for every key in an object</li>
<li>객체의 모든 키에 대해 코드를 실행하도록 한다.<pre><code class="language-js">for (const key in obj) {
console.log(key);
console.log(obj[key]);  // 키 이름을 가진 쌍에 동적 접근
}</code></pre>
</li>
</ul>
<h2 id="while">while</h2>
<ul>
<li>Execute code as long as a condition is true<pre><code class="language-js">while (isLoggedIn) {
...
}</code></pre>
</li>
</ul>
<h3 id="do-while문">do-while문</h3>
<ul>
<li>본문을 일단 먼저 실행시키고 조건을 확인한다.</li>
<li>일반적으로 뒤에 세미콜론을 붙인다.</li>
</ul>
<h2 id="레이블">레이블</h2>
<ul>
<li>내부 반복문이 아닌 외부 반복문을 중단시키고 싶을 때 사용</li>
<li>거의 안 씀</li>
<li>반복문에 이름을 주고 break &lt;이름&gt;을 사용하면 외부 반복문이 중단된다.</li>
<li>continue와도 함께 사용 가능하다.</li>
</ul>
<h1 id="오류처리">오류처리</h1>
<h2 id="try-catch">Try-Catch</h2>
<ul>
<li>애플리케이션의 일부에 의도적으로 오류를 발생시켜 코드 여러 군데에 if문을 작성하는 대신 공식 오류 관리 도구 throw를 사용할 수 있다.</li>
</ul>
<pre><code>try {
    chosenMaxLife = getMaxLifeValues();
} catch (error) {
    console.log(error);
    chosenMaxLife = 100;
    alert(&#39;You entered something wrong&#39;);
    throw error; // 오류를 기록하고 다시 발생시켜서 사용자에 오류 메시지 표시
} finally {
    // clean up 작업
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] JS 기초: 변수, 자료형, 연산&함]]></title>
            <link>https://velog.io/@su-mmer/JS-JS-%EA%B8%B0%EC%B4%88-%EB%B3%80%EC%88%98-%EC%9E%90%EB%A3%8C%ED%98%95-%EC%97%B0%EC%82%B0%ED%95%A8</link>
            <guid>https://velog.io/@su-mmer/JS-JS-%EA%B8%B0%EC%B4%88-%EB%B3%80%EC%88%98-%EC%9E%90%EB%A3%8C%ED%98%95-%EC%97%B0%EC%82%B0%ED%95%A8</guid>
            <pubDate>Fri, 21 Oct 2022 01:14:09 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/su-mmer/post/67091ce6-64e9-4a4e-a659-5b051b854297/image.png" alt=""></p>
<p><a href="https://www.udemy.com/share/106quw/">유데미 JavaScript 완벽 가이드: 초급+고급 마스터 과정</a></p>
<h1 id="웹사이트에-자바스크립트-추가하기">웹사이트에 자바스크립트 추가하기</h1>
<ul>
<li>html과 스크립트를 한 파일에 모두 작성하면 파일이 길어지므로 나눈다.</li>
<li><code>;</code> 사용은 선택적</li>
</ul>
<h1 id="변수-상수">변수, 상수</h1>
<pre><code class="language-Javascript">let userName = &#39;Max&#39;;
userName = &#39;Manu&#39;;</code></pre>
<ul>
<li><code>let</code>을 사용해 변수를 선언하고 다음부터는 변수이름만 사용 가능</li>
<li><code>userName</code>의 값을 Max로 선언했다가 Manu로 재할당</li>
</ul>
<pre><code class="language-javascript">const totalUsers = 15;
totalUsers = 20; // Error</code></pre>
<ul>
<li><code>const</code>를 사용해 상수를 선언하고 다음부터는 상수이름만 사용 가능</li>
<li><code>totalUsers</code>의 값을 15로 선언하고 20으로 재할당하려고 하면 에러(상수값은 한 번 설정 후 바꿀 수 없음)</li>
</ul>
<h2 id="이름-규칙">이름 규칙</h2>
<ul>
<li>camelCase 사용(JS에서는 user_name보다는 userName 권장)</li>
<li>대소문자 구분</li>
<li>특수문자 <code>$</code> <code>_</code> 허용</li>
<li>숫자 허용(숫자로 시작하면 안됨)</li>
<li>키워드를 이름으로 사용하면 안됨</li>
</ul>
<h2 id="연산자">연산자</h2>
<ul>
<li><ul>
<li><ul>
<li>/ % <em>* = ++ -- += -= /= \</em>=<h2 id="typeof">Typeof</h2>
</li>
</ul>
</li>
</ul>
</li>
<li>런타임에서 변수 유형을 평가할 수 있게 해줌</li>
</ul>
<h2 id="data-types">Data Types</h2>
<ol>
<li>Numbers: Important for calculations and code where you need to &quot;work with a number&quot;</li>
</ol>
<ul>
<li>JS에서는 정수도 유리수도 전부 number로 표현</li>
<li>2, -3, 22.94</li>
</ul>
<ol start="2">
<li>Strings(Text): Important for outputting results, gathering input</li>
</ol>
<ul>
<li>&#39;Hi&#39;, &quot;Hi&quot;, `Hi`</li>
<li>템플릿 리터럴: ` `안에 ${}을 넣게 되면 {}내의 표현식을 텍스트로 출력하게 된다.</li>
<li>백틱(`)을 이용하면 줄바꿈도 표현할 수 있다.</li>
<li><code>\n</code>을 사용하면 화면상에서 줄바꿈을 표현할 수 있다.</li>
</ul>
<ol start="3">
<li>Booleans: Important for conditional code and situations where you only have 2 options</li>
</ol>
<ul>
<li>true / false</li>
</ul>
<ol start="4">
<li>Objects: Important for grouped/related data, helps you with organizing data</li>
</ol>
<ul>
<li>{ name: &#39;Max&#39;, age: 31}</li>
<li>키-값 쌍을 가짐</li>
</ul>
<ol start="5">
<li>Arrays: Important for list data, unknown amounts of data</li>
</ol>
<ul>
<li>[1, 3, 5]</li>
<li>숫자와 텍스트를 한 배열에 가질 수도 있다.</li>
<li>특수한 object type</li>
</ul>
<ol start="6">
<li>Special Values<ol>
<li>undefined</li>
</ol>
<ul>
<li>Default value of uninitialized variables</li>
<li>초기화 되지 않은 변수의 기본값</li>
<li>아무것도 없음</li>
<li>undefined를 값으로서 할당할 수는 없다</li>
</ul>
<ol start="2">
<li>null</li>
</ol>
<ul>
<li>Never assumed by default</li>
<li>You can assign this is a value if you want ot &quot;reset&quot;/&quot;clear&quot; a variable</li>
<li>special object type</li>
</ul>
<ol start="3">
<li>NaN</li>
</ol>
<ul>
<li>Not a type(It&#39;s Number)</li>
<li>Technically, it&#39;s of type number and can therefore be used in calculations</li>
<li>It yields a new NaN and it&#39;s the result of invalid calculations(e.g. 3*&#39;hi&#39;)
<img src="https://velog.velcdn.com/images/su-mmer/post/71e964d7-5e92-43cb-a4b1-bb747bdac787/image.png" alt=""></li>
</ul>
</li>
</ol>
<h1 id="함수">함수</h1>
<ul>
<li>온디맨드 코드(&quot;Code on Demand&quot;)</li>
</ul>
<ol>
<li>Define Function<pre><code>function greetUser(name) {
 alert(&#39;Hi&#39; + name);
}</code></pre></li>
</ol>
<ul>
<li>인자(parameter)를 사용할 수 있고 값을 return 할 수 있다.</li>
<li>function 함수이름 (인자) {계산식}</li>
</ul>
<ol start="2">
<li>Call Function<pre><code>greetUser(&#39;Max&#39;);</code></pre></li>
</ol>
<ul>
<li><p>원할 때 인자를 넘겨줄 수 있다.</p>
</li>
<li><p>모든 함수는 이름이 같은 함수를 실행하더라도 서로 무관하게 각각 실행된다.</p>
</li>
<li><p>JS는 실행 전에 파일 전체를 읽어 사용된 함수를 전부 찾아낸다.</p>
</li>
<li><p>함수에 return값은 옵션이다.</p>
</li>
<li><p>함수에 인자는 옵션이다.</p>
</li>
<li><p>greetUser 함수 내에서 userName을 참조할 때 항상 로컬 섀도우 변수 참조</p>
</li>
<li><p>함수를 종료시키는 return</p>
</li>
<li><p>함수 직접 실행: 함수를 바로 실행시키고 싶을 때는 add()
함수 간접 실행: 바로 실행시키지 않고 미래의 어느 시점에 실행되길 원하면 add</p>
</li>
<li><p>섀도우 변수: 함수에서 선언된 지역 변수이면서 전역 변수로도 존재하는 변수(이름이 같으면)</p>
</li>
</ul>
<h1 id="자료형-변환">자료형 변환</h1>
<ul>
<li>parseInt()를 사용해서 정수형으로 변환</li>
<li>문자열 앞에 +기호를 사용하면 문자열을 숫자로 변환시켜줌(e.g. +userInput.value)</li>
<li>parseFloat()</li>
<li>toString() 숫자를 문자열로 변환</li>
<li>JS는 +만 문자열과 숫자를 결합시켜 문자열을 생성하고 다른 연산자들은 숫자로 작동한다.<pre><code>3 + &#39;3&#39;  # 33
3 - &#39;3&#39;  # 0
3 / &#39;3&#39;  # 1
3 * &#39;3&#39;  # 9</code></pre></li>
</ul>
<h1 id="배열">배열</h1>
<p>let logEngtry = []; //선언</p>
<h1 id="객체">객체</h1>
<p>let logEntry = {}; // 선언</p>
<ul>
<li>세미콜론으로 끝났다고 알려줌(옵션이지만 일반적으로 사용)</li>
<li>키-값 쌍은 쉼표로 구분</li>
<li>값은 콜론(:)으로 할당해줌</li>
</ul>
<h1 id="script-file-import">script file import</h1>
<p>스크립트가 길어지면 로드하고 실행하는데 시간이 오래걸리고 구분 분석해야할 HTMl 코드가 길어진다.
그래서 모든 코드가 구문 분석 될 때까지 기다렸다가 스크립트 로딩을 하게 되면 안 좋다.
구문 분석된 콘텐츠에 dependency하기 때문에 구분 분석 후에 실행하고자 하는 것인데 스크립트 실행은 하지 않더라도 미리 로딩하거나 서버에서 다운로드 하는 것이 좋다.
또한 로컬이 아닌 실제 웹 서버를 사용하게 되면 더 느려진다.
HTML 파일 전체가 구문 분석 된 후에 로딩을 시작하는 것이 아니라 최대한 빨리 스크립트를 로드하고 구문 전체가 분석된 후에 실행하도록 해야한다.</p>
<h2 id="해결방법">해결방법</h2>
<ol>
<li><p>스크립트 파일이 HTML에 의존할 경우
스크립트 파일을 head에 넣고 스크립트 속성으로 <code>defer</code> 키워드를 준다.
defer는 브라우저에 스크립트를 미리 다운로드 해놓고 HTMl 구문 분석이 완료된 경우에만 스크립트를 실행하도록 함.
스크립트 실행 순서가 보장된다.</p>
</li>
<li><p>스크립트 파일이 HTML에 의존하지 않을 경우
스크립트 파일을 head에 넣고 스크립트 속성으로 <code>async</code> 키워드를 준다.
defer와는 다르게 스크립트가 다운로드 되면 바로 실행된다. HTML 구문분석은 스크립트 파일이 실행되는 동안 일시정지한다.
가능한 한 빠르게 스크립트를 사용해야할 경우 async를 사용한다.
스크립트 실행 순서가 보장되지 않는다. 다운로드 되는 것부터 실행.</p>
</li>
</ol>
<p>defer, async 모두 다운로드할 파일이 있는 &lt;script&gt;에서만 작동한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[구름 먼데이 챌린지 2-4 + 고찰]]></title>
            <link>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-2-4</link>
            <guid>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-2-4</guid>
            <pubDate>Thu, 20 Oct 2022 06:25:09 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/su-mmer/post/fb107141-fc7d-434b-a3d8-e21cdefc8e17/image.png" alt=""></p>
<p><a href="https://level.goorm.io/l/challenge">구름 먼데이 챌린지 참여하기</a></p>
<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/45298724-19db-43eb-88da-8e8ef685360a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/b6ca5357-1dea-4dbb-968c-9ddacb815d66/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/b10b1509-36db-41b3-a2ef-8693753c556c/image.png" alt=""></p>
<h1 id="입력">입력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/659825b0-7158-4925-9383-6c875f17c14c/image.png" alt=""></p>
<h1 id="출력">출력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/6801b87c-6513-4ecb-8561-cd2b27c93080/image.png" alt=""></p>
<h1 id="예제">예제</h1>
<ul>
<li>입력1<pre><code>3 3
3 3
3 3
1 1</code></pre></li>
<li>출력1<pre><code>9</code></pre></li>
<li>입력2<pre><code>4 4
1 1
4 4
3 3
2 4</code></pre></li>
<li>출력2<pre><code>15</code></pre><h1 id="풀이">풀이</h1>
</li>
<li>2차원 배열 파악하기</li>
</ul>
<ol>
<li>[1][1]부터 [n][n]까지 정사각형을 분할한다.</li>
<li>나누어진 사각형 중 하나에 폭탄이 떨어진다.</li>
<li>폭탄은 십자가 모양으로 터지고 범위에 1이 증가한다.</li>
<li>모든 값의 합을 출력하라.</li>
</ol>
<h1 id="파이썬-코드">파이썬 코드</h1>
<ul>
<li>나는 if 문을 이용해서 십자가 모양으로 갈 수 있는지 확인하고 +1을 해주도록 구현했었다(dx, dy가 기억이 안났음)</li>
<li>deque()의 사용<ul>
<li>deque는 스택과 큐의 기능을 둘 다 가진다.</li>
<li>append(), appendleft(), pop(), popleft()</li>
<li>insert(), remove() 리스트처럼 중간 내용을 수정하거나 새 항목을 입력하고 삭제할 수 있다.<ul>
<li>reverse()</li>
<li>extend(), extendleft()</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-python"># -*- coding: utf-8 -*-
# UTF-8 encoding when using korean
import sys
input = sys.stdin.readline
from collections import deque

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

n, k = map(int, input().split())
square = [[0 for _ in range(n)] for _ in range(n)] # 2차원 배열 생성
q = deque()

# 좌표를 입력받아서 q에 좌표 추가
for _ in range(k):
    a, b = map(int, input().split())
    q.append([a-1], [b-1]) # 컴퓨터 배열은 0,0부터 시작이니까

while q :
    x, y = q.popleft() # 왼쪽에서 좌표 빼기(첫번째 좌표)
    square[x][y] += 1 # 해당 좌표에 +1

    # 십자가 모양 확인하면서 +1
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        # index가 out of range인지 확인하면서 +1
        if 0 &lt;= nx &lt; n and 0 &lt;= y &lt; n:
            square[nx][ny] += 1

# 2차원 배열 돌면서 모든 값 더하기
result = 0
for i in square:
    result += sum(i)

print(result)</code></pre>
<p>오... 때깔나..</p>
<h1 id="2주차-고찰">2주차 고찰</h1>
<p>생각보다 재밌다..! 나.. 코테 노잼인간.. 그치만 도장깨기 스탬프 찍기 이런거 좋아해서 일주일에 도장 2개씩 받아가니까 재밌다^,^</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[구름 먼데이 챌린지 2-3]]></title>
            <link>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-2-3</link>
            <guid>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-2-3</guid>
            <pubDate>Thu, 20 Oct 2022 05:54:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/su-mmer/post/fb107141-fc7d-434b-a3d8-e21cdefc8e17/image.png" alt=""></p>
<p><a href="https://level.goorm.io/l/challenge">구름 먼데이 챌린지 참여하기</a></p>
<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/5bf8edfc-c707-47f5-a299-dbf7862295ea/image.png" alt=""></p>
<h1 id="입력">입력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/b030cbca-c396-47ec-a0d8-8d5b696351cf/image.png" alt=""></p>
<h1 id="출력">출력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/fa28c0f6-4a92-4306-b211-062050070d5a/image.png" alt=""></p>
<h1 id="예제">예제</h1>
<ul>
<li>입력1<pre><code>5 1
goorm 110.40
goormee 111.50
goormy 109.50
oscar 100.00
henry 200.00</code></pre></li>
<li>출력1<pre><code>goorm 110.40</code></pre></li>
<li>입력2<pre><code>5 5
abcabc 120.00
abcabca 120.00
abcabcb 120.00
abcabcc 120.00
abcabcd 120.00</code></pre></li>
<li>출력2<pre><code>abcabcd 120.00</code></pre></li>
</ul>
<h1 id="풀이">풀이</h1>
<ol>
<li>이름을 기준으로 내림차순 정렬</li>
<li>이름이 같다면 작은 키부터 오름차순 정렬(키는 소수 2번째 자리 까지)</li>
<li>출석부를 완성하고 k번째 사람의 이름과 키를 출력</li>
</ol>
<h1 id="파이썬-코드">파이썬 코드</h1>
<ul>
<li>sorted 함수 활용하기</li>
<li>sorted 함수는 key값을 기준으로 오름차순 정렬(내림차순은 reverse() 활용)</li>
<li><code>sorted(att, key = lambda x : (x[0], x[1]))</code>를 이용해 첫번째 인자를 기준으로 먼저 정렬한 후 두번째 인자를 기준으로 정렬</li>
<li>처음에 swap 썼는데 풀이에서 lambda랑 sorted 사용했길래 코드를 고쳤다.<pre><code class="language-python"># -*- coding: utf-8 -*-
# UTF-8 encoding when using korean
import sys
input = sys.stdin.readline
</code></pre>
</li>
</ul>
<p>n, k = map(int, input().split())
att = []</p>
<p>for i in range(n):
    student = list(map(str, input().split()))
    att.append(student)</p>
<p>att = sorted(att, key = lambda x : (x[0], x[1]))</p>
<h1 id="attsort">att.sort()</h1>
<h1 id="for-i-in-range1-n">for i in range(1, n):</h1>
<h1 id="if-atti---10--atti0">if att[i - 1][0] == att[i][0]:</h1>
<h1 id="if-atti---11--atti1">if att[i - 1][1] &gt; att[i][1]:</h1>
<h1 id="swapatti---1-atti">swap(att[i - 1], att[i])</h1>
<p>print(att[k - 1][0], att[k - 1][1])
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[구름 먼데이 챌린지 2-2]]></title>
            <link>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-2-2</link>
            <guid>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-2-2</guid>
            <pubDate>Thu, 20 Oct 2022 05:24:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/su-mmer/post/fb107141-fc7d-434b-a3d8-e21cdefc8e17/image.png" alt=""></p>
<p><a href="https://level.goorm.io/l/challenge">구름 먼데이 챌린지 참여하기</a></p>
<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/9c08d90d-6a3e-46a5-912b-3fc496fc3d8b/image.png" alt=""></p>
<h1 id="입력">입력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/a3d86567-252d-4e5b-863f-16eac20b5a37/image.png" alt=""></p>
<h1 id="출력">출력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/5cb659b2-b8c2-483d-8208-06d6c88ea05a/image.png" alt=""></p>
<h1 id="예제">예제</h1>
<ul>
<li>입력1<pre><code>5
goorm</code></pre></li>
<li>출력1<pre><code>4</code></pre></li>
<li>입력2<pre><code>9
algorithm</code></pre></li>
<li>출력2<pre><code>9</code></pre></li>
</ul>
<h1 id="풀이">풀이</h1>
<ol>
<li>연속된 같은 문자끼리 하나의 집합이 된다.</li>
<li>집합의 갯수를 출력한다.</li>
</ol>
<p>막대를 반으로 나눈다고 생각했을 때 나누는 횟수는 1이고 막대는 2개로 나눠진다.
막대를 n개로 나누고 싶다면 n-1 횟수로 나누게 된다.
따라서 나뉜 횟수를 구하고 +1을 해주면 집합의 갯수가 된다.</p>
<h1 id="파이썬-코드">파이썬 코드</h1>
<pre><code class="language-python"># -*- coding: utf-8 -*-
# UTF-8 encoding when using korean
import sys
input = sys.stdin.readline

n = int(input())
string = input()
cnt = 0

for i in range(1, n):
    if string[i-1] == string[i]:
        continue
    else:
        cnt += 1

print(cnt + 1)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[구름 먼데이 챌린지 2-1]]></title>
            <link>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-2-1</link>
            <guid>https://velog.io/@su-mmer/%EA%B5%AC%EB%A6%84-%EB%A8%BC%EB%8D%B0%EC%9D%B4-%EC%B1%8C%EB%A6%B0%EC%A7%80-2-1</guid>
            <pubDate>Thu, 20 Oct 2022 05:14:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/su-mmer/post/fb107141-fc7d-434b-a3d8-e21cdefc8e17/image.png" alt=""></p>
<p><a href="https://level.goorm.io/l/challenge">구름 먼데이 챌린지 참여하기</a></p>
<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/f31137f3-3e22-452d-ae86-219a6002a406/image.png" alt=""></p>
<h1 id="입력">입력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/dd153e5c-847c-4103-9c80-18368767357b/image.png" alt=""></p>
<h1 id="출력">출력</h1>
<p><img src="https://velog.velcdn.com/images/su-mmer/post/14ba6411-528e-4a49-bb66-1ea64c460e92/image.png" alt=""></p>
<h1 id="예시">예시</h1>
<ul>
<li>입력1<pre><code>2
3
1 3 7
1
5 </code></pre></li>
<li>출력1<pre><code>1/3
1/1</code></pre></li>
<li>입력2<pre><code>2
5
1 2 3 4 5
4
1 10 10 10</code></pre></li>
<li>출력2<pre><code>3/5
3/4</code></pre><h1 id="풀이">풀이</h1>
</li>
</ul>
<ol>
<li>테스트 케이스 단위로 요구하는 연산을 수행한다.</li>
<li>주어진 점수들로 평균을 구하고, 평균 이상인 사람의 수를 구한다.</li>
<li>합격자 수/응시자 수의 형태에 주의하여 출력한다(띄어쓰기 없이).</li>
</ol>
<h1 id="파이썬-코드">파이썬 코드</h1>
<pre><code class="language-python"># -*- coding: utf-8 -*-
# UTF-8 encoding when using korean
import sys
input = sys.stdin.readline

test = int(input())

for _ in range(test):
    cnt = 0
    n = int(input())
    record = list(map(int, input().split()))

    avg = sum(record)/n

    for i in record:
        if i &gt;= avg:
            cnt += 1

    print(cnt, &quot;/&quot;, n, sep=&quot;&quot;)
    # print(&quot;%d/%d&quot;%(cnt, n))</code></pre>
]]></description>
        </item>
    </channel>
</rss>