<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>cindybae.log</title>
        <link>https://velog.io/</link>
        <description>꾸준히 공부하는 개발자가 되고 싶습니다✋</description>
        <lastBuildDate>Wed, 19 Jun 2024 04:58:13 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. cindybae.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/cindy0817-web" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[코드리뷰 방법]]></title>
            <link>https://velog.io/@cindy0817-web/%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@cindy0817-web/%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Wed, 19 Jun 2024 04:58:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>코드리뷰는 지적 하기 위함이 아닌 “코드 품질을 개선”하기 위한 행위이다!!</p>
</blockquote>
<h3 id="코드리뷰-방법">코드리뷰 방법</h3>
<ul>
<li>원칙에 기반하여 피드백하도록 노력하기</li>
<li>개선점이 보이면 이유와 방향 제시하기</li>
<li>좋은 아이디어는 꼭 칭찬해주기!</li>
<li>필수 반영사항이 아닌 코멘트일 경우 <code>Nit</code> (사소한것) 로 표기</li>
<li>한꺼번에 많은 코멘트로 공격x<ul>
<li>하이레벨(기본 기능 동작 여부, 전체 코드의 설계방식 개선의견, 복잡한 함수의 분리)
  → 로우레벨(UI, 변수명 변경, 주석필요여부, 컨벤션 등등)</li>
<li>하이레벨 코멘트 먼저 등록 후 로우래벨 코멘트 등록하는 순으로 진행</li>
<li>핵심 부분의 설계가 잘못되었다면, 나버지 코드를 보기 전에 즉시 공유!</li>
</ul>
</li>
</ul>
<h3 id="승인-시점">승인 시점</h3>
<ul>
<li>사소한 이슈만 남았다면 승인하기 (master가 아닌 브랜치일 경우)<ul>
<li>변수명 변경, 오타</li>
<li>선택적 제안 코멘트</li>
</ul>
</li>
<li>hofix 라벨이 붙었을경우에는 바로 승인하되, 테스트 및 코드 확인은 꼭하기!<ul>
<li>기존 코드에 영향을 주는 코드는 어떤 경우에도 허용되면 안된다고 생각</li>
</ul>
</li>
</ul>
<p><strong>리뷰하기 좋은 pr 디스크립션 작성하기</strong></p>
<ul>
<li>작업 상세 내용과, 코어 파일 경로 명시</li>
<li>필요하다면 코멘트로 대체해도 좋음</li>
</ul>
<p><strong>코드리뷰 속도</strong></p>
<ul>
<li>가능한 리뷰 요청을 받자마자 한다.</li>
<li>업무일 기준 하루를 넘지 않는다.</li>
<li>시간이 오래 걸릴 경우 작성자에게 공유한다</li>
<li>추후 반영할 사항은 위키 추후 개선할 작업 리스트에 작성해두기</li>
</ul>
<hr>
<p><strong>용어정리</strong></p>
<ul>
<li>CL : changelist</li>
<li>LGTM : Looks Good To Me</li>
<li>Nit: nitpick,  사소한것</li>
</ul>
<p><strong>참고</strong></p>
<ul>
<li><a href="https://soojin.ro/review/pushback">https://soojin.ro/review/pushback</a></li>
<li><a href="https://www.slideshare.net/slideshow/2018-01code-review-95601233/95601233">https://www.slideshare.net/slideshow/2018-01code-review-95601233/95601233</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Login with Redux Pattern]]></title>
            <link>https://velog.io/@cindy0817-web/Login-with-Redux-Pattern</link>
            <guid>https://velog.io/@cindy0817-web/Login-with-Redux-Pattern</guid>
            <pubDate>Sun, 21 May 2023 11:26:22 GMT</pubDate>
            <description><![CDATA[<h3 id="리덕스-패턴이란">리덕스 패턴이란</h3>
<ul>
<li>MVC 패턴을 대체하기 위해서 페이스북이 사용한 Flux 패턴을 살짝 바꾼 것</li>
</ul>
<aside>
☝ 순서

<blockquote>
<p>View → Action → Dispatcher → Store (Middleware → Reducer) → View</p>
</blockquote>
</aside>

<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/adc87dae-1af3-4aa6-a50a-b20ce5e013ac/image.png" alt=""></p>
<ul>
<li>한방향으로 흐르기 때문에 데이터의 흐름을 예측하기 쉬움 → 관리가 편함</li>
<li>데이터가 불변하여 예측하기 쉽고, 이전 상태로 되돌리기 쉬움</li>
</ul>
<hr>
<h2 id="로그인-예시">로그인 예시</h2>
<ul>
<li>로그인 버튼 클릭</li>
<li>View : 로그인 form이 있는 화면</li>
<li>Action : 폼에 로그인 Action 연결<ul>
<li>Dispatcher을 통해서 데이터가 Action에서 Store로 넘어감</li>
</ul>
</li>
<li>Store<ul>
<li>Middleware : Reducer에 가기 전 Action을 조작하고 처리된 데이터를 View로 넘겨줌</li>
<li>Reducer : 데이터를 처리</li>
</ul>
</li>
</ul>
<h3 id="login-page-ui-만들기">Login page ui 만들기</h3>
<pre><code>&lt;div
      style={{
        display: &quot;flex&quot;,
        justifyContent: &quot;center&quot;,
        alignItems: &quot;center&quot;,
        width: &quot;100%&quot;,
        height: &quot;100vh&quot;,
      }}
    &gt;
      &lt;form
        style={{
          display: &quot;flex&quot;,
          flexDirection: &quot;column&quot;,
        }}
        **onSubmit**={onSubmitHandler}
      &gt;
        &lt;label&gt;Email&lt;/label&gt;
        &lt;input type=&quot;email&quot; value={Email} **onChange**={**onEmailHandler**} /&gt;
        &lt;label&gt;Password&lt;/label&gt;
        &lt;input type=&quot;password&quot; value={Password} onChange={**onPasswordHandler**} /&gt;

        &lt;br /&gt;
        &lt;button&gt;Login&lt;/button&gt;
      &lt;/form&gt;
    &lt;/div&gt;</code></pre><ul>
<li>이메일과 페스워드 인풋을 폼 태그로 감싸주기</li>
</ul>
<h3 id="이메일-패스워드-변경하면-state값-세팅">이메일 패스워드 변경하면 state값 세팅</h3>
<pre><code class="language-jsx">function LoginPage() {

  const [Email, setEmail] = useState(&quot;&quot;);
  const [Password, setPassword] = useState(&quot;&quot;);

  const onEmailHandler = (event) =&gt; {
    setEmail(event.currentTarget.value);
  };

  const onPasswordHandler = (event) =&gt; {
    setPassword(event.currentTarget.value);
  };

  const onSubmitHandler = (event) =&gt; {
    event.preventDefault();

  };</code></pre>
<ul>
<li>사용자가 이메일, 패스워드 변경하면 <code>onEmailHandelr</code> <code>onPasswordHandler</code> 가 실행되어서
이메일과 패스워드 변경된 값으로 세팅</li>
<li><code>event.preventDefault()</code> : 이벤트의 기본동작을 막아줌 (페이지 리프레시)</li>
</ul>
<h3 id="서버에-보낼-값-세팅">서버에 보낼 값 세팅</h3>
<pre><code class="language-jsx">let body = {
      email: Email,
      password: Password,
    };</code></pre>
<h3 id="리덕스-패턴을-사용하는-컴포넌트-만들기">리덕스 패턴을 사용하는 컴포넌트 만들기</h3>
<aside>
☝ react-redux 다운로드

</aside>

<pre><code class="language-jsx">npm install redux react-redux</code></pre>
<p><code>LoginPage.js</code></p>
<pre><code class="language-jsx">function LoginPage() {
  const dispatch = useDispatch();
  const navigate = useNavigate();

  const onSubmitHandler = (event) =&gt; {
    event.preventDefault();

    let body = {
      email: Email,
      password: Password,
    };

    dispatch(loginUser(body)).then((response) =&gt; {
      if (response.payload.loginSuccess) {
        // props.history.push(&quot;/&quot;);
        navigate(&quot;/&quot;);
      } else {
        alert(response.payload.message);
      }
    });
  };</code></pre>
<h3 id="login-action-만들기">login Action 만들기</h3>
<p><code>user_action.js</code></p>
<pre><code class="language-jsx">import axios from &quot;axios&quot;;
import { LOGIN_USER } from &quot;./types&quot;;
export function loginUser(dataToSubmit) {
  const request = axios
    // 백엔드 서버 url에 dataToSubmit 데이터 보내주기
    .post(&quot;/api/users/login&quot;, dataToSubmit)
    .then((response) =&gt; response.data);

  return {
    // redux로 옮겨주기
    type: LOGIN_USER,
    payload: request,
  };
}</code></pre>
<ul>
<li>then 메소드의 역할<ul>
<li><strong><code>then()</code></strong> 메서드는 <code>Promise</code> 를 리턴하고 두 개의 콜백 함수를 인수로 받음</li>
</ul>
</li>
</ul>
<blockquote>
<p>login Action 순서</p>
</blockquote>
<ul>
<li>LoginPage로부터 데이터(email, password)를 받아옴(dataToSubmit)</li>
<li>axios를 사용하여서 백엔드 서버 url(/api/users/login)에 데이터(dataToSubmit)보내주기<ul>
<li>백엔드에서 로그인 과정 거쳐서 response를 받는 과정</li>
</ul>
</li>
</ul>
<p><code>server/models/User.js</code></p>
<pre><code class="language-jsx">        userSchema.methods.comparePassword = function (plainPassword, cb) {
          //plainPassword 1234567    암호회된 비밀번호 $2b$10$l492vQ0M4s9YUBfwYkkaZOgWHExahjWC
          bcrypt.compare(plainPassword, this.password, function (err, isMatch) {
            // 사용자가 입력한 비번(plainPassword)와 db에 저장된 비번과 비교
            // 틀리고, 에러가 나면 콜백함수에 err를 반환하고,
            // 같다면 콜백함수에 null값과 true값이 있는 isMatch를 반환
            if (err) return cb(err);
            cb(null, isMatch);
          });
        };

        userSchema.methods.generateToken = function (cb) {
          var user = this;
          // console.log(&#39;user._id&#39;, user._id)

          // jsonwebtoken을 이용해서 token을 생성하기
          var token = jwt.sign(user._id.toHexString(), &quot;secretToken&quot;);
          // user._id + &#39;secretToken&#39; = token
          // -&gt;
          // &#39;secretToken&#39; -&gt; user._id

          user.token = token;
          user.save(function (err, user) {
            if (err) return cb(err);
            cb(null, user);
          });
        };</code></pre>
<p><code>server/index.js</code></p>
<pre><code class="language-jsx">        app.post(&quot;/api/users/login&quot;, (req, res) =&gt; {
          // 요청된 이메일틀 데이터베이스에서 있는지 찾아보기
          // findOne() : 요소를 찾는 몽고DB 메소드
          User.findOne({ email: req.body.email }, (err, user) =&gt; {
            // 이메일에 해당하는 유저가 없으면
            if (!user) {
              return res.json({
                loginSuccess: false,
                message: &quot;제공된 이메일에 해당하는 유저가 없습니다.&quot;,
              });
            }
            // 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는 비밀번호인지 확인
            user.comparePassword(req.body.password, (err, isMatch) =&gt; {
              // isMatch가 없으면 비번이 틀림
              if (!isMatch)
                return res.json({
                  loginSuccess: false,
                  message: &quot;비밀번호가 틀렸습니다.&quot;,
                });
              // 비밀번호까지 맞다면 토큰 생성
              user.generateToken((err, user) =&gt; {
                // status(400)-&gt;에러
                if (err) return res.status(400).send(err);

                // 토큰을 저장(쿠키, 로컬스토리지)
                // status(200)-&gt;성공
                res
                  .cookie(&quot;x_auth&quot;, user.token)
                  .status(200)
                  .json({ loginSuccess: true, userId: user._id });
              });
            });
          });
        });</code></pre>
<ul>
<li><p>이메일에 해당하는 유저가 없으면 loginSuccess가 false인 res(.json)를 리턴</p>
</li>
<li><p>비밀번호가 틀리면 loginSuccess가 false인 res(.json)를 리턴</p>
</li>
<li><p>비밀번호가 맞으면 토큰을 생성하고,  loginSuccess가 true이고, userID가 있는</p>
<pre><code>  res(.json)를 리턴</code></pre></li>
<li><p>백엔드에서 받은 response.data를 request에 저장</p>
</li>
<li><p>types 파일에서 받은 type과 백엔드 서버에서 받은 request를 payload로 리턴</p>
</li>
<li><p><code>_actions/types.js</code></p>
</li>
</ul>
<pre><code class="language-jsx">        export const LOGIN_USER = &quot;login_user&quot;;</code></pre>
<ul>
<li>폼을 submit하면 dispatch 메소드(Dispatcher) 실행<ul>
<li>LoginPage 컴포넌트의 onSubmitHandler 안에 있는 dispatch가 실행되는것!</li>
<li><code>dispatch(loginUser(body))</code><ul>
<li>Dispatcher을 통해서 데이터가 login Action에서 Store로 넘어감</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="login-reducer-만들기">login reducer 만들기</h3>
<p><code>_reducers/user_reducer.js</code></p>
<pre><code class="language-jsx">import { LOGIN_USER } from &quot;../_actions/types&quot;;

export default function f(state = {}, action) {
  switch (action.type) {
    case LOGIN_USER:
      return { ...state, loginSuccess: action.payload };

    default:
      return state;
  }
}</code></pre>
<ul>
<li>Reducer은 Action별로 state를 어떻게 바꿀지 결정함!</li>
<li>(중요) 반드시 <strong>새로운 객체를 반환</strong> 해야됨!!!</li>
<li><code>{…state}</code> ⇒ 기존 state(비어있음)를 복사하는것 
⇒ 새로운 객체를 만들어야 현재, 이전 상태가 구분되기에 이전 상태로 쉽게 되돌릴 수 있음</li>
<li>state만 바꾸면 알아서 View도 바뀜</li>
<li>LOGIN_USER Action이 발생하면 loginSuccess에는 서버로부터 받은 
유저 정보(<code>action.payload</code>)를 넣어줌</li>
</ul>
<p><code>_reducers/index.js</code></p>
<pre><code>import { combineReducers } from &quot;redux&quot;;
import user from &quot;./user_reducer&quot;;

// reducer가 나눠져 있는데 combineReducer을 이용하여
// root reducer에서 하나로 합침

const rootReducer = combineReducers({
  user,
});

export default rootReducer;</code></pre><ul>
<li>Reducer는 여러 개를 사용할 수 있기 때문에 
redux 패키지로부터 <code>combineReducers</code> 함수를 불러워서 합쳐주기</li>
<li>위에서 만든 reducer을 user로 가져오기</li>
</ul>
<h3 id="store">Store</h3>
<aside>
☝ store에서 제공하는 dispatch 메소드로 Action을 Store로 넘김
Store에서 View로는 props를 통해 데이터가 넘어감

</aside>

<h3 id="다시-view">다시 View</h3>
<pre><code class="language-jsx">dispatch(loginUser(body)).then((response) =&gt; {
      if (response.payload.loginSuccess) {
        // props.history.push(&quot;/&quot;);
        navigate(&quot;/&quot;);
      } else {
        alert(response.payload.message);
      }
    });</code></pre>
<ul>
<li>dispatch가 끝났으면 받아온 response값을 활용하여서 로그인에 성공하면 홈페이지(/)로 이동</li>
<li>로그인에 성공하지 못하면 json의 에러 메세지를 alert 해주기</li>
</ul>
<aside>
⚠️ LoginPage 함수가 props를 못받아오는 이슈 발생 해결방법

</aside>

<p><code>props.history.push(&quot;/&quot;);</code></p>
<blockquote>
<p>react-router-dom v6부터 <strong>useHistory</strong> 에서 <strong>useNavigate</strong>로 바뀜</p>
</blockquote>
<ol>
<li>useNavigate import</li>
</ol>
<pre><code class="language-jsx">import { useNavigate } from &quot;react-router-dom&quot;;</code></pre>
<ol>
<li>navigete로 이동</li>
</ol>
<pre><code class="language-jsx">const navigate = useNavigate();

dispatch(loginUser(body)).then((response) =&gt; {
      if (response.payload.loginSuccess) {
        // props.history.push(&quot;/&quot;);
        navigate(&quot;/&quot;);
      } else {
        alert(response.payload.message);
      }
    });</code></pre>
<p>참고</p>
<p><a href="https://www.zerocho.com/category/React/post/57b60e7fcfbef617003bf456">https://www.zerocho.com/category/React/post/57b60e7fcfbef617003bf456</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DFS/BFS]]></title>
            <link>https://velog.io/@cindy0817-web/DFSBFS</link>
            <guid>https://velog.io/@cindy0817-web/DFSBFS</guid>
            <pubDate>Thu, 27 Apr 2023 17:02:00 GMT</pubDate>
            <description><![CDATA[<p>그래프 알고리즘</p>
<ul>
<li>탐색 : 많은 양의 데이터 중 원하는 데이터를 찾는 과정</li>
</ul>
<blockquote>
<p> 스택 자료구조</p>
</blockquote>
<ul>
<li>LIFO</li>
</ul>
<ul>
<li>시간복잡도 : O(1)</li>
<li>list로 -&gt; append(), pop()으로 스택 구현 가능</li>
</ul>
<blockquote>
<p>큐 자료구조</p>
</blockquote>
<ul>
<li>FIFO<ul>
<li>deque()로 큐 구현 =&gt; append(), popleft() 사용 =&gt; 가장 왼쪽에 있는 것 꺼내기</li>
<li>deque를 사용하는 것이 시간복잡도가 더 효율적임!!</li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p>재귀함수</p>
</blockquote>
<ul>
<li>자기 자신을 다시 호출하는 함수</li>
<li>종료조건 반드시 명시하기 =&gt; if i==100: return</li>
</ul>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/f69ac076-4958-43cd-86af-5ce5de1dfbad/image.png" alt=""></p>
<blockquote>
<p>최대공약수 계산(유클리드 호제법)</p>
</blockquote>
<ul>
<li>A를 B로 나눈 나머지를 R
A와 B의 최대공약수는 B와 R의 최대공약수이다</li>
</ul>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/b048fdce-30c5-4a0d-8d07-7dfa7b4ca02f/image.png" alt=""></p>
<pre><code class="language-python">def gcd(a, b):
    if a%b == 0:
        return b
    else:
        return gcd(b, a%b)

def lcm(a, b):
    return (a*b) // gcd(a,b)

print(gcd(192, 162))
print(lcm(192, 162))</code></pre>
<ul>
<li>컴퓨터가 함수 연속적으로 호출 =&gt; 컴퓨터 메모리 내부의 스택 프레임에 쌓임 =&gt; 스택 라이브러리 대신 재귀함수 사용하는 경우 많음</li>
</ul>
<h1 id="dfs">DFS</h1>
<ul>
<li>깊이 우선탐색</li>
<li>스택자료구조(재귀함수) 이용</li>
</ul>
<ol>
<li>탐색 시작 노드를 스택에 삽입하고 방문처리</li>
<li>스택의 최상단 노드에 방문하지 않은 인접한 노드가 있으면 그 노드를 스택에 넣고 방문 처리. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼냄</li>
<li>2번 수행할 수 없을 때까지 반복</li>
</ol>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/73e18d3c-d9a7-4db6-b089-1eb0653a4c9e/image.gif" alt=""></p>
<p><a href="https://developer-mac.tistory.com/64">출처</a></p>
<pre><code class="language-python"># DFS 메서드
def dfs(graph, v, visited):
#     현재 노드 방문 처리
    visited[v] = True
    print(v, end=&#39; &#39;)

#     현재 노드와 연결된 다른 노드를 재귀적으로 방문
# 2 3 8
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

graph = [
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2, 6, 8],
    [1, 7],
]
# 0 1 0 0 0 0 0 0
visited = [False] * 9

dfs(graph, 1, visited)</code></pre>
<h1 id="bfs">BFS</h1>
<ul>
<li>너비 우선탐색</li>
<li>가까운 노드부터 우선적으로 탐색</li>
<li>큐 자료구조 이용</li>
</ul>
<ol>
<li>탐색 시작 노드를 큐에 삽입하고 방문처리</li>
<li>큐에서 노드를 꺼낸 후 해당 노드의 인접 노드 중에서 방문 하지 않은 노드를 모두 큐에 삽입하고 방문</li>
<li>2 수행못할때까지 반복</li>
</ol>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/da9e49a8-31d0-43c6-93fb-aaea1340150c/image.gif" alt="">
<a href="https://developer-mac.tistory.com/64">출처</a></p>
<pre><code class="language-python">
from collections import deque

# DFS 메서드
def bfs(graph, start, visited):

    queue = deque([start])

    # 현재 노드 방문처리
    visited[start] = True

#     큐가 빌때까지 반복
    while queue:
#         큐에서 하나의 원소를 뽑아 출력하기
#       1 =&gt; 2 3 8
        v = queue.popleft()
        print(v, end=&#39; &#39;)
#         아직 방문하지 않은 인접한 원소들을 큐에 삽입
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True


graph = [
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2, 6, 8],
    [1, 7],
]
# 0 1 0 0 0 0 0 0
visited = [False] * 9

bfs(graph, 1, visited)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트 lv0 파이썬]삼각형의 완성조건(2)]]></title>
            <link>https://velog.io/@cindy0817-web/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-lv0-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%82%BC%EA%B0%81%ED%98%95%EC%9D%98-%EC%99%84%EC%84%B1%EC%A1%B0%EA%B1%B42</link>
            <guid>https://velog.io/@cindy0817-web/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-lv0-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%82%BC%EA%B0%81%ED%98%95%EC%9D%98-%EC%99%84%EC%84%B1%EC%A1%B0%EA%B1%B42</guid>
            <pubDate>Sat, 22 Apr 2023 07:53:20 GMT</pubDate>
            <description><![CDATA[<p>기존에 알고 있는 변이 a, b라고 하자.(a&gt;b)</p>
<p>이때, 새로 입력 받는 c가 a보다 클 수도 있고 같을 수도 있고 작을 수도 있다.</p>
<h3 id="문제설명">문제설명</h3>
<p>선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.</p>
<p>가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="제한사항">제한사항</h3>
<ul>
<li>sides의 원소는 자연수입니다.</li>
<li>sides의 길이는 2입니다.</li>
<li>1 ≤ sides의 원소 ≤ 1,000</li>
</ul>
<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/da397e18-b581-4bec-9227-5e5a9a5c4d82/image.png" alt=""></p>
<h3 id="정답-및-풀이">정답 및 풀이</h3>
<p>i) c가 a보다 크면 대소관계는 c &gt; a &gt; b가 된다.</p>
<p>a + b &gt; c  이므로 a + b &gt; c &gt; a가 된다.</p>
<p>즉 이때 가능한 c의 갯수는 b - 1개</p>
<p>ii) c가 a보다 작으면 대소관계는 a &gt; b, a &gt; c 가 된다.</p>
<p>b + c &gt; a 이므로 b + c &gt; a &gt; c가 된다.</p>
<p>즉 이때 가능한 c의 갯수는 b - 1개</p>
<p>iii) c와 a가 같으면 c = a 한 가지 밖에 존재하지 않는다.</p>
<p>그러므로 다 합하면 (b - 1) + (b - 1) + 1 = 2 * b - 1 개가 된다.</p>
<p>이때 초기 조건에 따라 b는 a보다 작음</p>
<pre><code class="language-python">def solution(sides):
    return 2 * min(sides) - 1</code></pre>
<p><a href="https://tnsgh9603.tistory.com/137">출처</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[파이썬 코딩테스트 lv0] 숨어있는 숫자의 덧셈(2)]]></title>
            <link>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-lv0-%EC%88%A8%EC%96%B4%EC%9E%88%EB%8A%94-%EC%88%AB%EC%9E%90%EC%9D%98-%EB%8D%A7%EC%85%882</link>
            <guid>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-lv0-%EC%88%A8%EC%96%B4%EC%9E%88%EB%8A%94-%EC%88%AB%EC%9E%90%EC%9D%98-%EB%8D%A7%EC%85%882</guid>
            <pubDate>Tue, 18 Apr 2023 14:55:34 GMT</pubDate>
            <description><![CDATA[<h1 id="문제설명">문제설명</h1>
<p>문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.</p>
<h1 id="제안사항">제안사항</h1>
<p>1 ≤ my_string의 길이 ≤ 1,000
1 ≤ my_string 안의 자연수 ≤ 1000
연속된 수는 하나의 숫자로 간주합니다.
000123과 같이 0이 선행하는 경우는 없습니다.
문자열에 자연수가 없는 경우 0을 return 해주세요.</p>
<h1 id="입출력-예">입출력 예</h1>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/af9212e2-bfaf-437a-b459-cc79a36a9553/image.png" alt=""></p>
<h1 id="풀이">풀이</h1>
<h3 id="1-isdigit함수-활용하여-join하기">1. isdigit()함수 활용하여 join하기</h3>
<pre><code class="language-python">def solution(my_string):
    s = &#39;&#39;.join(s if s.isdigit() else &#39; &#39; for s in my_string )
    return sum(int(n) for n in s.split())</code></pre>
<ul>
<li>isdigit() =&gt; 숫자이면 1을 리턴 숫자가 아니면 0을 리턴</li>
<li>my_string 값 중 숫자가 아니면 공백형태로 나눠서 문자열 s에 저장</li>
<li>.split() =&gt; 엔터 혹은 띄어쓰기로 구분하여 리스트로 저장</li>
<li>s값을 띄어쓰기로 구분하여 리스트에 저장한 후, 각 값을 int로 변경하고 더한 값을 리턴</li>
</ul>
<h3 id="2-isalpha와-replac-활용하기">2. isalpha()와 replac() 활용하기</h3>
<pre><code class="language-python">def solution(my_string):
    for s in my_string:
        if(s.isalpha()):
#             알파벳이 있는 곳은 공백으로 구분시켜주기
            my_string = my_string.replace(s,&#39; &#39;)
    return sum (int(i) for i in my_string.split())</code></pre>
<ul>
<li><p>isalpha() =&gt; 알파벳이면 1리턴, 아니면 0리턴</p>
</li>
<li><p>문자열.replace(s, 구분자) =&gt; 문자열안의 s를 구분자로 구분하여 리턴</p>
</li>
<li><p>알파벳이 있는 곳은 공백으로 구분하여 my_string에 저장</p>
</li>
<li><p>my_string을 공백으로 구분하여 리스트에 저장하고, 값을 int로 계산하고 더한값을 리턴</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python 코딩테스트 lv 0] 진료순서 정하기]]></title>
            <link>https://velog.io/@cindy0817-web/python-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-lv-0-%EC%A7%84%EB%A3%8C%EC%88%9C%EC%84%9C-%EC%A0%95%ED%95%98%EA%B8%B0-1lgofves</link>
            <guid>https://velog.io/@cindy0817-web/python-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-lv-0-%EC%A7%84%EB%A3%8C%EC%88%9C%EC%84%9C-%EC%A0%95%ED%95%98%EA%B8%B0-1lgofves</guid>
            <pubDate>Tue, 18 Apr 2023 14:27:29 GMT</pubDate>
            <description><![CDATA[<h1 id="문제설명">문제설명</h1>
<p>외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.</p>
<h2 id="제한사항">제한사항</h2>
<ul>
<li>중복된 원소는 없습니다.</li>
<li>1 ≤ emergency의 길이 ≤ 10</li>
<li>1 ≤ emergency의 원소 ≤ 100</li>
</ul>
<h2 id="입출력-예">입출력 예</h2>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/71ccccd0-c069-4d14-be0d-e63f65b43b0b/image.png" alt=""></p>
<h2 id="풀이-1">풀이 1</h2>
<blockquote>
<p>내림차순 정렬한 배열을 만들고, 원래 배열과 비교하여 인덱스 값 찾고, answer에 넣어주기</p>
</blockquote>
<pre><code>def solution(emergency):
    answer = []
    e = sorted(emergency, reverse=True)

    for i in emergency:
        answer.append(e.index(i)+1)
    return answer</code></pre><p><code>list comprehension 사용</code></p>
<pre><code class="language-python">def solution(emergency):
    e = sorted(emergency, reverse=True)
    return [(e.index(i)+1) for i in emergency]</code></pre>
<h2 id="풀이2">풀이2</h2>
<blockquote>
<p>딕셔너리, enumerate 함수 사용</p>
</blockquote>
<pre><code class="language-python">def solution(emergency):
    answer = []
#     emergency 내림차순하기
#     i=&gt; 키값(인덱스)
#     e =&gt; 수 정렬된 배열
#     enumerate =&gt; key와 value 값 반환
    emer_ls = {e: i + 1 for i, e in enumerate(sorted(emergency, reverse=True))}

        # 원래 수가 들어있는 emergency 값 e를 순서가 담겨있는 딕셔너리 emer_ls의
    # 배열 값과 비교해서 인덱스(위치)값을 추출 해냄 
    for e in emergency:
        answer.append(emer_ls[e])
    return answer
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩테스트 파이썬으로 풀때 알아야하는 함수]]></title>
            <link>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BD%94%ED%85%8C-%ED%95%A8</link>
            <guid>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BD%94%ED%85%8C-%ED%95%A8</guid>
            <pubDate>Sun, 16 Apr 2023 09:47:35 GMT</pubDate>
            <description><![CDATA[<h1 id="numpy-함수">numpy 함수</h1>
<pre><code>import numpy as np
def solution(numbers):
    return np.mean(numbers)</code></pre><p><a href="https://codetorial.net/numpy/functions/index.html">참고</a></p>
<h1 id="del-함수">del 함수</h1>
<p> del 함수 - 리스트의 특정 요소 혹은 리스트 특정 범위를 삭제</p>
<blockquote>
<p>최댓값 만들기</p>
</blockquote>
<p> 문제설명 : numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.</p>
<pre><code class="language-python">def solution(numbers):
    m1 =max(numbers)
    index=0
    for i in numbers:
        if i == m1:
            del(numbers[index])
        index += 1
    m2 = max(numbers)
    answer = m1*m2
    return answer

 # 내림차순 정렬 후 첫번째, 두번째 값을 곱해주기
 def solution(numbers):
    numbers.sort(reverse=True)
    return numbers[0]*numbers[1]</code></pre>
<h1 id="list-총정리">list 총정리!</h1>
<ul>
<li><p>리스트 더하기, 곱하기 연산 가능
L = [1,2,3] * 3</p>
</li>
<li><p>인덱스, 슬라이싱 사용가능
L[3]
L[2:5]</p>
</li>
<li><p>List Comprehensions 방식으로 리스트를 만들 수 있음
L = [i*i for i in range(10)]
L = [i for i in L if i%3 == 0]</p>
</li>
<li><p>in, not in 사용가능
5 in L</p>
</li>
</ul>
<h3 id="추가-및-복사">추가 및 복사</h3>
<p> .append(a) : 맨 뒤에 a 추가
 .extend(a) : a 리스트합치기
 .insert(n,a) : n번째에 a 추가
 .copy() : 리스트 복사 =&gt; 리턴받아서 사용</p>
<h3 id="제거-함수">제거 함수</h3>
<p> .remove(n) : n 하나 제거
 .pop() : 마지막 제거 =&gt; 인자값이 있으면 특정 인덱스 값 삭제
 .clear() : 리스트값 모두 삭제(빈 리스트)
 del(L[2]) : 특정 인덱스 내용 삭제
 del(L) : 리스트 자체 삭제</p>
<h3 id="개수-길이-인덱스">개수, 길이, 인덱스</h3>
<p> .count(a) : a 값의 개수 확인
 len(a) : a 리스트의 길이 확인
 .index() : 해당 값의 인덱스값 찾기</p>
<h3 id="순서">순서</h3>
<p> =&gt; 매개변수는 iterable한 변수면 OK!
 a.reverse() : 리스트 a에 들어있는 값 역순으로 바꿔줌 (리턴x)
 reversed() :  기존 리스트의 역순을 갖는 배열 생성 =&gt; list(reversed(기존리스트)) =&gt; 리턴</p>
<h3 id="최대-최소">최대 최소</h3>
<p> max() : 최대값 출력
 min() : 최소값 출력
 list(range(2,101,2)) : 짝수만 갖는 데이터 만들기
 list(range(10,0,-1) : 10부터 1까지 역순의 데이터 만들기</p>
<h3 id="중복제거-하는-방법">중복제거 하는 방법</h3>
<blockquote>
<p>set(리스트)을 이용</p>
</blockquote>
<p> list(set(리스트))</p>
<ul>
<li>순서 바뀜</li>
<li><strong>집합 타입</strong>으로 변경</li>
</ul>
<blockquote>
<p>for문 이용</p>
</blockquote>
<ul>
<li>for문 돌리고, in 연산자 써서 중복제거</li>
</ul>
<blockquote>
<p>dictionary를 이용하여 중복제거</p>
</blockquote>
<ul>
<li>딕셔너리는 key 값이 중복 불가!</li>
<li>dict.fromkeys(iterable) =&gt; 인자로 들어온 iterable 데이터를 key 값으로 해서 딕셔너리 자료형을 만들어줌</li>
</ul>
<pre><code class="language-python"># 중복된 문자 제거한 문자열 리턴하는 문제
def solution(my_string):
    return &#39;&#39;.join(dict.fromkeys(my_string))</code></pre>
<h3 id="lambda를-활용한-map-filter">lambda를 활용한 map, filter</h3>
<p> map(람다식, 리스트나 튜플) =&gt; 반환 값은 map객체여서 list 혹은 tuple로 형 변환해야됨
 filter(함수, 리스트나 튜플) =&gt; filter는 json을 반환</p>
<pre><code class="language-python"> def solution(array:list, height:int)-&gt;int:
    answer = len(list(filter(lambda x:x&gt;height,array)))
    return answer</code></pre>
<h3 id="for-in-딕셔너리">for in 딕셔너리</h3>
<ul>
<li><p>키와 값 모두 출력하고 싶을때는 이렇게 써보자!</p>
<pre><code>for 키, 값 in 딕셔너리.items():
  반복할 코드</code></pre><blockquote>
<p>예시 =&gt; 옷가게 할인 받기</p>
</blockquote>
</li>
</ul>
<p>def solution(price):
    discount_rates = {500000: 0.8, 300000: 0.9, 100000: 0.95, 0: 1}
    for discount_price, discount_rate in discount_rates.items():
        if price &gt;= discount_price:
            return int(price * discount_rate)</p>
<h3 id="list-comprehension-문법-정리">List Comprehension 문법 정리</h3>
<ul>
<li><p>기본 구조 : 표현식 + for문
result = [표현식 for 변수 in 리스트]</p>
</li>
<li><p>표현식 + for문 + 조건문
result = [표현식 for 변수 in 리스트 조건문]</p>
</li>
<li><p>조건문 + for문
result = [조건문 for 변수 in 리스트]</p>
</li>
<li><p>중첩 for문
result = [조건문 for 변수1 in 리스트1 for 변수2 in 리스트2 ...]</p>
</li>
<li><p>중첩 List Comprehension</p>
</li>
</ul>
<h2 id="정렬">정렬</h2>
<ol>
<li>.sort() : 오름차순 정렬 </li>
</ol>
<ul>
<li>.sort(reverse = True) : 내림차순 정렬</li>
</ul>
<ol start="2">
<li>sorted() : 오름차순 출력 =&gt; 기존 리스트 데이터 변경x =&gt; 괄호 안에는 iterable 자료형 입력(문자열, 리스트 등)</li>
</ol>
<ul>
<li><p>sorted(정렬할 데이터)</p>
</li>
<li><p>sorted(정렬할 데이터, reverse 파라미터)</p>
</li>
<li><p>sorted(정렬할 데이터, key 파라미터)</p>
</li>
<li><p>sorted(정렬할 데이터, key 파라미터, reverse 파라미터)</p>
</li>
</ul>
<ol start="3">
<li>parameter<blockquote>
<p>reverse</p>
</blockquote>
</li>
</ol>
<p>sorted([리스트], reverse=True)</p>
<blockquote>
<p><strong>key</strong></p>
</blockquote>
<ul>
<li>정렬을 목적으로 하는 함수를 값으로 넣기</li>
<li>lambda 이용가능</li>
</ul>
<p><code>예시문제</code>
길이가 짧은것부터, 길이가 같으면 알파벳 순으로 정렬</p>
<pre><code class="language-python">data_list = [&#39;but&#39;,&#39;i&#39;,&#39;wont&#39;,&#39;hesitate&#39;,&#39;no&#39;,&#39;more&#39;,&#39;no&#39;,&#39;more&#39;,&#39;it&#39;,&#39;cannot&#39;,&#39;wait&#39;,&#39;im&#39;,&#39;yours&#39;]

#중복 제거
data_list = list(set(data_list))

data_list.sort()
print(data_list)

# 길이를 기준으로 정렬
# 콜론 뒤에 있는 것을 기준으로 앞의 리스트를 정렬
data_list.sort(key=lambda x : len(x))

print(data_list)
</code></pre>
<ul>
<li>두가지 이상 요소 순서대로 정렬할때는 <code>key = lambda x: (기준1, 기준2 , ...)</code> 방식로 사용</li>
</ul>
<h3 id="enumerate-함수">enumerate 함수</h3>
<ul>
<li>enumerate =&gt; <strong>순서</strong>와 <strong>리스트의 값</strong>을 전달하는 기능을 가집니다.</li>
<li>예제</li>
</ul>
<pre><code class="language-python">dict1 = {&#39;이름&#39;: &#39;한사람&#39;, &#39;나이&#39;: 33}
data = enumerate(dict1)
for i, key in data:
    print(i, &quot;:&quot;, key, dict1[key]

# 출력결과
# 0 : 이름 한사람
# 1 : 나이 33
</code></pre>
<h3 id="zip-함수">zip 함수</h3>
<p>파이썬 zip( ) 함수 : 길이가 같은 리스트 등의 요소를 묶어주는 함수</p>
<h1 id="문자열-함수">문자열 함수</h1>
<h3 id="슬라이싱-함수-">슬라이싱 함수 ::</h3>
<ul>
<li><p>문자열[시작인덱스 : 종료인덱스 : 증가할 수]</p>
</li>
<li><p>슬라이싱은 초과해도 에러가 나지 않는다!</p>
</li>
</ul>
<blockquote>
<p>문자열 뒤집기</p>
</blockquote>
<p>문자열을 하나씩, 반대로 잘라서 다시 입력시킨후 출력
&#39;aaa&#39;[::-1]</p>
<p><code>모음제거</code></p>
<ul>
<li>문제설명
영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.</li>
</ul>
<hr>
<h3 id="문자치환함수--replace">문자치환함수 =&gt; replace</h3>
<p>String.replace(찾는 문자, 바꿀문자, 바꿀 문자 개수)</p>
<pre><code class="language-python">def solution(my_string):
    answer = &#39;&#39;
    remove_string = (&#39;a,e,i,o,u&#39;)
    for i in remove_string:
        my_string = my_string.replace(i,&#39;&#39;)

    return my_string</code></pre>
<h3 id="join-함수">join 함수</h3>
<p>&#39;구분자&#39;.join(리스트)
리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸어 반환하는 함수
&#39; &#39;join(값) : 값을 공백으로 구분하여 string으로 반환</p>
<pre><code class="language-python"># join 함수 사용하기
def solution(my_string):
    return &quot;&quot;.join([i for i in my_string if not(i in &quot;aeiou&quot;)])</code></pre>
<h3 id="count">count()</h3>
<p>문자열.count(a) =&gt; 문자열에 a가 들어있는지 세는 함수</p>
<h3 id="isdigit">isdigit()</h3>
<ul>
<li>문자열이 숫자로 이루어졌는지 판별하는 함수
문자열.isdigit()
=&gt; true, false 반환</li>
<li>알파벳과 숫자가 섞여있는 문자열에서 숫자를 찾아서 더해주는 코드<pre><code class="language-python">def solution(my_string):
  return sum(int(i) for i in my_string if i.isdigit())</code></pre>
짱 쉽쥬?</li>
</ul>
<h3 id="python-array-사용법">Python Array[::] 사용법</h3>
<blockquote>
<p>arr[::], arr[1:2:3], arr[::-1] 등으로 배열의 index에 접근하는 방법을 Extended Slices라고 함</p>
</blockquote>
<ul>
<li><p>arr[A:B:C]의 의미는, index A 부터 index B 까지 C의 간격으로 배열을 만들라는 뜻</p>
</li>
<li><p>만약 A가 None 이라면, 처음부터 라는 뜻이고
B가 None 이라면, 할 수 있는 데까지 (C가 양수라면 마지막 index까지, C가 음수라면 첫 index까지가 되겠습니다.)라는 뜻입니다.
마지막으로 C가 None 이라면 한 칸 간격</p>
</li>
</ul>
<h3 id="대문자-소문자">대문자, 소문자</h3>
<ol>
<li><p>문자열 대문자로 변경하는 함수 (string.upper())</p>
</li>
<li><p>문자열 소문자로 변경하는 함수 (string.lower())</p>
</li>
<li><p>문자가 대문자인지 확인하는 함수 (string.isupper())
=&gt; true, false 반환</p>
</li>
<li><p>문자가 소문자인지 확인하는 함수 (string.islower())
=&gt; true, false 반환</p>
</li>
</ol>
<h3 id="swapcas">swapcas()</h3>
<p>string.swapcase() : 대소문자 상호 전환.</p>
<h3 id="아스키코드-문자열">아스키코드, 문자열</h3>
<ul>
<li>ord() =&gt; 문자열에서 아스키코드로 변환</li>
<li>chr() =&gt; 아스키코드에서 문자열로 변환<pre><code>ord(&#39;a`) # 94
chr(64) # a</code></pre></li>
</ul>
<h3 id="find-함수">find 함수</h3>
<p>string.find(찾을 문자, 시작 Index, 끝 Index)</p>
<p>찾는 문자가 존재 한다면 해당 위치의 index를 반환해주고
찾는 문자가 존재 하지 않는다면 -1 을 반환</p>
<h3 id="split함수">split함수</h3>
<blockquote>
<p>string.split(구분자)</p>
</blockquote>
<ul>
<li>split함수는 list를 리턴한다.</li>
</ul>
<h3 id="int-함수">int 함수</h3>
<ul>
<li>int() =&gt; 매개변수값을 정수로 변환</li>
<li>int(x, radix)는 radix 진수로 표현된 문자열 x를 10진수로 변환하여 리턴한다. 예를 들어 2진수로 표현된 &quot;11&quot;의 10진수 값은 다음과 같이 구할수 있다.</li>
</ul>
<pre><code>int(&#39;11&#39;, 2) # =&gt; 2진수 11을 10진수로 변환해라
# 결과3</code></pre><p>16진수로 표현된 &quot;1A&quot;의 10진수 값은 다음과 같이 구할수 있다.</p>
<pre><code>int(&#39;1A&#39;, 16)
# 결과 : 26</code></pre><h3 id="bin-함수">bin 함수</h3>
<blockquote>
<p>bin(number)</p>
</blockquote>
<ul>
<li>전달받은 integer 혹은 long integer 자료형의 값을 이진수(binary) 문자열로 돌려준다. </li>
<li>앞에 &#39;0b&#39;가 붙음 =&gt; 접두어 빼고 싶으면 format 함수 사용하기 👇</li>
</ul>
<h3 id="format-함수">format 함수</h3>
<p>(2진수, 8진수, 16진수) =&gt; 접두어 빼고 나옴
b = format(value, &#39;b&#39;)
o = format(value, &#39;o&#39;)
h = format(value, &#39;x&#39;)</p>
<h3 id="eval-함수">eval 함수</h3>
<ul>
<li>매개변수로 받은 expression (=식)을 문자열로 받아서, 실행하는 함수</li>
</ul>
<h3 id="startswith--endswith">startswith &amp; endswith</h3>
<p>파이썬에서 문자열로 이루어진 리스트, 혹은 딕셔너리에서 특정 문자가 포함된 항목을 찾을 때 활용</p>
<pre><code class="language-python">str = &#39;final exam&#39;

# startswith(특정 문자)
result = str.startswith(&#39;final&#39;)

str = &#39;final exam&#39;

# endswith(특정 문자)
result = str.endswith(&#39;final&#39;)
</code></pre>
<h1 id="deque">deque</h1>
<blockquote>
<p>List 보다 deque의 속도가 훨씬 빠름</p>
</blockquote>
<ul>
<li>import 해야됨<pre><code>from collections import deque
a = deque()</code></pre></li>
</ul>
<blockquote>
<p>deque 함수</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/1189e500-04b4-41ce-879a-ef799aefd8fd/image.png" alt=""></p>
<ul>
<li>q.rotate() =&gt; 음수는 왼쪽 회전, 양수는 오른쪽 회전</li>
</ul>
<h1 id="math-함수">math 함수</h1>
<blockquote>
<p>import math</p>
</blockquote>
<h3 id="mathpowx-y">math.pow(x, y)</h3>
<p>x의 y제곱</p>
<h3 id="mathsqrtx">math.sqrt(x)</h3>
<p>x의 제곱근</p>
<h3 id="mathproditerable--start1">math.prod(iterable, *, start=1)</h3>
<p>입력 이터러블(iterable)에 있는 모든 요소의 곱을 계산. 곱의 기본 start 값은 1.</p>
<h3 id="mathfactorial">math.factorial()</h3>
<ul>
<li>math.facorial(x)
x의 팩토리얼 값을 return =&gt; x는 양의 정수!</li>
</ul>
<h3 id="gcdab">gcd(a,b)</h3>
<ul>
<li>a와 b의 최소공약수를 구해주는 함수</li>
<li>from math import gcd =&gt; 바로 gcd 사용 가능</li>
</ul>
<h3 id="lcmab">lcm(a,b)</h3>
<ul>
<li>최대공배수 구해주는 함수</li>
</ul>
<h2 id="비트-연산자">비트 연산자</h2>
<p><code>&lt;&lt;</code>
정수를 2배로 곱하기
<code>&gt;&gt;</code>
정수를 2배로 나눠줌</p>
<ul>
<li>예제<pre><code class="language-python">print(n&lt;&lt;1)  #10을 2배 한 값인 20 이 출력된다.
print(n&gt;&gt;1)  #10을 반으로 나눈 값인 5 가 출력된다.
print(n&lt;&lt;2)  #10을 4배 한 값인 40 이 출력된다.
print(n&gt;&gt;2)  #10을 반으로 나눈 후 다시 반으로 나눈 값인 2 가 출력된다.</code></pre>
</li>
</ul>
<h3 id="수학-공식">수학 공식</h3>
<blockquote>
<p>서로 다른 n개 중 m개를 뽑는 경우의 수 공식</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/36543703-6606-4a87-b5a6-9c96cff7f34b/image.png" alt=""></p>
<h1 id="set함수">set함수</h1>
<ul>
<li>set() =&gt; 집합 자료형 {}</li>
<li>괄호 안에 리스트 혹은 문자열 입력해서 만들 수 있음</li>
</ul>
<blockquote>
<p>set의 특징</p>
</blockquote>
<ul>
<li>중복 허용x</li>
<li>순서x</li>
</ul>
<h2 id="교집합">교집합</h2>
<pre><code>s1 = set([1,2,3,4,5,6])
s2 = set([4,5,6,7,8,9])
s3 = s1 &amp; s2
print(s3)    #result : {4,5,6}</code></pre><h2 id="합집합">합집합</h2>
<pre><code>s3 = s1 | s2
print(s3)    #result : {1, 2, 3, 4, 5, 6, 7, 8, 9}</code></pre><h2 id="차집합">차집합</h2>
<pre><code>s3 = s1 - s2
print(s3)    #result : {1, 2, 3}

s3 = s2 - s1
print(s3)    #result : {8, 9, 7}</code></pre><h3 id="대칭-차집합">대칭 차집합</h3>
<pre><code>set1 = set([1,2,3,4,5,6])
set2 = set([3,4,5,6,8,9])

print(set1 ^ set2)

{1, 2, 8, 9}</code></pre><h2 id="집합-관련-함수">집합 관련 함수</h2>
<p>###1) 값 1개 추가히기(add)
이미 만들어진 set 자료형에 값을 추가할 수 있다.</p>
<pre><code>s1 = set([1,2,3])
s1.add(4)
print(s1)    #result : {1, 2, 3, 4}</code></pre><h3 id="2-값-여러개-추가하기update">2) 값 여러개 추가하기(update)</h3>
<pre><code>s1 = set([1,2,3])
s1.update([4,5,6])
print(s1)    #result : {1, 2, 3, 4, 5, 6}</code></pre><h3 id="3-특정-값-제거하기remove">3) 특정 값 제거하기(remove)</h3>
<pre><code>s1 = set([1,2,3])
s1.remove(2)
print(s1)    #result : {1, 3}</code></pre><h2 id="counter-클래스">Counter 클래스</h2>
<ul>
<li>collections모듈의 Counter 클래스</li>
<li>리스트, 튜플에서 각 데이터가 등장한 횟수를 사전 형식으로 돌려줌</li>
</ul>
<h3 id="기본-예시">기본 예시</h3>
<pre><code class="language-python">from collections import Counter
colors = [&#39;red&#39;, &#39;blue&#39;, &#39;red&#39;, &#39;green&#39;, &#39;blue&#39;, &#39;blue&#39;]
cnt = Counter(colors)
print(cnt)
&gt;&gt; Counter({&#39;blue&#39;: 3, &#39;red&#39;: 2, &#39;green&#39;: 1})</code></pre>
<h3 id="most_common">most_common()</h3>
<ul>
<li>등장한 횟수를 내림차순으로 정맇<pre><code class="language-python">&gt;&gt;&gt; numbers = [1, 2, 3, 3, 4, 4, 4, 5, 5]
&gt;&gt;&gt; from collections import Counter
&gt;&gt;&gt; cnt = Counter(numbers)
&gt;&gt;&gt; cnt.most_common()
[(4, 3), (3, 2), (5, 2), (1, 1), (2, 1)]</code></pre>
</li>
</ul>
<h3 id="상위-n개의-결과-도출">상위 n개의 결과 도출</h3>
<pre><code class="language-python">&gt;&gt;&gt; cnt.most_common(3)
[(4, 3), (3, 2), (5, 2)]</code></pre>
<h3 id="최빈값">최빈값</h3>
<pre><code class="language-python">from collections import Counter

def modefinder(numbers):   #numbers는 리스트나 튜플 형태의 데이터
    c = Counter(numbers)
    mode = c.most_common(1)
    return mode[0][0]</code></pre>
<ul>
<li>최빈수가 2개 이상 존재할 때</li>
</ul>
<pre><code class="language-python">from collections import Counter

def modefinder(numbers):
    c = Counter(numbers)
    order = c.most_common()
    maximum = order[0][1]

    modes = []
    for num in order:
        if num[1] == maximum:
            modes.append(num[0])
    return modes</code></pre>
<h3 id="permutaion">permutaion</h3>
<ul>
<li>순열(순서를 고려)</li>
</ul>
<p>import itertools
arr = [&#39;A&#39;, &#39;B&#39;, &#39;C]
nPr = itertools.permutaions(arr, 2)</p>
<h3 id="combination">combination</h3>
<ul>
<li>조합(순서 고려x)</li>
</ul>
<p>import itertools
arr= [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]
nCr = itertools.combinations(arr, 2)</p>
<h1 id="dfs">DFS</h1>
<ul>
<li><p>경로 탐색</p>
</li>
<li><p>네트워크 유형</p>
</li>
<li><p>조합 유형</p>
</li>
<li><p>재귀함수</p>
</li>
</ul>
<h1 id="bfs">BFS</h1>
<ul>
<li>queue</li>
</ul>
<h1 id="dp-동적계획">DP 동적계획</h1>
<ul>
<li>수행시간 단축 알고리즘</li>
<li>정수 삼각형</li>
<li>메모리를 사용해서 중복 연산을 줄이고 중복 연산을 줄여서 수행 속도를 개선</li>
</ul>
<blockquote>
<p>기억하며 풀기</p>
</blockquote>
<ul>
<li>DFS/BFS로 풀 수 있지만 경우의 수가 너무 많은 경우<ul>
<li>500만개 </li>
</ul>
</li>
<li>경우의 수 중 중복이 많을 때</li>
</ul>
<h1 id="hash">hash</h1>
<ul>
<li><p>key, value</p>
</li>
<li><p>전화번호부</p>
</li>
<li><p>다양한 자료형으로 데이터 관리 가능</p>
</li>
<li><p>모든 데이터 타입으로 접근 가능</p>
</li>
<li><p>String 기반으로 데이터 관리</p>
</li>
</ul>
<h1 id="string-알고리즘">String 알고리즘</h1>
<ol>
<li>문자열 단순 구현</li>
</ol>
<ul>
<li>&quot;&quot;.equals()</li>
<li>length()</li>
<li>toUpperCase()</li>
<li>toLowerCase()</li>
<li>indexOf() =&gt; 문자열 있는지 판단</li>
<li>substring(1, 3) =&gt; 1부터 3까지 추출</li>
<li>replace(a,b) =&gt; a를 b로 바꾸기</li>
<li>compareTo =&gt; 알파벳 순서 비교하기 =&gt; 뒤가 작으면 -, 뒤가 크면 +, 같으면 0</li>
<li>startswith()</li>
<li>endswith()</li>
<li>contains</li>
</ul>
<h1 id="greedy">Greedy</h1>
<ul>
<li><p>현재 시점에 가장 좋은 선택을 하는 알고리즘</p>
</li>
<li><p>경주마 알고리즘</p>
</li>
<li><p>탐욕스러운 선택 조건</p>
</li>
<li><p>정렬 =&gt; 현재 최적</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Azure 웹개발] 인터넷과 http]]></title>
            <link>https://velog.io/@cindy0817-web/Azure-%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%9D%B8%ED%84%B0%EB%84%B7%EA%B3%BC-http</link>
            <guid>https://velog.io/@cindy0817-web/Azure-%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%9D%B8%ED%84%B0%EB%84%B7%EA%B3%BC-http</guid>
            <pubDate>Sat, 15 Apr 2023 16:50:46 GMT</pubDate>
            <description><![CDATA[<p>웹 : 인터넷에 연결된 사용자들이 서로의 정보를 공유할 수 있는 공간
w는 웹의 줄임말</p>
<h1 id="http란">http란</h1>
<ul>
<li>Hyper Text Transfer Protocol</li>
<li>인터넷에서 하이퍼텍스트 방식의 데이터를 교환하기위한 프로토콜(규칙체계)</li>
<li>서버간 통신에서 이해할 수 있는 공통의 통신 =&gt; 프로토콜 =&gt; http</li>
<li>통신방식, 통신구조</li>
</ul>
<h1 id="ip-주소">ip 주소</h1>
<blockquote>
<p>Internet Protocol address, IP address)</p>
</blockquote>
<ul>
<li><p>각 컴퓨터의 주소를 나타내는 것</p>
</li>
<li><p>컴퓨터 네트워크에서 장치들이 서로를 인식하고, 통신하기 위한 특수한 번호!
<a href="https://velog.velcdn.com/images/cindy0817-web/post/8c79ba13-7313-4307-8eab-cbae6b30632d/image.png"></a></p>
</li>
<li><p>인터넷 접속할 때 ip 주소를 사용하고 있다!</p>
</li>
</ul>
<h3 id="ip-주소-테스트해보기">ip 주소 테스트해보기</h3>
<p><code>cmd 창에 다음 입력</code></p>
<pre><code>Ping www.google.com [142.250.206.196] 32바이트 데이터 사용:
142.250.206.196의 응답: 바이트=32 시간=41ms TTL=56
142.250.206.196의 응답: 바이트=32 시간=38ms TTL=56
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.

142.250.206.196에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 2, 손실 = 2 (50% 손실),
왕복 시간(밀리초):
    최소 = 38ms, 최대 = 41ms, 평균 = 39ms
</code></pre><p>컴퓨터가 Google을 동작시키는 컴퓨터 또는 서버에 ping 신호를 보내주는 것</p>
<p><code>구글 ip주소 : 142.250.206.196</code></p>
<ul>
<li><p>ip주소는 제한적이다. </p>
</li>
<li><p>관리자들이 정해놓은 이름을 IP주소 대신 사용하고, 그 이름을 도메인이라고함</p>
<ul>
<li>.kr, .net. com</li>
</ul>
</li>
<li><p>외부ip : 공유기를 거치기 전의 IP =&gt; isp가 나에게 할당한 고유의 ip주소, 인터넷 상에서 컴퓨터, 스마트폰을 식별할 수 있는 번호</p>
</li>
<li><p>내부ip : 공유기를 거친 후의 IP =&gt; 라우터(공유기)가 컴퓨터, 스마트폰에 자동으로 부여하는 가상의 ip주소, 속한 네트워크 안에서만 동작할 수 있음!</p>
</li>
</ul>
<h1 id="포트번호">포트번호</h1>
<ul>
<li>컴퓨터 네트워크에서 서로 다른 프로그램이나 장치들이 통신위해 사용하는 번호</li>
<li>컴퓨터 식별 가능 =&gt;  <a href="http://192.168.01:80">http://192.168.01:80</a></li>
</ul>
<p><code>127.0.0.1:5500</code> =&gt; 예약된 IP주소</p>
<ul>
<li>127.0.0.1 =&gt; 로컬호스트(OS에서 제공하는 시스템 실행하는 해당 컴퓨터)로 접속한 컴퓨터의 주소</li>
<li>5500 =&gt; 포트번호 사용하겠다는 뜻</li>
</ul>
<h1 id="http-통신구조">HTTP 통신구조</h1>
<p>웹 브라우저 동작, 웹서버 동작하는 두개의 컴퓨터</p>
<ul>
<li><p>요청(Request)과 응답(Response)의 구조로 구성된다
HTTP 기반으로 통신할때 클라이언트가 먼저 HTTP요청을 서버에 보내면
서버는 요청에 관한 결과를 HTTP응답을 통해 클라이언트에 보냄으로
HTTP 통신이 이루어짐</p>
</li>
<li><p>요청하고 응답하는 관계를 클라이언트와 서버라고 함</p>
</li>
<li><p>웹서버 =&gt; Apache, IIs, Nginx =&gt; 비용지불</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MS 임파워뭔트 프로젝트] Azure을 활용한 웹개발 시작]]></title>
            <link>https://velog.io/@cindy0817-web/MS-%EC%9E%84%ED%8C%8C%EC%9B%8C%EB%AD%94%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Azure%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@cindy0817-web/MS-%EC%9E%84%ED%8C%8C%EC%9B%8C%EB%AD%94%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Azure%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Sat, 15 Apr 2023 16:18:11 GMT</pubDate>
            <description><![CDATA[<h1 id="클라우드-컴퓨팅">클라우드 컴퓨팅</h1>
<blockquote>
<p>컴퓨팅 : 클라우드에서 처리하는 컴퓨터가 처리하는 양</p>
</blockquote>
<h2 id="클라우드">클라우드</h2>
<ul>
<li>가상의 컴퓨터! </li>
<li>컴퓨터 원격으로 자동 수행</li>
<li>사용자 데이터 저장</li>
<li>버전관리에 유용</li>
</ul>
<h1 id="마이크로소프트-azure란">마이크로소프트 Azure란</h1>
<blockquote>
<p>클라우드 컴퓨팅 플랫폼</p>
</blockquote>
<ul>
<li>IoT, 웹사이트 및 디비 호스팅, 데이터 저장소, 인공지능 등ㅇㄹ 제공</li>
<li>아이콘과 그래픽으로 표현하여 사용자가 더 쉽게 관리할 수 있도록 서비스 제공!</li>
<li>노드, 플라스크, 단넷 지원!</li>
</ul>
<h1 id="웹-애플리케이션">웹 애플리케이션</h1>
<h2 id="특징">특징</h2>
<ul>
<li>웹브라우저 위에서 동작하는 애플리케이션</li>
<li>온라인 뱅킹, 온라인 클래스 등 다양한 영역에 뻗어있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 코테 ]]></title>
            <link>https://velog.io/@cindy0817-web/SQL-%EC%BD%94%ED%85%8C</link>
            <guid>https://velog.io/@cindy0817-web/SQL-%EC%BD%94%ED%85%8C</guid>
            <pubDate>Sat, 15 Apr 2023 15:43:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>like 연산자
LIKE &quot;강원도%&quot;</p>
</blockquote>
<blockquote>
<p>limit 2
원하는 행만큼 출력</p>
</blockquote>
<blockquote>
<p>date 포맷
DATE_FORMAT(날짜 , 형식) : 날짜를 지정한 형식으로 출력</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/4526d25f-0602-4d5d-928e-79ee5ad6a0e9/image.png" alt="">
<a href="https://devjhs.tistory.com/89">출처</a></p>
<blockquote>
<p>소수점</p>
</blockquote>
<ul>
<li>ROUND(값, 자릿수);</li>
</ul>
<p>를 이용해 반올림을 해줄 수 있는데
자릿수를 넣지 않을 경우에는
소수를 모두 반올림 시켜버리고
자리수를 넣을 경우에는
자리수 위치까지 반올림을 수행하게 된다</p>
<p>avg decimal 시간 float 등과 병행할 시에도
값 위치와 자릿수만 기억해주면 된다</p>
<ul>
<li>올림 =&gt; CEIL(값)
을 사용해주면 소수점을 모두 올려준다</li>
</ul>
<ul>
<li>내림은 FLOOR(값)
을 사용해주면 소수점을 모두 버려준다</li>
</ul>
<ul>
<li><p>TRUNCATE(값, 자리수)
를 사용해주면 소수점을 모두 버리는 대신
자리수까지 버려줄 수 있다</p>
</li>
<li><p>null일 때 문자열로 채워주기 =&gt; ifnull함수 이용하기
=&gt; oracle에서는 nvl 사용
=&gt; IS NOT NULL과 다름</p>
</li>
</ul>
<pre><code class="language-sql">IFNULL(TLNO,&#39;NONE&#39;)</code></pre>
<blockquote>
<p>join, Using, 정규식 사용 =&gt; <a href="https://school.programmers.co.kr/learn/courses/30/lessons/133025">과일</a></p>
</blockquote>
<pre><code>SELECT FLAVOR
FROM FIRST_HALF A JOIN ICECREAM_INFO B 
USING (FLAVOR)
WHERE A.TOTAL_ORDER &gt; 3000 AND B.INGREDIENT_TYPE REGEXP &#39;^fruit&#39;
ORDER BY TOTAL_ORDER DESC</code></pre><ul>
<li><p>정규표현식 =&gt; LIKE연산자보다 검색 활용도 높음
REGEXP &#39;&#39;
<a href="https://steemit.com/mysql/@seobangnim/mysql-regexp">출처</a></p>
</li>
<li><p>join =&gt; a 테이블, b 테이블과 같은 레코드만 봄</p>
</li>
<li><p>USING 키워드 =&gt; 두 테이블간 필드이름이 같은 경우에 사용</p>
</li>
</ul>
<blockquote>
<p><a href="https://sjparkk-dev1og.tistory.com/23">mysql과 oracle 헷갈리지 않기!</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[python 코딩테스트 함수, 문장 작성]]></title>
            <link>https://velog.io/@cindy0817-web/python-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%95%A8%EC%88%98-%EB%AC%B8%EC%9E%A5-%EC%9E%91%EC%84%B1</link>
            <guid>https://velog.io/@cindy0817-web/python-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%95%A8%EC%88%98-%EB%AC%B8%EC%9E%A5-%EC%9E%91%EC%84%B1</guid>
            <pubDate>Fri, 14 Apr 2023 16:13:15 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>코딩테스트 연습을 하면서 유용했던 함수를 정리하였습니다.</p>
</blockquote>
<h1 id="나머지-구하기">나머지 구하기</h1>
<h3 id="내가-푼-방식">내가 푼 방식</h3>
<pre><code>def solution(num1, num2):
    answer = num1 % num2
    return answer</code></pre><h3 id="다른-풀이1--divmod-함수-사용하기">다른 풀이1 =&gt; <code>divmod</code> 함수 사용하기</h3>
<ul>
<li>divmod() : // 연산자와 % 연산자를 차례대로 인자로 받아서 튜플 형태로 반환</li>
</ul>
<pre><code>def solution(num1, num2):
    return divmod(num1, num2)[1]</code></pre><h3 id="다른-풀이2--lambda-사용하기">다른 풀이2 =&gt; lambda 사용하기</h3>
<blockquote>
<p>lambda 매개변소 : (반환값으로 사용할 식)</p>
</blockquote>
<pre><code>solution = lambda num1, num2 : num1 % num2</code></pre><p>섞어서?ㅎㅎ</p>
<pre><code>solution = lambda num1, num2 : num1 % num2</code></pre><h1 id="두-수의곱">두 수의곱</h1>
<h3 id="내가-푼-방식-1">내가 푼 방식</h3>
<pre><code>def solution(num1:int, num2:int)-&gt;int:
    answer = num1 * num2
    return answer</code></pre><h3 id="수학을-위한-특수-메서드-활용">수학을 위한 특수 메서드 활용</h3>
<pre><code>a + b       a.__add__(b)
a - b       a.__sub__(b)
a * b       a.__mul__(b)
a / b       a.__truediv__(b)
a // b      a.__floordiv__(b)
a % b       a.__mod__(b)
a &lt;&lt; b      a.__lshift__(b)
a &gt;&gt; b      a.__rshift__(b)
a &amp; b       a.__and__(b)
a | b       a.__or__(b)
a ^ b       a.__xor__(b)
a ** b      a.__pow__(b)
-a          a.__neg__()
~a          a.__invert__()
abs(a)      a.__abs__()</code></pre><p><a href="https://wikidocs.net/84418">출처</a></p>
<h3 id="람다">람다</h3>
<pre><code>solution=lambda x,y:x*y</code></pre><h1 id="숫자-비교하기">숫자 비교하기</h1>
<ul>
<li>내가 푼거<pre><code>def solution(num1, num2):
  if num1 == num2 : return 1
  else :  return -1</code></pre></li>
<li>if 삼항연산자 사용한거<pre><code>def solution(num1, num2):
  return 1 if num1==num2 else -1</code></pre></li>
</ul>
<h1 id="두-수의-차">두 수의 차</h1>
<ul>
<li>lambda 사용<pre><code>solution = lambda num1, num2 : num1 - num2</code></pre></li>
<li>특수메서드 활용<pre><code>solution = lambda num1, num2 : num1.__sub__(num2)</code></pre></li>
</ul>
<h1 id="나이-출력">나이 출력</h1>
<pre><code>
# 1.
# def solution(age):
#     answer = 2023 - age
#     return answer


# 2.
def solution(age):
    return 2022-age+1

# 3.
# solution = lambda age: 2023-age
</code></pre><h1 id="두수의-합">두수의 합</h1>
<p>내가 푼거</p>
<pre><code># def solution(num1, num2):
#     answer = num1 + num2
#     return answer


solution = lambda num1, num2: num1+num2</code></pre><p>sum 활용</p>
<ul>
<li>참고 =&gt; sum은 튜플이나 리스트에 있는 값만 처리해줄 수 있음. 그래서 람다식에 매개변수로 *를 붙여주면 num1과 num2로 들어오는 값을 튜플로 변경해준다.<pre><code>solution = lambda *x: sum(x)</code></pre></li>
</ul>
<h1 id="두수의-나눗셈">두수의 나눗셈</h1>
<ul>
<li>math 모듈 =&gt; import math
abs : 절대값
max : 최댓값
min: 최솟값
pow: 멱승(제곱)
round: 반올림(정수) </li>
</ul>
<pre><code># // 사용
def solution(num1, num2):
     answer = 0
     answer = 1000 * num1//num2
     return answer

# int로 변환
solution = lambda num1, num2 : (int)(num1/num2 * 1000)

# trunc함수 사용
solution = lambda num1, num2 : math.trunc(num1/num2*1000)</code></pre><h1 id="각도기">각도기</h1>
<ul>
<li>삼항 연산자 적극 활용하기</li>
<li>조건을 dictionary안에 넣고 for in문으로 조건이 해당되는 값의 키를 리턴시키기<pre><code class="language-python"># def solution(angle):
#     if angle&lt;=90:
#         return 1 if angle&lt;90 else 2
#     else:
#         return 3 if angle&lt;180 else 4
</code></pre>
</li>
</ul>
<h1 id="return-answer">return answer</h1>
<h1 id="람다로">람다로</h1>
<p>solution = lambda angle : 2 if angle==90 else 1 if angle&lt;90 else 4 if angle==180 else 3</p>
<h1 id="간단한-방법">간단한 방법</h1>
<h1 id="def-solutionangle">def solution(angle):</h1>
<h1 id="answer--angle--90--2--angle--90--0--1">answer = (angle // 90) * 2 + (angle % 90 &gt; 0) * 1</h1>
<h1 id="return-answer-1">return answer</h1>
<h1 id="검색">검색</h1>
<h1 id="def-solutionangle-1">def solution(angle):</h1>
<h1 id="angles--180-4-91-3-90-2-0-1">angles = {180: 4, 91: 3, 90: 2, 0: 1}</h1>
<h1 id="for-base-result-in-anglesitems">for base, result in angles.items():</h1>
<h1 id="if-angle--base">if angle &gt;= base:</h1>
<h1 id="return-result">return result</h1>
<pre><code>


# 짝수의 합
&gt; **문제설명**
정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.

* for문 짚고가기
* for i in iterable
iterable한 타입 : list, dictionary, set, string, tuple, bytes

* for i in range(종료숫자) 
종료숫자-1까지 수행

```python
# 기본 풀이
def solution(n):
    answer = 0
    for i in range(2, n+1, 2):
        answer += i
    return answer


# n까지 수 중 짝수만 리스트에 넣어준 후 더해주기
solution = lambda n: sum([i for i in range(2, n + 1, 2)])

# 위의 방법과 비슷함
solution = lambda n: sum(range(0, n+1, 2))

# 등차수열 2n의 합 공식 이용하기
def solution(n):
    return 2*(n//2)*((n//2)+1)/2</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 조건문, 반복문, 함수 및 라이브러리]]></title>
            <link>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A1%B0%EA%B1%B4%EB%AC%B8-%EB%B0%98%EB%B3%B5%EB%AC%B8-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A1%B0%EA%B1%B4%EB%AC%B8-%EB%B0%98%EB%B3%B5%EB%AC%B8-%ED%95%A8%EC%88%98</guid>
            <pubDate>Wed, 12 Apr 2023 05:52:02 GMT</pubDate>
            <description><![CDATA[<h1 id="파이썬-기본-입출력">파이썬 기본 입출력</h1>
<h2 id="표준-입력">표준 입력</h2>
<ul>
<li>input() : 한줄의 문자열 입력</li>
<li>map() : 리스트 모든 원소에 각각 특정한 함수 적용할때</li>
</ul>
<blockquote>
<p>공백을 기준으로 구분된 데이터 입력받을 때</p>
</blockquote>
<pre><code class="language-python"># 입력 받은 후 공백 기준으로 구분하고, 원소를 정수형으로 바꿔주고 list형으로 만들어주기
list(map(int, input().split()))</code></pre>
<blockquote>
<p>공백 기준으로 구분된 데이터 개수가 많지 않을 때(정해진 양)</p>
</blockquote>
<pre><code class="language-python"># 데이터 3개 들어올때
a, b, c = map(int, input().split());
print(a, b, c)</code></pre>
<pre><code class="language-python"># 데이터의 개수 입력
n = int(input())

# 각 데이터를 공백을 기준으로 구분하여 입력
data = list(map(int, input().split()))

data.sort(reverse=True)
print(data)

# 65 90 75 34 99 =&gt; 입력
# [99, 90, 75, 65, 34] =&gt; 출력</code></pre>
<blockquote>
<p>빠르게 입력</p>
</blockquote>
<ul>
<li><code>sys.stdin.realine()</code> <code>rstrip()</code> =&gt; 줄바꿈 기호 제거</li>
</ul>
<h2 id="표준-출력">표준 출력</h2>
<ul>
<li>print()함수</li>
<li>기본 줄바꿈 =&gt; 줄 바꿈 원치 않는경우! &#39;end&#39; 속성 사용</li>
</ul>
<blockquote>
<p>f-string</p>
</blockquote>
<ul>
<li>문자열 앞에 f 붙여서 사용</li>
</ul>
<pre><code class="language-python">a=1
b=2
print(a, b)
print(7, end=&quot; &quot;)
print(8, end=&quot; &quot;)

answer = 7
# 정수형 문자열로 바꾼 후 + 연산자 사용
print(&quot;정답 : &quot; + str(answer) + &quot;입니다.&quot;)

# f-string
print(f&quot;정답은 {answer}입니다.&quot;)</code></pre>
<h1 id="조건문과-반복문">조건문과 반복문</h1>
<h2 id="조건문">조건문</h2>
<pre><code class="language-python">x=15;

if x&gt;=10:
    print(&quot;x&gt;=10&quot;)
if x&gt;=0:
    print(&quot;x&gt;=0&quot;)
if x&gt;=30:
    print(&quot;x&gt;=30&quot;)</code></pre>
<blockquote>
<p>코드의 블록을 <code>들여쓰기</code>로 지정!!</p>
</blockquote>
<ul>
<li>tab, 스페이스 4개</li>
</ul>
<pre><code class="language-python">x=15;

if x&gt;=10:
    print(&quot;x&gt;=10&quot;)
if x&gt;=0:
    print(&quot;x&gt;=0&quot;)
if x&gt;=30:
    print(&quot;x&gt;=30&quot;)

score = 85;
# 들여쓰기로 코드 블록 구분
if score&gt;= 70:
    print(&#39;성적 70 이상&#39;)
    if score &gt;= 90:
        print(&#39;우수한 성적&#39;)
else:
    print(&#39;성적 70 미만&#39;)
    print(&#39;분발할것&#39;)</code></pre>
<blockquote>
<p>조건문 기본형태</p>
</blockquote>
<ul>
<li>if ~ elif ~ else</li>
</ul>
<h2 id="반복문">반복문</h2>
<blockquote>
<p>while</p>
</blockquote>
<pre><code class="language-python">x=10

while x&gt;5:
    print(x)</code></pre>
<blockquote>
<p>for in문
<code>in</code> 뒤에 오는 데이터에 포함되어있는 원소를 첫번째 인덱스부터 차례대로 방문</p>
</blockquote>
<pre><code class="language-python">array = [1, 2, 3, 4, 5]

for x in array:
    print(x)</code></pre>
<blockquote>
<p>for range문</p>
</blockquote>
<ul>
<li><strong>연속적인</strong> 값을 차례대로 순회할 때</li>
<li>range(시작 값, 끝값+1)</li>
</ul>
<pre><code class="language-python">result = 0

# i는 1부터 9까지의 모든 값을 순회
for i in range(1,10):
    result += i

print(result)</code></pre>
<blockquote>
<p>continue</p>
</blockquote>
<ul>
<li>반복문에서 남은 코드의 실행 <strong>건너뛸 때</strong> continue를 사용</li>
</ul>
<pre><code class="language-python">result = 0

# i는 1부터 9까지의 모든 값을 순회
for i in range(1,10):
    if i % 2 == 0:
        continue
    result += i

print(result)</code></pre>
<blockquote>
<p>break</p>
</blockquote>
<ul>
<li>반복문을 즉시 탈출하고자 할 때<pre><code class="language-python">i = 1
</code></pre>
</li>
</ul>
<p>while True:
    print(&quot;현재 i의 값:&quot;, i)
    if i == 5:
        break
    i+=1</p>
<pre><code>
* 간단한 예제

```python
scores = [90, 85, 77, 65, 97]
cheating_student_list = {2, 4}

# cheating_student_list 리스트에 있는 점수 건너뛰기
for i in range(5):
    if i+1 in cheating_student_list:
        continue
    if scores[i] &gt;= 80:
        print(i+1, &quot;번 학생은 합격입니다.&quot;)</code></pre><blockquote>
<p>구구단</p>
</blockquote>
<pre><code class="language-python">for i in range(2, 10):
    for j in range(1, 10):    
        print(i, &quot;X&quot;, j, &quot;=&quot;, i*j)
    print()</code></pre>
<h1 id="함수">함수</h1>
<ul>
<li>함수 형식</li>
</ul>
<pre><code class="language-python">def func1(a):
    print(a)
    return 0



result = subtract(3,7) 

#result =&gt; -4</code></pre>
<ul>
<li>전역변수</li>
</ul>
<pre><code class="language-python">
a=0

def func():
    global a
    a += 1

for i in range(10):
    func()
    print(a)</code></pre>
<ul>
<li>여러개의 반환 값
<img src="https://velog.velcdn.com/images/cindy0817-web/post/0894a03c-a733-47a6-af1c-c7ac2113be46/image.png" alt=""></li>
</ul>
<h2 id="람다-표현식">람다 표현식</h2>
<p>(-&gt;이해가 잘 안됨, 다시 공부하기)</p>
<pre><code class="language-python">print((lambda a, b: a+b)(3,7))

array = [(&#39;홍길동&#39;, 50), (&#39;이순신&#39;, 32), (배서연, 74)]

def my_key(x):
    return x[1]

print(sorted(array, key=my_key))
print(sorted(array, key=lambda x: x[1]))
</code></pre>
<blockquote>
<p>파라미터 저장</p>
</blockquote>
<pre><code class="language-python">def add(a, b):
    print(a+b)

add(b=3, a=7)</code></pre>
<blockquote>
<p>람다 예시 : 여러개의 리스트에 적용</p>
</blockquote>
<pre><code class="language-python">list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]

result = map(lambda a,b: a+b, list1, list2)

print(list(result))</code></pre>
<h2 id="라이브러리">라이브러리</h2>
<ul>
<li>내장함수 : 기본입출력함수 ~ 정렬함수까지 기본적인 함수제공</li>
<li>itertools : 반복되는 형태의 데이터를 처리할때 유용한 기능 제공 =&gt; 순열, 조합 라이브러리</li>
<li>heapq : 힙 자료구조 제공 =&gt; 우선순위 큐</li>
<li>bisect : 이진 탐색</li>
<li>collections : 덱(deque), 카운터(counter)등</li>
<li>math : 팩토리얼, 제곱근, 최대공약수, 삼각함수, 파이 등</li>
</ul>
<pre><code class="language-python"># sum() =&gt; 합
result = sum([1,2,3,4,5])
print(result)

# min(), max() =&gt; 최대 최소
min_result = min(7,3,5,2)
max_result = max(7,3,5,2)
print(min_result, max_result)

# eval() =&gt; 문자열을 식으로
result = eval(&quot;(3+5)*7&quot;)
print(result)

# sorted() =&gt; 정렬
result = sorted([9,1,8,5,4]) # 오름차순
reverse_result = sorted([9,1,8,5,4], reverse=True)  # 내림차순
print(result)
print(reverse_result)

# sorted() with key
array = [(&#39;홍길동, 50&#39;), (&#39;이순신&#39;, 32), (&#39;배서연&#39;, 74)]
result = sorted(array, key=lambda x: x[1], reverse=True)
print(result)</code></pre>
<blockquote>
<p>순열과 조합</p>
</blockquote>
<ul>
<li>순열 : 서로 다른 n개에서 서로 다른 r개를 선택하여 나열</li>
<li>조합 : 서로 다른 n개에서 순서 상관x 서로 다른 r개를 선택
=&gt; 거꾸로 뒤집는거 안됨</li>
</ul>
<p><code>permutations)</code></p>
<pre><code class="language-python">from itertools import permutations

data = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]  # 데이터 준비

result = list(permutations(data, 3))
print(result)</code></pre>
<p><code>combination</code></p>
<pre><code class="language-python">from itertools import combinations

data = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]  # 데이터 준비

result = list(combinations(data, 2)) # 2개를 뽑는 모든 조합 구하기
print(result) </code></pre>
<blockquote>
<p>중복 순열과 중복 조합</p>
</blockquote>
<pre><code>from itertools import product

data = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]

# 2개를 뽑는 모든 순열 구하기 (중복 허용)
result = list(product(data, repeat=2))
print(result)

from itertools import combinations_with_replacement

data = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]

# 2개를 뽑는 모든 조합 구하기 (중복 허용)
result = list(combinations_with_replacement(data, 2))
print(result)</code></pre><blockquote>
<p>최대 공약수와 최소 공배수</p>
</blockquote>
<pre><code class="language-python">import math

# 최소 공배수(LCM)를 구하는 함수
def lcm(a, b):
    # 두 수를 곱하고 최대 공약수로 나눔
    # //는 소수점 이하 자릿수를 제거한 몫을 구하는 연산자(Floor Division)
    return a * b // math.gcd(a, b)

a=21
b=14

print(math.gcd(21, 14)) # 최대 공약수(GCD) 계산
print(lcm(21, 14))      # 최대 공배수(LCM) 계산</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료형(문자열, 튜플, 딕셔너리, 집합)]]></title>
            <link>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%ED%98%95%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%8A%9C%ED%94%8C-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EC%A7%91%ED%95%A9</link>
            <guid>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%ED%98%95%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%8A%9C%ED%94%8C-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EC%A7%91%ED%95%A9</guid>
            <pubDate>Tue, 04 Apr 2023 01:20:04 GMT</pubDate>
            <description><![CDATA[<h1 id="문자열-자료형">문자열 자료형</h1>
<ul>
<li>문자열 변수 초기화 할 때 =&gt; 큰따옴표(&quot;) 작은따옴표(&#39;)<ul>
<li><code>&quot;</code> &#39;&#39; <code>&quot;</code></li>
<li><code>&#39;</code> &quot;&quot; <code>&#39;</code></li>
</ul>
</li>
</ul>
<pre><code class="language-python">data = &#39;Hello World&#39;
print(data)


data = &quot;Don&#39;t you know \&quot;Python\&quot;&quot;
print(data)</code></pre>
<h2 id="문자열-연산">문자열 연산</h2>
<ul>
<li>덧셈(+) 연산 =&gt; 연결</li>
<li>곱하기(*) 연산 =&gt; 문자열이 여러번 더해짐</li>
<li>인덱싱, 슬라이싱 이용 가능<ul>
<li>but 인덱스값 변경x</li>
</ul>
</li>
</ul>
<pre><code class="language-python">a=&quot;Hello&quot;
b=&quot;World&quot;
print(a + &quot; &quot; + b)
print(a*3)

a= &quot;ABCDEF&quot;
# 문자열 a의 두번째부터 세번째 자리가 출력됨 =&gt; CD
print(a[2:4])

# 특정 문자열을 바꾸는 것은 안됨
# a[2] = &#39;a&#39;</code></pre>
<h1 id="튜플-자료형">튜플 자료형</h1>
<blockquote>
<p>리스트와의 차이!</p>
</blockquote>
<ul>
<li>한번 선언된 값을 변경x</li>
<li>튜플은 소괄호 <code>()</code> 이용</li>
<li>리스트에 비해 <strong>공간효율적</strong></li>
</ul>
<pre><code class="language-python">a = (1,2,3,4,5,6,7,8,9)

# 네번째 원소만 출력
print(a[3])

# 1,2,3번재 값
# (2,3,4)
print(a[1:4])

# 오류발생
# a[2] = 7</code></pre>
<blockquote>
<p>튜플을 사용하면 좋은 경우</p>
</blockquote>
<ul>
<li>서로 다른 성질의 데이터를 묶어서 관리해야할 때<ul>
<li>최단경로 알고리즘(비용, 노드번호)의 형태로 튜플 자료형 사용</li>
</ul>
</li>
<li>데이터의 나열을 해싱(Hasing)의 키 값으로 사용해야 할 때<ul>
<li>튜플은 변경x 리스트와 다르게 <strong>키값</strong> 으로 사용될 수 있다!!</li>
</ul>
</li>
<li>리스트보다 메모리를 효율적을 사용해야할 때 </li>
</ul>
<h1 id="딕셔너리-자료형">딕셔너리 자료형</h1>
<ul>
<li>키(key)와 값(Value)의 쌍을 데이터로 가지는 자료형</li>
<li>키와 값의 쌍을 데이터로 가지며, 원하는 <strong>변경 불가능한 자료형</strong>을 키로 사용 가능 =&gt; 키값으로 접근 가능</li>
<li>딕셔너리는 해시테이블(Hash Table)을 이용하므로 데이터 조회, 수정에 있어서 O(1)의 시간에 처리가능</li>
</ul>
<pre><code class="language-python">data = dict()
data[&#39;사과&#39;] = &#39;Apple&#39;
data[&#39;바나나&#39;] = &#39;Banana&#39;
daata[&#39;코코넛&#39;] = &#39;Coconut&#39;

# 출력 됨
if &#39;사과&#39; in data:
    print(&quot;&#39;사과&#39;를 키로 가지는 데이터가 존재</code></pre>
<ul>
<li><p>특정한 키 존재하는지 저장하고 관리하고 검색할때 리스트보다 효육적</p>
</li>
<li><p>키 데이터만 뽑아서 리스트로 이용할 때 =&gt; keys()</p>
</li>
<li><p>값 데이터만 뽑아서 리스트로 이용할 때 =&gt; values()</p>
</li>
</ul>
<pre><code class="language-python">data = dict()
data[&#39;사과&#39;] = &#39;Apple&#39;
data[&#39;바나나&#39;] = &#39;Banana&#39;
daata[&#39;코코넛&#39;] = &#39;Coconut&#39;

# 키 데이터만 담은 리스트
key_list = data.keys()

value_list = data.values()
print(key_list)
print(value_list)

# 각 키에 따른 값을 하나씩 출력
for key in key_list:
    print(data[key])

# 이런식으로도 선언 가능
data2 = {
    &#39;김미림&#39; : 33,
    &#39;이미림&#39; : 44
}</code></pre>
<h1 id="집합-자료형">집합 자료형</h1>
<ul>
<li><p>중복 허용</p>
</li>
<li><p>순서가 없다</p>
</li>
<li><p>리스트 혹은 문자열을 이용해서 초기화 가능
=&gt; set() 함수 이용</p>
</li>
<li><p>혹은 중괄호({})안에 각 원소를 콤마(,)를 기준으로 구분하여 삽입함으로써 초기화 가능</p>
</li>
<li><p>데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리가능</p>
</li>
</ul>
<pre><code class="language-python"># 집합 자료형 초기화 방법1
data = set([1,1,2,3,4,4,5])

#집합 자료형 초기화 방법 2
data = {1,1,2,3,4,4,5}

# 출력 결과(중복제거0
# {1,2,3,4,5}</code></pre>
<blockquote>
<p>집합자료형의 연산</p>
</blockquote>
<ul>
<li>합집합</li>
<li>교집합 </li>
<li>차집합 A-B</li>
</ul>
<pre><code class="language-python">a = set([1,2,3,4,5])
b = set([3,4,5,6,7])

# 합집합 =&gt; {1,2,3,4,5,6,7}
pritn(a | b)

# 교집합 =&gt; {3,4,5}
print(a &amp; b)

# 차집합 =&gt; {1,2}
print(a-b)</code></pre>
<blockquote>
<p>집합 자료형 관련 함수</p>
</blockquote>
<pre><code class="language-python">data = set([1,2,3])

# 추가
data.add(4)

# 여러개 추가
data.update([5,6])

# 삭제
data.remove(3)</code></pre>
<blockquote>
<p>딕셔너리 자료형, 집합 자료형의 특징</p>
</blockquote>
<ul>
<li>리스트, 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있음</li>
<li>딕셔너리 자료형, 집합자료형은 <strong>순서가 없기 때문에 인덱싱으로 값을 얻을 수 없음</strong>
=&gt; 딕셔너리의 키(Key) 혹은 집합의 원소(Element)를 이용해 O(1)의 시간 복잡도로 조회</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료형(정수형, 실수형, 리스트)]]></title>
            <link>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@cindy0817-web/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Sun, 02 Apr 2023 14:02:50 GMT</pubDate>
            <description><![CDATA[<h1 id="수-자료형">수 자료형</h1>
<ul>
<li>정수형, 실수형, 복소수형, 문자열, 리스트, 튜플, 딕셔너리 등</li>
</ul>
<h2 id="정수형">정수형</h2>
<ul>
<li>양의 정수, 음의 정수, 0<pre><code class="language-python"># 양의 정수
a = 1000
</code></pre>
</li>
</ul>
<h1 id="음의-정수">음의 정수</h1>
<p>b = -7</p>
<h1 id="0">0</h1>
<p>c = 0</p>
<pre><code>


## 실수형
* 소수점 아래의 데이터를 포함하는 수 자료형

``` python
a=157.93

b = -1837.2

# 0생략 가능
c= 5.

d = -.7
</code></pre><ul>
<li>고정된 크기의 메모리 할당 =&gt; 실수값 달라질 수 있ㅇㅁ</li>
<li>해결방법 =&gt; round()함수를 사용하자</li>
<li>123.456을 소수 셋째 자리에서 반올림하면
round(123,456,2) =&gt; 소수점 자리 둘째자리까지
결과 : 123.46</li>
</ul>
<h3 id="지수-표현-방식">지수 표현 방식</h3>
<ul>
<li>e나 E를 이용한 지수 표현 방식을 이용할 수 있음</li>
<li>1e9 : 10의 9제곱 (10억)</li>
</ul>
<pre><code class="language-python"># 1,000,000,000
b = int(1e9)

# 752.5
a = 75.25e1
</code></pre>
<h3 id="수-자료형의-연산">수 자료형의 연산</h3>
<ul>
<li>나누기 연산자 /<ul>
<li>실수형으로 반환</li>
</ul>
</li>
<li>나머지 연산자 %<ul>
<li>a가 홀수인지 체크할때</li>
</ul>
</li>
<li>몫 연산자 //</li>
<li>거듭 제곱 연산자 **</li>
</ul>
<pre><code>a = 7
b = 3

a*b
a/b
a//b
a ** b</code></pre><h2 id="리스트-자료형">리스트 자료형</h2>
<ul>
<li>여러개의 데이터를 연속적으로 담아 처리하기 위해 사용하는 자료형</li>
<li>뒤쪽에 데이터 붙이기 append()</li>
</ul>
<h3 id="리스트-초기화">리스트 초기화</h3>
<ul>
<li>대괄호 안에 원소를 넣어서 초기화</li>
<li>list(), []를 이용 =&gt; 빈 리스트 선언</li>
<li>리스트 원소에 접근할때 인덱스 값을 괄호에 넣음</li>
</ul>
<pre><code class="language-python"># 크기가 N이고, 모든 값이 0인 1차원 리스트 초기화

n=10
a = [0] * n

# [0,0,0,0,0,0,0,0,0,0]
</code></pre>
<h3 id="리스트의-인덱싱과-슬라이싱">리스트의 인덱싱과 슬라이싱</h3>
<ul>
<li>인덱스 값을 입력하여 특정한 원소를 접근 하는 것</li>
<li>양의 정수, 음의 정수 모두 사용 가능</li>
<li>음의 정수 =&gt; 거꾸로 접근</li>
</ul>
<pre><code class="language-python">a = [1,2,3,4,5,6]

a[-1]

a[3] = 7</code></pre>
<ul>
<li>연속적인 위치 갖는 원소 가져올 때는 슬라이싱 이용</li>
<li>대괄호 안에 콜론을 넣어서 시작 인덱스, 끝 인덱스 설정 가능</li>
<li>끝 인덱스는 실제 인덱스보다 1을 더 크게 설정</li>
</ul>
<pre><code>a = [1,2,3,4,5,6,7,8,9]

# 2,3,4
print(a[1:4])</code></pre><h3 id="리스트-컴프리헨션">리스트 컴프리헨션</h3>
<ul>
<li>리스트 초기화</li>
<li>대괄호 안에 조건문, 반복문 적용</li>
</ul>
<pre><code class="language-python"># 0,1,2,3,4,5,6,7,8,9
array = [i for i in range(10)]

# 0부터 19까지의 수 중에서 홀수만 포함하는 리스트
# 1,3,5,7,9,11,13,15,79,19
array2 = [i for i in range(20) if i % 2 ==1]

# 1부터 9까지들의 수들의 제곱 값을 포함하는 리스트
# 1,4,9,16,25,36,49, 64, 81
array3 = [i * i for i in range(1,10)]
</code></pre>
<blockquote>
<p>리스트 컴프리헨션과 일반적인 코드 비교하기</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/5f88af51-1c35-484c-b48c-5799a91c9010/image.png" alt=""></p>
<ul>
<li>리스트 컴프리헨션은 <strong>2차원 리스트</strong>를 초기화할 때 효과적으로 사용</li>
<li>N * M의 크기의 2차원 리스트를 한번에 초기화 해야할 때 유용</li>
<li>n번 반복을 할 때마다 길이가 m인 리스트를 새롭게 초기화
<code>array = [[0]*m for _in range(n)]</code></li>
</ul>
<ul>
<li>잘못된 예시 : <code>array = [[0]*m]*n</code>
전체 리스트 안에 포함된 각 리스트가 모두 같은 객체로 인식</li>
</ul>
<blockquote>
<p>리스트 컴프리헨션으로 2차원 리스트 초기화 좋은예시</p>
</blockquote>
<pre><code class="language-python"># N X M 크기의 2차원 리스트 초기화
# [0,0,0], [0,0,0], [0,0,0], [0,0,0]
n = 4
m = 3
array = [[0] * m for _ in range(n)]

</code></pre>
<blockquote>
<p>리스트 컴프리헨션으로 2차원 리스트 초기화 나쁜예시</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/568b29a8-8a9a-4bae-9892-c042f91ade86/image.png" alt=""></p>
<ul>
<li>내부적 리스트 같은 객체로 인식됨</li>
</ul>
<h3 id="언더바">언더바</h3>
<blockquote>
<p>반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 언더바(_)를 자주 사용함</p>
</blockquote>
<pre><code class="language-python"># 1부터 9까지 더하기
summary=0
for i in range(1, 10):
    summary +=i


# Hello world 5번 출력
for _ in range(5):
    print(&quot;Hello World&quot;)</code></pre>
<h3 id="리스트-관련-메소드">리스트 관련 메소드</h3>
<ul>
<li>append()
<code>변수명.append()</code>
리스트 원소 하나 삽입</li>
<li>sort
정렬
<code>변수명.sort()</code>
<code>변수명.sort(reverse=True)</code></li>
<li>reverse
<code>변수명.reverse()</code>
리스트 원소 순서 뒤집기</li>
<li>insert
<code>insert(삽입할 위치 인덱스, 삽입할 값)</code>
특정한 인덱스 위치에 원소 삽입</li>
<li>count
<code>변수명.count(특정 값)</code>
리스트에서 특정한 값을 가지는 데이터의 개수를 셀때</li>
<li>remove
<code>변수명.remove(특정값)</code>
특정값을 갖는 원소제거, 값을 가진 원소가 여러개면 하나만 제거</li>
</ul>
<pre><code class="language-python">a = [1,4,3]
b = [1,4,3]

print(&quot;기본 리스트 : &quot;, a)


# 리스트에 원소 삽입
a.append(2)
print(&quot;삽입 : &quot;, a)

# 오름차순 정렬
a.sort()
print(&quot;오름차순 정렬 : &quot;, a)

# 내림차순 정렬
a.sort(reverse=True)
print(&quot;내림차순 정렬 : &quot;, a)

print(&quot;=======================&quot;)

# 리스트 원소 뒤집기
b.reverse()
print(&quot;원소 뒤집기 : &quot;, b)

# 특정 인덱스에 데이터 추가
b.insert(2, 3)
print(&quot;인덱스 2에 3 추가: &quot;, b)

# 특정 값인 데이터 개수 세기
print(&quot;값이 3인 데이터 개수 : &quot;, b.count(3))

# 특정 값 데이터 삭제
b.remove(1)
print(&quot;값이 1인 데이터 삭제: &quot;, b)

print(&quot;=======================&quot;)

c = [1,2,3,4,5,5,5]
remove_set = {3,5}  # 집합 자료형

# remove_set에 포함되지 않은 값만을 저장
result = [i for i in c if i not in remove_set]
print(result)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩테스트 python 입문]]></title>
            <link>https://velog.io/@cindy0817-web/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-python-%EC%9E%85%EB%AC%B8</link>
            <guid>https://velog.io/@cindy0817-web/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-python-%EC%9E%85%EB%AC%B8</guid>
            <pubDate>Sun, 02 Apr 2023 07:51:34 GMT</pubDate>
            <description><![CDATA[<h1 id="코딩테스트에-자주-출제되는-문제">코딩테스트에 자주 출제되는 문제</h1>
<ul>
<li>그리디</li>
<li>구현(문자열)</li>
<li>DFS / BFS</li>
</ul>
<h2 id="시간복잡도--공간복잡도">시간복잡도 / 공간복잡도</h2>
<blockquote>
<p>빅오 표기법 : 가장 빠르게 증가하는 항만을 고려</p>
</blockquote>
<p>함수의 <strong>상한</strong>만을 나타낸다.</p>
<h3 id="종류">종류</h3>
<ul>
<li>O(1) 상수시간</li>
<li>O(logN) 로그시간</li>
<li>O(N) 선형시간</li>
<li>O(NlogN)로그선형시간</li>
<li>O(N2) 이차시간</li>
<li>O(N3) 삼차시간</li>
<li>O(2n) 지수시간</li>
</ul>
<h2 id="시간-복잡도-계산해보기">시간 복잡도 계산해보기</h2>
<blockquote>
<p>N개의 데이터의 합을 계산하는 프로그램</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/b54acbdd-0c5b-4836-a5bd-5a5a37ae44db/image.png" alt=""></p>
<ul>
<li>수행시간은 데이터 개수 N에 비례<ul>
<li>시간복잡도 : O(N)</li>
</ul>
</li>
</ul>
<blockquote>
<p>2중 반복문을 이용하는 프로그램</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/4f71bf0f-def8-42bb-b867-a68fe367e6a5/image.png" alt=""></p>
<ul>
<li>시간복잡도 : O(N2)<ul>
<li>모든 2중 반복문의 시간복잡도가 O(N2)인것은 아님</li>
</ul>
</li>
</ul>
<h3 id="알고리즘-설계-tip">알고리즘 설계 Tip</h3>
<ul>
<li>PyPy의 경우 때때로 C언어보다 빠르게 동작</li>
<li>코딩테스트 문제에서 시간제한은 1~5초 가량임을 유의하기!</li>
</ul>
<h3 id="요구사항에-따라-적절한-알고리즘-설계하기">요구사항에 따라 적절한 알고리즘 설계하기</h3>
<blockquote>
<p>시간제한(수행시간 요구사항) 먼저 확인하기!</p>
</blockquote>
<ul>
<li>N의 범위가 500인 경우 - O(N3)</li>
<li>N의 범위가 2,000인 경우 - O(N2)</li>
<li>N의 범위가 100,000인 경우 - O(NlogN)</li>
<li>N의 범위가 10,000,000인 경우 - O(N)</li>
</ul>
<h3 id="알고리즘-문제-해결과정">알고리즘 문제 해결과정</h3>
<ol>
<li>지문 읽기 및 컴퓨터적 사고</li>
<li>요구사항(복잡도) 분석</li>
<li>문제 해결을 위한 아이디어 찾기</li>
<li>소스코드 설계 및 코딩</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 Lv1] 삼총사-C]]></title>
            <link>https://velog.io/@cindy0817-web/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv1-%EC%82%BC%EC%B4%9D%EC%82%AC-C</link>
            <guid>https://velog.io/@cindy0817-web/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv1-%EC%82%BC%EC%B4%9D%EC%82%AC-C</guid>
            <pubDate>Wed, 08 Mar 2023 12:33:15 GMT</pubDate>
            <description><![CDATA[<h1 id="문제설명">문제설명</h1>
<p>한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.</p>
<p>한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.</p>
<hr>
<h1 id="제한사항">제한사항</h1>
<ul>
<li>3 ≤ number의 길이 ≤ 13</li>
<li>-1,000 ≤ number의 각 원소 ≤ 1,000</li>
<li>서로 다른 학생의 정수 번호가 같을 수 있습니다.</li>
</ul>
<hr>
<h1 id="입출력-예">입출력 예</h1>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/fe9d2906-903b-4a9c-abaa-cdc37a85f3a7/image.png" alt=""></p>
<h1 id="입출력-예-설명">입출력 예 설명</h1>
<blockquote>
<p>입출력 예 #2</p>
</blockquote>
<ul>
<li>학생들의 정수 번호 쌍 (-3, 0, 3), (-2, 0, 2), (-1, 0, 1), (-2, -1, 3), (-3, 1, 2) 이 삼총사가 될 수 있으므로, 5를 return 합니다.</li>
</ul>
<h1 id="풀이">풀이</h1>
<p>문제를 간단하게 분석하자면 배열에 있는 값 3개를 조합해서 더했을때 0인 개수를 구하는 것입니다. 
삼중 for문으로 인덱스 값을 순서대로 비교해서 3개를 더했을 때 0이 된다면 answer을 더해줍니다.</p>
<ol>
<li><p>인덱스 변수 3개(i, j, k)와 조합한 배열의 값을 더해서 저장하는 변수 sum을 선언합니다.</p>
</li>
<li><p>3중 for문을 돌립니다.
여기서 순서대로 비교해야하기 때문에 i는 0부터, j는 i+1, k는 j+1부터 시작합니다.
첫번째 인덱스 값 i가 마지막 배열 방번호에 와도 두번째 인덱스 값 j는 i+1이고, 배열 길이를 초과하므로 자동으로 for문을 나오게 됩니다.</p>
</li>
<li><p>배열의 i, j, k번째 값을 더했을 때 0이면 answer값을 더해줍니다.</p>
</li>
</ol>
<h1 id="코드">코드</h1>
<pre><code>int solution(int number[], size_t number_len) {
    int answer = 0;
    int i, j, k;
    int sum = 0;
    for (i = 0; i &lt; number_len; i++) {
        for (j = i + 1; j &lt; number_len; j++) {
            for (k = j + 1; k &lt; number_len; k++) {
                sum = number[i] + number[j] + number[k];
                if (sum == 0) {
                    answer++;
                }
            }
        }
    }

    return answer;
}</code></pre><h1 id="마무리">마무리</h1>
<p>복잡한 알고리즘이나 함수를 사용하지 않고, 3중 for문만 사용하면 해결하는 쉬운문제였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 Lv1] 바탕화면 정리-C]]></title>
            <link>https://velog.io/@cindy0817-web/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv1-%EB%B0%94%ED%83%95%ED%99%94%EB%A9%B4-%EC%A0%95%EB%A6%AC-C</link>
            <guid>https://velog.io/@cindy0817-web/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv1-%EB%B0%94%ED%83%95%ED%99%94%EB%A9%B4-%EC%A0%95%EB%A6%AC-C</guid>
            <pubDate>Mon, 06 Mar 2023 13:37:51 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<p>코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다.</p>
<p>컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 wallpaper가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 &quot;.&quot;, 파일이 있는 칸은 &quot;#&quot;의 값을 가집니다. 드래그를 하면 파일들을 선택할 수 있고, 선택된 파일들을 삭제할 수 있습니다. 머쓱이는 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 하며 드래그로 파일들을 선택하는 방법은 다음과 같습니다 .</p>
<ul>
<li><p>드래그는 바탕화면의 격자점 S(lux, luy)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(rdx, rdy)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다. 이때, &quot;점 S에서 점 E로 드래그한다&quot;고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점이라고 표현합니다.</p>
</li>
<li><p>점 S(lux, luy)에서 점 E(rdx, rdy)로 드래그를 할 때, &quot;드래그 한 거리&quot;는 |rdx - lux| + |rdy - luy|로 정의합니다.</p>
</li>
<li><p>점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.</p>
</li>
</ul>
<hr>
<h3 id="제한-사항">제한 사항</h3>
<ul>
<li>1 ≤ wallpaper의 길이 ≤ 50</li>
<li>1 ≤ wallpaper[i]의 길이 ≤ 50</li>
<li>wallpaper의 모든 원소의 길이는 동일합니다.</li>
<li>wallpaper[i][j]는 바탕화면에서 i + 1행 j + 1열에 해당하는 칸의 상태를 나타냅니다.</li>
<li>wallpaper[i][j]는 &quot;#&quot; 또는 &quot;.&quot;의 값만 가집니다.</li>
<li>바탕화면에는 적어도 하나의 파일이 있습니다.</li>
<li>드래그 시작점 (lux, luy)와 끝점 (rdx, rdy)는 lux &lt; rdx, luy &lt; rdy를 만족해야 합니다.</li>
</ul>
<hr>
<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/c3aedd72-ac8e-4254-8398-8b14c0f649aa/image.png" alt=""></p>
<h3 id="입출력-예-설명">입출력 예 설명</h3>
<ul>
<li>예제 2번의 바탕화면은 다음과 같습니다.
<img src="https://velog.velcdn.com/images/cindy0817-web/post/eb489e31-f386-457c-bae9-061a3451e320/image.png" alt=""></li>
</ul>
<p>(1, 3)에서 (5, 8)로 드래그하면 모든 파일을 선택할 수 있고 이보다 적은 이동거리로 모든 파일을 선택하는 방법은 없습니다. 따라서 가장 적은 이동의 드래그로 모든 파일을 선택하는 방법인 [1, 3, 5, 8]을 return합니다.</p>
<hr>
<h2 id="풀이">풀이</h2>
<p>쉽게 생각해서 드래그했을 때 좌측상단의 (X,Y)값과 우측하단의 (X,Y)를 구한다고 생각하면 됩니다. </p>
<ol>
<li><p>좌측 상단 좌표와 우측 하단 좌표를 담을 변수 4개를 준비합니다.</p>
<p> (배열에 #이 있는 경우 인덱스 값이)</p>
</li>
</ol>
<ul>
<li>minX : x값이 가장 작고, 가장 상단에 있는 x값</li>
<li>minY : y값이 가장 작고, 가장 좌측에 있는 y값</li>
<li>maxX : x값이 가장 크고, 가장 하단에 있는 x값</li>
<li>maxY : y값이 가장 크고, 가장 우측에 있는 y값
<img src="https://velog.velcdn.com/images/cindy0817-web/post/1459760d-6682-4d77-aabe-8384be541bec/image.png" alt=""></li>
</ul>
<ol start="2">
<li>배열을 순회하며 minX, minY, maxX, maxY값을 비교해줍니다.</li>
</ol>
<ul>
<li>minX보다 x값이 작으면 x를 minX에 넣어줍니다.</li>
<li>minY보다 y값이 작으면 y를 minY에 넣어줍니다.</li>
<li>maxX보다 x값이 크면 x를 maxX에 넣어줍니다.</li>
<li>maxY보다 y값이 크면 y를 maxY에 넣어줍니다.</li>
</ul>
<ol start="3">
<li>좌측상단의 (minX,minY) 좌표와 우측하단의 (maxX+1,maxY+1) 좌표를 answer 배열에 넣어줍니다.</li>
</ol>
<ul>
<li>좌측 상단의 x,y 좌표는 그대로</li>
<li>우측 하단의 x, y 좌표는 1을 더해줍니다.
드래그를 할 때 원래 인덱스 번호보다 한칸 밑으로 내려가기 때문이죠.</li>
</ul>
<h2 id="코드">코드</h2>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdbool.h&gt;
#include &lt;stdlib.h&gt;

int* solution(const char* wallpaper[], size_t wallpaper_len) {

    // 좌측 상단 y, 우측 하단 y, 좌측 상단 x, 좌측 하단 x
    int minY=50, maxY=0, minX=50, maxX=0;
    int len = strlen(wallpaper[0]);
    int* answer = (int*)malloc(sizeof(1));

    for(int i=0; i&lt;wallpaper_len; i++){
        for(int j=0; j&lt;len; j++){
            if(wallpaper[i][j] == &#39;#&#39;){
                // y축 좌표 j가 minw보다 작으면 minh(좌측상단 y)로
                if(minY &gt; j) minY = j;
                if(maxY &lt; j) maxY = j;
                if(minX &gt; i) minX = i;
                if(maxX &lt; i) maxX = i;
            }
        }
    }

    // 좌측 상단 x,y 좌표는 그대로
    // 우측 하단 x,y 좌표는 1더해줌 (드래그 하면 한칸 밑으로 떨어짐)
    answer[0] = minX;
    answer[1] = minY;
    answer[2] = maxX+1;
    answer[3] = maxY+1;

    return answer;
}
</code></pre><h2 id="마무리">마무리</h2>
<p>문제에서 구하고자 하는 것을 잘 파악하면 쉽게 풀 수 있는 문제였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[COS PRO 2급] 3차 9번_주차장에 몇대가 들어올수 있는거야?]]></title>
            <link>https://velog.io/@cindy0817-web/COS-PRO-2%EA%B8%89-3%EC%B0%A8-9%EB%B2%88%EC%A3%BC%EC%B0%A8%EC%9E%A5%EC%97%90-%EB%AA%87%EB%8C%80%EA%B0%80-%EB%93%A4%EC%96%B4%EC%98%AC%EC%88%98-%EC%9E%88%EB%8A%94%EA%B1%B0%EC%95%BC</link>
            <guid>https://velog.io/@cindy0817-web/COS-PRO-2%EA%B8%89-3%EC%B0%A8-9%EB%B2%88%EC%A3%BC%EC%B0%A8%EC%9E%A5%EC%97%90-%EB%AA%87%EB%8C%80%EA%B0%80-%EB%93%A4%EC%96%B4%EC%98%AC%EC%88%98-%EC%9E%88%EB%8A%94%EA%B1%B0%EC%95%BC</guid>
            <pubDate>Tue, 06 Sep 2022 15:37:04 GMT</pubDate>
            <description><![CDATA[<h1 id="문제설명">문제설명</h1>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/777eb0be-c975-44b7-be50-74fa3e69a1ae/image.png" alt=""></p>
<h1 id="주어진-코드">주어진 코드</h1>
<pre><code>int solution(int day, int numbers[], int numbers_len) {
    int count = 0;
    for(int i = 0; i &lt; numbers_len; i++)
        if(numbers[i]%2 != day%2)
            count++;
    return count;
}</code></pre><h1 id="한줄-수정-후">한줄 수정 후</h1>
<pre><code>int solution(int day, int numbers[], int numbers_len) {
    int count = 0;
    for(int i = 0; i &lt; numbers_len; i++)
        if(numbers[i]%2 == day%2)
            count++;
    return count;
}</code></pre><h1 id="실행-결과">실행 결과</h1>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/34adc5f8-35cc-43ae-b3e7-176d30caf5d2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[COS PRO 2급] 3차 8번_TV 애청자 A씨(C)]]></title>
            <link>https://velog.io/@cindy0817-web/COS-PRO-2%EA%B8%89-3%EC%B0%A8-8%EB%B2%88TV-%EC%95%A0%EC%B2%AD%EC%9E%90-A%EC%94%A8C</link>
            <guid>https://velog.io/@cindy0817-web/COS-PRO-2%EA%B8%89-3%EC%B0%A8-8%EB%B2%88TV-%EC%95%A0%EC%B2%AD%EC%9E%90-A%EC%94%A8C</guid>
            <pubDate>Mon, 05 Sep 2022 15:14:48 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/0084f99b-89d6-40dc-aaa8-b6f10218e5db/image.png" alt=""></p>
<h1 id="완성-코드">완성 코드</h1>
<pre><code>int solution(int programs[][2], int programs_len) {
    int answer = 0;    
    int used_tv[25] = { 0, };

    for(int i = 0; i &lt; programs_len; i++)
        for(int j = programs[i][0]; j &lt; programs[i][1]; j++)
            used_tv[j]++;

    for(int i = 0; i &lt; 25; i++)
        if(used_tv[i] &gt;= 2)
            answer++;

    return answer;
}</code></pre><p>if(used_tv[i] &gt;= 1)
이 코드를 다음과 같이 변경해주자.
if(used_tv[i] &lt;= 2)
TV를 동시에 두대 이상 트는 시간을 알아내야하기 때문에 2로 변경해야한다.</p>
<h1 id="코드해석">코드해석</h1>
<p>가장 중요한 것은 a시부터 b시까지 TV를 틀었다면 b-1시간 틀었다는 것이다.</p>
<ul>
<li>answer : TV를 2대 이상 트는 총 시간을 return 할 변수이다</li>
<li>used_tv : n시에 TV를 몇대 틀었는지 담을 배열이다 (0~24)</li>
<li>중첩 for문
i : 0 ~ programs_len -1
j : programs[i][0] ~ programs[i][1]-1까지 반복</li>
</ul>
<table>
<thead>
<tr>
<th>i</th>
<th>j</th>
<th>used_tv</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>1~5</td>
<td>[1,2,3,4]</td>
</tr>
<tr>
<td>1</td>
<td>3~4</td>
<td>[3,4]</td>
</tr>
<tr>
<td>2</td>
<td>2~7</td>
<td>[2,3,4,5,6]</td>
</tr>
</tbody></table>
<p>used_tv는  [0, 1, 2, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]이다. </p>
<p>used_tv 배열에 2 이상인 요소는 2, 3, 4, 5로 4개이므로
answer은 4이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[COS PRO 2급] 3차 1번_학생의 등수 구하기(C)]]></title>
            <link>https://velog.io/@cindy0817-web/COS-PRO-2%EA%B8%89-3%EC%B0%A8-1%EB%B2%88%ED%95%99%EC%83%9D%EC%9D%98-%EB%93%B1%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0C</link>
            <guid>https://velog.io/@cindy0817-web/COS-PRO-2%EA%B8%89-3%EC%B0%A8-1%EB%B2%88%ED%95%99%EC%83%9D%EC%9D%98-%EB%93%B1%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0C</guid>
            <pubDate>Fri, 02 Sep 2022 01:53:42 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/2f4caa5f-94df-4bbb-b00c-799792c650df/image.png" alt=""></p>
<hr>
<h1 id="완성-코드">완성 코드</h1>
<pre><code>include &lt;stdio.h&gt;
#include &lt;stdbool.h&gt;
#include &lt;stdlib.h&gt;

int compare(const void *a, const void *b){
    return ( *(int*)b - *(int*)a );
}

int func_a(int scores[], int scores_len, int score){
    for(int rank = 0; rank &lt; scores_len; rank++)
        if(scores[rank] == score)
            return rank + 1;
    return 0;
}

void func_b(int arr[], int arr_len){
    qsort(arr, arr_len, sizeof(int), compare);
}

int func_c(int arr[], int n){
    return arr[n];
}
int solution(int scores[], int scores_len, int n) {
    int score = func_c(scores, n);
    func_b(scores, scores_len);
    int answer = func_a(scores, scores_len, score);
    return answer;
}
int main() {
    int scores[4] ={20, 60, 98, 59};
    int scores_len = 4;
    int n = 3;
    int ret = solution(scores, scores_len, n);

    printf(&quot;solution 함수의 반환 값은 %d 입니다.\n&quot;, ret);
}
</code></pre><h1 id="실행결과">실행결과</h1>
<p><img src="https://velog.velcdn.com/images/cindy0817-web/post/8b3127c1-cf3a-41a2-a9f3-760f3154a851/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>