<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yurim-ai.log</title>
        <link>https://velog.io/</link>
        <description>LLM 활용하여 실서비스를 만드는 개발자</description>
        <lastBuildDate>Fri, 18 Oct 2024 06:50:50 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yurim-ai.log</title>
            <url>https://velog.velcdn.com/images/yurim-ai/profile/02571b9b-c9b9-436b-aa92-31883d9fd07a/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yurim-ai.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yurim-ai" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[React query - useQuery]]></title>
            <link>https://velog.io/@yurim-ai/React-query-useQuery</link>
            <guid>https://velog.io/@yurim-ai/React-query-useQuery</guid>
            <pubDate>Fri, 18 Oct 2024 06:50:50 GMT</pubDate>
            <description><![CDATA[<p>부제 : useQuery 에서 어떻게 캐싱이 될까? </p>
<h1 id="usequery">useQuery?</h1>
<ul>
<li>useQuery는 React Query에서 제공하는 가장 중요한 훅 중 하나</li>
<li>비동기 데이터 fetching, 캐싱, 업데이트 및 재시도 로직을 매우 효율적으로 처리할 수 있게 해줍니다. 즉, useQuery는 서버에서 데이터를 가져오는 과정을 관리하면서, 개발자가 일일이 처리해야 할 로직을 간편하게 해결해주는 역할을 합니다.</li>
</ul>
<h3 id="usequery의-주요-역할">useQuery의 주요 역할:</h3>
<ol>
<li>데이터 fetching 관리
useQuery는 지정된 queryFn(쿼리 함수)을 실행하여 서버로부터 데이터를 가져옵니다. 이를 통해 REST API, GraphQL, 또는 다른 비동기 데이터 소스를 쉽게 호출할 수 있습니다.</li>
</ol>
<pre><code>const { data, isLoading, error } = useQuery([&#39;posts&#39;], fetchPosts)</code></pre><ol start="2">
<li><p>캐싱
useQuery는 가져온 데이터를 자동으로 캐시에 저장합니다. 동일한 쿼리 키를 사용하여 동일한 데이터를 요청하면, 서버로 새로운 요청을 보내지 않고 캐시된 데이터를 즉시 반환합니다. 이를 통해 서버 요청 횟수를 줄이고 성능을 최적화할 수 있습니다.</p>
</li>
<li><p>데이터의 자동 업데이트
useQuery는 캐시된 데이터가 일정 시간이 지나거나 데이터가 변경될 때 자동으로 다시 데이터를 가져와 최신 상태로 업데이트합니다. 이를 stale-while-revalidate 패턴이라고 합니다. 예를 들어, staleTime이 지나면 캐시된 데이터가 오래된 것으로 간주되고, 다시 데이터를 가져옵니다.</p>
</li>
<li><p>자동 재시도
useQuery는 네트워크 에러 등으로 인해 데이터 가져오기가 실패했을 때, 자동으로 재시도(retry)를 수행합니다. 기본적으로 3번까지 재시도하며, 이 동작은 설정에 따라 조정할 수 있습니다.</p>
<pre><code>const { data, isError } = useQuery([&#39;posts&#39;], fetchPosts, {
retry: 2 // 최대 2번까지 재시도
})</code></pre></li>
<li><p>로딩 상태 및 에러 관리
useQuery는 로딩 상태, 에러 상태, 성공 상태 등의 상태를 관리할 수 있습니다. 이를 통해 로딩 스피너를 보여주거나, 에러 발생 시 에러 메시지를 출력하는 등의 처리를 쉽게 할 수 있습니다.</p>
<pre><code>const { data, isLoading, isError } = useQuery([&#39;posts&#39;], fetchPosts)
</code></pre></li>
</ol>
<p>if (isLoading) return <div>Loading...</div>
if (isError) return <div>Error occurred</div></p>
<pre><code>
6. 쿼리 키를 통한 캐싱 및 데이터 식별
queryKey는 각 쿼리의 고유 식별자 역할을 합니다. queryKey에 따라 캐시를 구분하며, 동일한 queryKey를 가진 쿼리는 동일한 캐시 데이터를 공유합니다.</code></pre><p>const { data } = useQuery([&#39;posts&#39;, userId], () =&gt; fetchPosts(userId))</p>
<pre><code>
7. 수동 데이터 갱신 (refetch)
필요에 따라 데이터를 수동으로 다시 가져올 수 있도록 refetch 함수를 제공합니다. 이 기능은 데이터가 사용자 상호작용에 의해 갱신되어야 할 때 유용합니다.</code></pre><p>const { data, refetch } = useQuery([&#39;posts&#39;], fetchPosts)
&lt;button onClick={() =&gt; refetch()}&gt;Refetch Data</button></p>
<pre><code>
8. 의존성 기반의 데이터 fetching (enabled 옵션)
특정 조건이 충족될 때만 쿼리를 실행하도록 제어할 수 있습니다. 이를 위해 enabled 옵션을 사용하며, 주로 다른 상태 값에 따라 쿼리를 실행하거나 멈추고 싶을 때 사용됩니다.</code></pre><p>const { data } = useQuery([&#39;posts&#39;], fetchPosts, {
  enabled: isUserLoggedIn, // isUserLoggedIn이 true일 때만 쿼리 실행
})</p>
<pre><code>
9. 배경 동기화
useQuery는 백그라운드에서 데이터를 지속적으로 동기화할 수 있습니다. 이를 통해 실시간으로 데이터를 최신 상태로 유지할 수 있습니다.</code></pre><p>const { data } = useQuery([&#39;posts&#39;], fetchPosts, {
  refetchInterval: 60000, // 60초마다 데이터를 다시 가져옴
})</p>
<pre><code>
### useQuery를 사용한 기본 예시:</code></pre><p>import { useQuery } from &#39;@tanstack/react-query&#39;</p>
<p>const fetchPosts = async () =&gt; {
  const response = await fetch(&#39;<a href="https://jsonplaceholder.typicode.com/posts&#39;">https://jsonplaceholder.typicode.com/posts&#39;</a>)
  if (!response.ok) throw new Error(&#39;Network response was not ok&#39;)
  return response.json()
}</p>
<p>const Posts = () =&gt; {
  const { data, isLoading, isError, error } = useQuery([&#39;posts&#39;], fetchPosts)</p>
<p>  if (isLoading) return <div>Loading...</div>
  if (isError) return <div>Error: {error.message}</div></p>
<p>  return (
    <ul>
      {data.map((post) =&gt; (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  )
}</p>
<p>export default Posts</p>
<pre><code>### 요약
**useQuery**는 비동기 데이터를 가져오고, 캐시하고, 관리하는 모든 작업을 간편하게 처리해 줍니다.
캐싱과 자동 재시도, 자동 갱신 같은 기능을 제공해 서버 데이터와의 동기화를 쉽게 유지할 수 있습니다.
상태 관리를 통해 로딩, 에러, 성공 상태를 적절히 관리할 수 있습니다.
수동 데이터 갱신, 배경 동기화 등 다양한 옵션을 제공하여 데이터 fetching을 정교하게 제어할 수 있습니다.
이를 통해 효율적으로 비동기 데이터를 관리하고, 코드의 복잡성을 줄일 수 있습니다.


## 컴포넌트를 호출하면 useQuery 가 호출되서 fetching 된다는 거지? 
맞습니다! useQuery 훅을 사용한 컴포넌트를 호출하면 해당 컴포넌트가 렌더링될 때 자동으로 useQuery가 실행되고, 데이터를 fetching합니다. React Query가 비동기 함수(queryFn)를 실행해서 데이터를 가져오고, 그 결과를 컴포넌트 내에서 사용할 수 있게 되는 구조입니다.


## useQuery는 언제 실행돼?
useQuery는 다음과 같은 경우에 자동으로 실행됩니다:

1. 컴포넌트가 처음 마운트될 때
컴포넌트가 렌더링될 때, 즉 컴포넌트가 DOM에 처음 추가되면 useQuery가 자동으로 실행됩니다.
이때 지정된 queryFn 함수가 호출되어 데이터를 fetching합니다.</code></pre><p>const { data, isLoading } = useQuery([&#39;posts&#39;], fetchPosts)</p>
<pre><code>2. queryKey가 변경될 때
queryKey는 React Query에서 쿼리를 구별하고, 데이터를 캐싱하는 데 사용됩니다. queryKey가 변경되면 React Query는 이 변화를 감지하고, 자동으로 데이터를 다시 fetching합니다.
예를 들어, queryKey에 userId가 포함되어 있을 때, userId가 변경되면 useQuery는 다시 실행됩니다:</code></pre><p>const { data, isLoading } = useQuery([&#39;user&#39;, userId], () =&gt; fetchUser(userId))</p>
<pre><code>userId가 변경되면 React Query는 이 쿼리가 새로운 데이터라고 판단하고 다시 데이터를 가져옵니다.

3. 캐시된 데이터가 만료(stale)되었을 때
React Query는 캐시된 데이터를 유지하면서 staleTime이라는 설정을 통해 데이터를 새로 가져올 시점을 결정합니다.
staleTime이 지나면 캐시된 데이터가 &quot;stale(낡음)&quot; 상태로 간주되고, 데이터가 만료되면 다시 fetching이 자동으로 실행됩니다.</code></pre><p>const { data } = useQuery([&#39;posts&#39;], fetchPosts, { staleTime: 10000 })
이 예에서는 10초가 지나면 캐시된 데이터가 만료되고, 쿼리가 다시 실행됩니다.</p>
<pre><code>
4. 페이지를 다시 포커싱할 때
기본적으로 React Query는 페이지가 다시 포커싱될 때 (즉, 사용자가 페이지를 떠났다가 다시 돌아왔을 때) 자동으로 데이터를 새로 fetching합니다. 이 기능은 최신 데이터를 유지하기 위해 유용합니다.</code></pre><p>const { data } = useQuery([&#39;posts&#39;], fetchPosts)</p>
<pre><code>사용자가 탭을 이동했다가 다시 돌아오면 useQuery가 다시 실행됩니다.

5. 네트워크가 재연결될 때
네트워크 연결이 끊겼다가 다시 연결될 때에도 useQuery는 자동으로 실행되어 데이터를 다시 fetching합니다.

6. refetch를 수동으로 호출할 때
필요에 따라 데이터를 다시 가져오고 싶다면, refetch 함수를 수동으로 호출할 수 있습니다. useQuery는 이 함수가 호출될 때마다 쿼리를 다시 실행합니다.</code></pre><p>const { data, refetch } = useQuery([&#39;posts&#39;], fetchPosts)</p>
<p>return &lt;button onClick={() =&gt; refetch()}&gt;Refetch Data</button></p>
<pre><code>
7. 의존성 옵션인 enabled가 true로 변경될 때
useQuery는 enabled 옵션을 통해 언제 쿼리를 실행할지 제어할 수 있습니다. 이 값이 false였다가 true로 변경되면 쿼리가 실행됩니다.</code></pre><p>const { data } = useQuery([&#39;posts&#39;], fetchPosts, { enabled: isUserLoggedIn })</p>
<pre><code>isUserLoggedIn 값이 true가 되면 useQuery가 실행됩니다.

### 요약:
- 컴포넌트가 처음 렌더링될 때 (DOM에 추가될 때)
- queryKey가 변경될 때
- 캐시된 데이터가 만료(stale) 상태일 때
- 페이지가 다시 포커싱될 때
- 네트워크가 다시 연결될 때
- 수동으로 refetch를 호출할 때
- enabled 옵션이 true로 변경될 때
이런 다양한 시점에서 useQuery는 데이터를 다시 가져오며, 이 과정을 통해 최신 데이터를 유지할 수 있습니다.


## 꼭 파라미터만 query key 에 넣을수있엉 ?

queryKey에 꼭 파라미터만 넣을 필요는 없습니다. queryKey는 React Query에서 캐싱과 데이터를 구별하기 위한 고유 식별자로 사용되며, 단순히 파라미터뿐만 아니라 모든 값을 포함할 수 있습니다. queryKey는 배열이나 문자열, 또는 객체로 구성할 수 있습니다.

### ex) query key 가 1 을 호출했어 그러고 2를 호출해 그리고 다시 1을 호출해 
그러면 이미 캐싱이 되어있잖아 1 이 
근데 db 상에서는 캐시가 1인 데이터가 바껴있어 
그러면 1이 이미 캐싱되어잇기때매 재호출안해 ? 

- 좋은 질문입니다! React Query는 캐싱된 데이터를 사용하는데, 이를 최신 상태로 유지하기 위한 여러 가지 방법을 제공합니다. queryKey가 &quot;1&quot;인 데이터를 다시 호출했을 때, 캐시된 데이터를 바로 사용하긴 하지만, 데이터가 업데이트되었을 가능성을 대비해 재호출이 필요한 상황에서는 데이터를 자동으로 다시 fetching할 수 있습니다.

### React Query가 캐시된 데이터를 관리하는 방식:

1. 캐시된 데이터 사용:

queryKey가 &quot;1&quot;인 쿼리는 이미 캐싱된 데이터가 있기 때문에 바로 캐싱된 데이터를 사용합니다. 이렇게 하면 빠르게 UI를 업데이트할 수 있습니다.

2. staleTime:

React Query는 **staleTime**이라는 설정을 통해 데이터를 얼마나 오래 &quot;신선한 상태&quot;로 유지할지 결정할 수 있습니다. staleTime이 지나면 데이터는 &quot;stale&quot; 상태가 되고, React Query는 자동으로 다시 데이터를 fetching할 수 있습니다.
기본적으로 staleTime은 0으로 설정되어 있기 때문에, 데이터를 캐시에서 사용하더라도 곧바로 다시 fetching하여 최신 데이터를 가져옵니다.</code></pre><p>const { data } = useQuery(&#39;1&#39;, fetchData, { staleTime: 5000 }) // 5초 동안 </p>
<pre><code>캐시된 데이터가 유효
위 예시에서는 5초 동안 캐시된 데이터가 신선한 것으로 간주되며, 그 후에는 다시 fetching이 이루어집니다.

3. 페이지 포커스 시 자동 fetching:

React Query는 페이지가 다시 포커스될 때(사용자가 다른 탭으로 갔다가 돌아왔을 때) 캐시된 데이터가 stale 상태가 아니더라도 자동으로 다시 fetching하여 최신 데이터를 가져옵니다. 이 기능은 기본으로 활성화되어 있습니다.</code></pre><p>const { data } = useQuery(&#39;1&#39;, fetchData, { refetchOnWindowFocus: true })</p>
<pre><code>
4. 수동으로 데이터를 다시 fetching:

만약 데이터가 바뀌었다는 것을 알고 있거나, 강제로 다시 fetching하고 싶다면 refetch 함수를 호출할 수 있습니다.</code></pre><p>const { data, refetch } = useQuery(&#39;1&#39;, fetchData)</p>
<p>// 수동으로 refetch 호출
&lt;button onClick={() =&gt; refetch()}&gt;다시 불러오기</button></p>
<pre><code>
5. 데이터가 바뀌었다는 것을 감지하는 전략 (onSuccess나 onSettled):

서버에서 데이터를 가져온 후 onSuccess나 onSettled와 같은 옵션을 통해 데이터를 갱신했는지 확인할 수 있습니다.
onSuccess 콜백은 데이터 fetching이 성공적으로 완료된 후 실행되며, 이를 통해 추가적인 로직을 처리할 수 있습니다.

### 그럼 staleTime 이걸 설정안하면 사실상 캐싱되는 데이터가 없는거네 ?

- 아니요, staleTime을 설정하지 않아도 데이터는 여전히 캐싱됩니다. 하지만 기본 설정에서 캐시된 데이터가 즉시 stale 상태가 됩니다. 즉, **데이터는 캐싱되지만, 캐시된 데이터를 바로 stale(낡음)으로 간주하고 최신 데이터를 서버에서 다시 fetching**하게 됩니다.

#### staleTime을 설정하지 않았을 때의 동작:
1. 데이터 캐싱: useQuery는 기본적으로 모든 데이터를 캐싱합니다. 하지만 staleTime이 기본값인 0일 경우, 캐시된 데이터는 즉시 &quot;stale&quot; 상태로 간주됩니다.
3. stale 상태: 캐시된 데이터가 stale 상태일 때, React Query는 컴포넌트가 마운트되거나 페이지가 포커스될 때마다 자동으로 최신 데이터를 다시 fetching합니다.
3. 캐시된 데이터 사용: stale 상태의 캐시 데이터는 여전히 사용됩니다. 즉, **서버로부터 새 데이터를 받아오기 전에 캐시된 데이터를 먼저 화면에 보여주지만, 곧바로 새로운 데이터를 가져오는 요청을 동시에 시작**합니다.

## 그러니까 캐시된 데이터를 화면에 먼저 표시해놓고 서버에서 가져오는게 뭐가 좋은거야 ?? 

캐시된 데이터를 먼저 화면에 표시하고, 동시에 서버에서 최신 데이터를 가져오는 방식은 사용자 경험(UX)을 개선하고, 성능 최적화 측면에서 여러 가지 이점이 있습니다. 다음은 이러한 방식이 좋은 이유입니다:

1. 빠른 응답 시간으로 사용자 경험 향상
캐시된 데이터를 사용하면, 사용자가 페이지를 열었을 때 서버 응답을 기다리지 않고 즉시 화면에 데이터를 표시할 수 있습니다. 서버에서 최신 데이터를 받아오는 동안 사용자에게는 이미 화면에 데이터가 보이기 때문에 앱이 더 빠르고 응답성 있게 느껴집니다.
서버 요청에 시간이 걸리는 경우에도 사용자는 기다림 없이 기존 데이터를 먼저 확인할 수 있습니다.
예시:
**쇼핑몰 사이트에서 제품 리스트를 보다가 새로고침을 하면, 이전에 본 제품 리스트가 바로 표시되고, 최신 재고 상태나 가격은 나중에 서버에서 업데이트**됩니다.
**사용자 입장에서는 페이지 로딩 시간이 거의 느껴지지 않음**.
최신 정보가 필요할 경우에만 백그라운드에서 자동으로 데이터가 업데이트.

2. 네트워크 지연에 대한 완화
네트워크 상태가 불안정하거나 서버 응답 시간이 길어지더라도, 캐시된 데이터를 보여주면 사용자가 빈 화면을 보지 않게 됩니다.
서버에서 최신 데이터를 받는 데 시간이 걸리더라도, 캐시된 데이터를 통해 중간 경험을 제공함으로써, 사용자가 더 나은 경험을 하게 됩니다.
예시:
모바일 데이터가 느리거나 와이파이 연결이 약한 경우, 캐시된 데이터를 먼저 보여주면, 사용자는 일단 화면이 로드되었다고 인식합니다. 최신 데이터가 곧 업데이트되면, 사용자는 성능 문제를 크게 느끼지 않게 됩니다.

3. 데이터 변동이 적은 경우 캐시가 유용
만약 데이터가 자주 변하지 않는 경우, 캐시된 데이터를 사용하는 것이 더 효율적입니다.
자주 변하지 않는 데이터를 서버에서 매번 불러오는 대신, 캐시를 사용하여 네트워크 요청을 줄이고 성능을 최적화할 수 있습니다.
예시:
사용자의 프로필 정보나 설정과 같은 데이터는 자주 변하지 않기 때문에, 캐시된 데이터를 먼저 보여주고, 서버에서 최신 정보가 있는지 확인하는 방식이 적합합니다.

4. 네트워크 요청을 줄여 성능 최적화
캐시를 사용하면 불필요한 네트워크 요청을 줄일 수 있습니다. 예를 들어, 사용자가 자주 방문하는 페이지나 기능에서 동일한 데이터를 반복적으로 요청하는 대신, 캐시된 데이터를 재사용할 수 있습니다.
이로 인해 서버 부하가 줄어들고, 앱 성능이 전반적으로 향상됩니다.
예시:
사용자가 같은 리스트를 여러 번 확인할 때마다 매번 서버에 요청하지 않고, 캐시된 데이터를 먼저 제공하면, 네트워크 비용을 절감하고 서버의 부하를 줄일 수 있습니다.

5. 점진적 데이터 업데이트로 사용자 경험 부드럽게 유지
캐시된 데이터를 먼저 보여준 뒤, 서버에서 최신 데이터를 가져오면, 사용자가 느끼는 변경 사항이 더 부드럽게 이루어집니다. 서버 데이터를 기다리느라 화면이 계속 로딩 상태에 머무르지 않고, 사용자는 화면을 바로 사용할 수 있고, 그동안 백그라운드에서 데이터를 업데이트하면 됩니다.
데이터가 업데이트되면 화면을 부드럽게 갱신함으로써 사용자 경험을 자연스럽게 유지할 수 있습니다.
예시:
뉴스 앱에서 캐시된 기사 목록을 먼저 보여준 후, 최신 기사를 백그라운드에서 가져오는 경우, 사용자는 기다림 없이 앱을 탐색할 수 있으며, 기사가 업데이트될 때 자연스럽게 새로운 정보가 화면에 표시됩니다.

6. 오프라인 모드 지원
캐시된 데이터를 활용하면 오프라인 상태에서도 일부 기능을 사용할 수 있습니다. 네트워크 연결이 없을 때도 캐시에 저장된 데이터를 이용해 일시적인 오프라인 경험을 제공할 수 있습니다.
예시:
사용자가 비행기 모드로 전환되었을 때도, 이전에 불러왔던 콘텐츠가 캐시에서 보여지므로 오프라인 상태에서도 앱을 사용할 수 있습니다.

#### 요약:
- 빠른 화면 로딩: 캐시된 데이터를 먼저 보여줌으로써 사용자는 기다림 없이 콘텐츠를 확인할 수 있습니다.
- 네트워크 문제 완화: 서버 응답이 느리거나 네트워크 연결이 불안정할 때도 캐시를 통해 즉시 응답성 있는 경험을 제공합니다.
- 성능 최적화: 불필요한 네트워크 요청을 줄여 성능을 개선하고, 서버 부하를 줄입니다.
- 오프라인 지원: 캐시를 통해 네트워크 연결 없이도 일정 부분 기능을 제공할 수 있습니다.

이런 이유로, 캐시된 데이터를 먼저 사용하고 서버에서 최신 데이터를 가져오는 방식은 사용자 경험을 개선하고 성능을 최적화하는 데 매우 유용합니다.

## 결론
#### 부제: staleTime 설정 없이 useQuery 는 어떻게 동작하냐면
1. staleTime 설정이 없다는것은 데이터의 신선시간을 설정하지 않았다라는 것이다.
2. fetching 후 데이터는 즉시 stale(낡음)처리가 된다. 
3. 컴포넌트가 호출되어서 useQuery 가 호출되면 다시 서버에서 데이터를 fetching 한다.
4. staleTime 없이도 데이터는 캐싱이 되어서 서버에서 가져오는 동안 캐싱된 데이터를 보여주고 데이터를 가져온 순간 교체된다.
5. 캐싱이 된 데이터를 쓰는것의 장점은 사용자가 기다리지 않아 사용자의 경험이 향상된다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[재택근무하면서 회사 내부망에 어떻게 접근하는걸까 ?]]></title>
            <link>https://velog.io/@yurim-ai/%EC%9E%AC%ED%83%9D%EA%B7%BC%EB%AC%B4%ED%95%98%EB%A9%B4%EC%84%9C-%ED%9A%8C%EC%82%AC-%EB%82%B4%EB%B6%80%EB%A7%9D%EC%97%90-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%A0%91%EA%B7%BC%ED%95%98%EB%8A%94%EA%B1%B8%EA%B9%8C</link>
            <guid>https://velog.io/@yurim-ai/%EC%9E%AC%ED%83%9D%EA%B7%BC%EB%AC%B4%ED%95%98%EB%A9%B4%EC%84%9C-%ED%9A%8C%EC%82%AC-%EB%82%B4%EB%B6%80%EB%A7%9D%EC%97%90-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%A0%91%EA%B7%BC%ED%95%98%EB%8A%94%EA%B1%B8%EA%B9%8C</guid>
            <pubDate>Thu, 14 Dec 2023 08:48:46 GMT</pubDate>
            <description><![CDATA[<p>vpn 원리</p>
<p>목적: 재택근무하면서 회사 내부망의 회사의 server 에 접근하고 싶다.</p>
<ol>
<li>집에다가 vpn client 를 깔게되면 회사네트워크와 집간에 터널링이 되며 회사 ip 를 하나 할당 받게된다.</li>
<li>데이터 패킷에다가 outer ip , inner ip 두개를 감싸서 던진다.</li>
<li>먼저 inner ip 에는 보내는곳:  할당받은 회사ip , 받는곳 : 회사서버  </li>
<li>먼저 outer ip 는 보내는곳 : 진짜 할당받은 우리집 , 받는곳: 회사 게이트웨이 ip 로 감싼다.</li>
<li>이 데이터 패킷이 인터넷을 돌아다닌다</li>
<li>터널링한 회사 게이트 웨이에 이 패킷이 닿으면 암호화된 패킷을 복호화한다.</li>
<li>그러면 inner ip 에 있는 할당된 회사 ip 에서 회사 서버에 접속할수있게 된다.</li>
<li>그러면 회사 보안정책을 해치지않고 접속이 가능하다.</li>
</ol>
<p>출처 :<a href="https://www.youtube.com/watch?v=Q0EgiHhw-E4&amp;list=PLXvgR_grOs1BkUIxKsLEUdefyMWMA0_U-&amp;index=4">https://www.youtube.com/watch?v=Q0EgiHhw-E4&amp;list=PLXvgR_grOs1BkUIxKsLEUdefyMWMA0_U-&amp;index=4</a>
최고 ..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 디버깅 vscode ]]></title>
            <link>https://velog.io/@yurim-ai/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%94%94%EB%B2%84%EA%B9%85-vscode</link>
            <guid>https://velog.io/@yurim-ai/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%94%94%EB%B2%84%EA%B9%85-vscode</guid>
            <pubDate>Tue, 05 Dec 2023 03:50:53 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yurim-ai/post/8fb56673-4423-4023-9b9c-2fa5c77dc201/image.png" alt=""></p>
<p>debugger; 을 궁금한 소스코드에 삽입</p>
<p>개발자도구 source 탭에서 변수 확인</p>
<p><img src="https://velog.velcdn.com/images/yurim-ai/post/f4ff415e-f46e-4e5a-ab46-ec4004739b30/image.png" alt=""></p>
<ol>
<li>이 상태에서 위의 파란 버튼을 누르면 debugger라는 구문이 밑에 또 있지 않는 한 그냥 끝까지 실행한다.만약 실행하다가 또 다른 debugger문장이 있으면 그 자리에서 다시 멈춰선다.</li>
</ol>
<ol start="2">
<li>파란버튼 오른쪽에 버튼은 &quot;Step over next function call&quot;, 즉 다음 함수 구문으로 넘어가는 버튼이다.아까 위의 상태에서 저 버튼을 누르면 다음과 같이 진행된다.</li>
</ol>
<p>출처 :
<a href="https://im-developer.tistory.com/84">https://im-developer.tistory.com/84</a>
<a href="https://ko.javascript.info/debugging-chrome">https://ko.javascript.info/debugging-chrome</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[next js폴더 구조 ]]></title>
            <link>https://velog.io/@yurim-ai/next-js%ED%8F%B4%EB%8D%94-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@yurim-ai/next-js%ED%8F%B4%EB%8D%94-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Wed, 29 Nov 2023 02:02:27 GMT</pubDate>
            <description><![CDATA[<p>next.js를 사용하면서 폴더 구조를 잡는 방법은 여러 가지가 있지만, 일반적으로는 프로젝트의 크기와 구조에 따라 달라질 수 있습니다. 그러나 일반적인 구조는 다음과 같습니다.</p>
<ol>
<li>pages 폴더</li>
</ol>
<ul>
<li>각각의 URL 경로에 해당하는 React 컴포넌트가 들어있습니다. 예를 들어, &#39;pages/index.js&#39;는 홈페이지를 구성하는 컴포넌트를 포함합니다.</li>
</ul>
<ol start="2">
<li>components 폴더</li>
</ol>
<ul>
<li>공통적으로 사용되는 UI 컴포넌트가 들어있습니다. 예를 들어, &#39;components/Button.js&#39;는 여러 페이지에서 사용되는 버튼 컴포넌트를 포함합니다.</li>
</ul>
<ol start="3">
<li>lib 폴더</li>
</ol>
<ul>
<li>다양한 유틸리티 함수, 상수, API 호출 등과 같은 것들이 들어있습니다. 예를 들어, &#39;lib/api.js&#39;는 서버에서 데이터를 가져오는 API 호출을 담당하는 함수를 포함합니다.</li>
</ul>
<ol start="4">
<li>styles 폴더</li>
</ol>
<ul>
<li>전역적으로 적용되는 스타일 파일이 들어있습니다. 예를 들어, &#39;styles/global.css&#39;는 전체 웹 사이트에서 적용되는 CSS 스타일을 포함합니다.</li>
</ul>
<ol start="5">
<li>public 폴더</li>
</ol>
<ul>
<li>정적 파일 (이미지, favicon 등)이 들어있습니다.</li>
</ul>
<p>또한, 컴포넌트의 구조는 다음과 같은 Atomic Design 방식을 사용할 수 있습니다.</p>
<ol>
<li>Atoms</li>
</ol>
<ul>
<li>UI의 기본적인 블록으로서, 버튼, 텍스트, 아이콘 등과 같은 작은 컴포넌트를 의미합니다.</li>
</ul>
<ol start="2">
<li>Molecules</li>
</ol>
<ul>
<li>Atom들을 결합한 것으로서, 검색창이나 로그인 폼 등과 같은 상대적으로 복잡한 컴포넌트를 의미합니다.</li>
</ul>
<ol start="3">
<li>Organisms</li>
</ol>
<ul>
<li>Molecule들과 Atom들을 결합한 것으로서, 헤더나 푸터 등과 같은 전체 페이지의 레이아웃을 의미합니다.</li>
</ul>
<ol start="4">
<li>Templates</li>
</ol>
<ul>
<li>페이지 레이아웃을 정의하는데 사용되는, 여러 개의 Organisms와 Molecules를 결합한 것을 의미합니다.</li>
</ul>
<ol start="5">
<li>Pages</li>
</ol>
<ul>
<li>실제로 사용자가 볼 수 있는 웹 페이지를 의미합니다. Template을 사용하여 구성되며, 필요한 데이터와 기능을 갖추고 있습니다.</li>
</ul>
<p>위와 같은 구조를 사용하면, 각 컴포넌트가 담당하는 역할을 명확히 구분할 수 있으며, 코드의 유지보수가 쉬워질 수 있습니다.</p>
<p>너무 도움이 되어서 메묘 ,,, 
gpt ㄴㅓ 천재냐,, </p>
<p>출처: 
<a href="https://careerly.co.kr/qnas/594">https://careerly.co.kr/qnas/594</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스토리북 런( npm run storybook ) 안됨]]></title>
            <link>https://velog.io/@yurim-ai/%EC%8A%A4%ED%86%A0%EB%A6%AC%EB%B6%81-%EB%9F%B0-npm-run-storybook-%EC%95%88%EB%90%A8</link>
            <guid>https://velog.io/@yurim-ai/%EC%8A%A4%ED%86%A0%EB%A6%AC%EB%B6%81-%EB%9F%B0-npm-run-storybook-%EC%95%88%EB%90%A8</guid>
            <pubDate>Fri, 13 Oct 2023 01:57:41 GMT</pubDate>
            <description><![CDATA[<pre><code>
Error: Failed to load static files, no such directory: ./.storybook/public
Make sure this directory exists, or omit the -s (--static-dir) option.</code></pre><p>당신이 프로젝트 깃 클론 받은 후 
npm install 하여 의존성 패키지 설치했는데 
npm run storybook 에서 이런 에러가 난다면 ,,?</p>
<p>단순히 .stotybook 경로에 public 이라는 폴더를 생성해주면된다.!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ssh key 두개인 상태에서 로컬의 폴더를 원격 저장소랑 연결하기 ]]></title>
            <link>https://velog.io/@yurim-ai/ssh-key-%EB%91%90%EA%B0%9C%EC%9D%B8-%EC%83%81%ED%83%9C%EC%97%90%EC%84%9C-%EB%A1%9C%EC%BB%AC%EC%9D%98-%ED%8F%B4%EB%8D%94%EB%A5%BC-%EC%9B%90%EA%B2%A9-%EC%A0%80%EC%9E%A5%EC%86%8C%EB%9E%91-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yurim-ai/ssh-key-%EB%91%90%EA%B0%9C%EC%9D%B8-%EC%83%81%ED%83%9C%EC%97%90%EC%84%9C-%EB%A1%9C%EC%BB%AC%EC%9D%98-%ED%8F%B4%EB%8D%94%EB%A5%BC-%EC%9B%90%EA%B2%A9-%EC%A0%80%EC%9E%A5%EC%86%8C%EB%9E%91-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 25 Sep 2023 11:06:02 GMT</pubDate>
            <description><![CDATA[<p>ssh key 두개인 상태에서 로컬의 폴더를 원격 저장소랑 연결하기 </p>
<p>잘못연결해서 검색해서 들어오셨다구요 ?
그럼 이명령어를 치세요 </p>
<pre><code>git remote remove origin</code></pre><ol>
<li><p>먼저 연결을 원하는 계정 들어가서 repository 생성한다. </p>
</li>
<li><p>연결하는 명령어 친다. </p>
<pre><code>git remote add orgin git@[sshconfig에 등록해둔 HOST]:[깃아이디]/[레파지토리이름].git
</code></pre></li>
</ol>
<p>// 예시
git remote add orgin <a href="mailto:git@github.com">git@github.com</a>:yurim-hgr/reactReview.git</p>
<pre><code>
3. 확인</code></pre><p>git remote -v</p>
<pre><code>

4. 브랜치 생성</code></pre><p>git branch -M main</p>
<pre><code>
5. 원격 저장소에 push 하기</code></pre><p>git push -u origin main</p>
<p>```</p>
<p>자꾸까먹어서 쓰는글 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 프로그래머스 | JS ] 삼각형의 완성 조건(2)]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-%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/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-%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>Mon, 10 Apr 2023 10:10:54 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<p>선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.</p>
<p>가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.</p>
<h2 id="제한사항">제한사항</h2>
<p>sides의 원소는 자연수입니다.
sides의 길이는 2입니다.
1 ≤ sides의 원소 ≤ 1,000</p>
<h3 id="입출력-예">입출력 예</h3>
<p>sides    result
[1, 2]    1
[3, 6]    5
[11, 7]    13</p>
<h4 id="입출력-예-설명">입출력 예 설명</h4>
<h4 id="입출력-예-1">입출력 예 #1</h4>
<p>두 변이 1, 2 인 경우 삼각형을 완성시키려면 나머지 한 변이 2여야 합니다. 따라서 1을 return합니다.</p>
<h4 id="입출력-예-2">입출력 예 #2</h4>
<p>가장 긴 변이 6인 경우
될 수 있는 나머지 한 변은 4, 5, 6 로 3개입니다.
나머지 한 변이 가장 긴 변인 경우
될 수 있는 한 변은 7, 8 로 2개입니다.
따라서 3 + 2 = 5를 return합니다.</p>
<h5 id="입출력-예-3">입출력 예 #3</h5>
<p>가장 긴 변이 11인 경우
될 수 있는 나머지 한 변은 5, 6, 7, 8, 9, 10, 11 로 7개입니다.
나머지 한 변이 가장 긴 변인 경우
될 수 있는 한 변은 12, 13, 14, 15, 16, 17 로 6개입니다.
따라서 7 + 6 = 13을 return합니다.</p>
<h3 id="내코드">내코드</h3>
<pre><code>function solution(sides) {
    var answer = 0;
    let max1 = Math.max(sides[0], sides[1]);
    let min1 = Math.min(sides[0], sides[1]);

    let max = sides[0]+sides[1] -1;

    let x;
    // 나머지한변이 긴변인 경우 
    answer += max -max1

    //가장긴변이 둘중에 하나일경우 max1 일경우 
    for(let i = max1 ; i&gt; 0 ;i--){
        // console.log(i, min1 , max1)
        if(i+min1 &gt; max1){
            answer +=1;
        }
    }



    return answer;
}</code></pre><h3 id="코드-설명">코드 설명</h3>
<ul>
<li>이 함수는 입력으로 주어진 sides 배열의 원소를 이용하여, 세 변으로 이루어진 삼각형을 만들기 위한 가능한 나머지 한 변의 길이를 구하는 문제를 해결하는 함수입니다.</li>
</ul>
<p>함수의 구현은 다음과 같습니다.</p>
<ol>
<li>먼저 , 주어진 sides 배열에서 가장 긴 변과 가장 짧은 변을 구합니다. 이를 위해 Math.max()와 Math.min() 함수를 사용합니다.</li>
<li>그 다음에 가장 긴 변의 길이를 이용하여 가능한 나머지 한 변의 길이를 계산합니다.</li>
</ol>
<ul>
<li>가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 하므로, sides[0] + sides[1] - 1을 계산하여 이 값을 max 변수에 저장합니다.</li>
</ul>
<ol start="3">
<li>나머지 한 변의 길이를 구하기 위해, 가장 짧은 변의 길이와 가장 긴 변의 길이 사이에서 가능한 정수 값을 모두 세어봅니다.</li>
</ol>
<ul>
<li>이를 위해, 가장 긴 변의 길이인 max부터 가장 짧은 변의 길이인 min1까지 반복문을 돌며, 가능한 정수 값인 경우 answer 변수에 1을 더해줍니다.</li>
</ul>
<p>따라서, 이 함수는 주어진 세 변의 길이를 이용하여 가능한 나머지 한 변의 길이의 개수를 반환합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | js ] 행렬의 덧셈]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%ED%96%89%EB%A0%AC%EC%9D%98-%EB%8D%A7%EC%85%88</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%ED%96%89%EB%A0%AC%EC%9D%98-%EB%8D%A7%EC%85%88</guid>
            <pubDate>Fri, 07 Apr 2023 03:21:01 GMT</pubDate>
            <description><![CDATA[<pre><code>function solution(arr1, arr2) {
    var answer = [];
    for(let i = 0 ; i &lt; arr1.length ; i++){
        let sum = []
        for(let j = 0 ; j&lt;arr1[i].length ; j++){

            sum.push( arr1[i][j]+ arr2[i][j]);

        }
        answer.push(sum)
    }
    return answer;
}</code></pre><p>어려울줄알았는데 push 하는 타이밍을 잘 넣어주면 되는 문제였다. !! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | JS ]숨어있는 숫자의 덧셈(2)]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-%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/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-%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>Thu, 06 Apr 2023 10:31:12 GMT</pubDate>
            <description><![CDATA[<pre><code>function solution(my_string) {
    var answer = 0;
    //[...my_string].filter(v =&gt; { &quot;0123456789&quot;.includes(v)? 
     //                          console.log(v): &quot;&quot;})
    const nums = my_string.match(/[0-9]+/g);

    return nums ? nums.map( n =&gt; Number(n))
    .reduce((acc, cur) =&gt;  
        acc + cur , 0)
      : 0
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | JS ] JadenCase 문자열 만들기]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-JadenCase-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-JadenCase-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Tue, 04 Apr 2023 08:41:34 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<p>JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.</p>
<p>##제한 조건
s는 길이 1 이상 200 이하인 문자열입니다.
s는 알파벳과 숫자, 공백문자(&quot; &quot;)로 이루어져 있습니다.
숫자는 단어의 첫 문자로만 나옵니다.
숫자로만 이루어진 단어는 없습니다.
공백문자가 연속해서 나올 수 있습니다.</p>
<h3 id="입출력-예">입출력 예</h3>
<p>s                         return
&quot;3people unFollowed me&quot;     &quot;3people Unfollowed Me&quot;
&quot;for the last week&quot;         &quot;For The Last Week&quot;</p>
<h2 id="배우고-싶은-코드-1">배우고 싶은 코드 1</h2>
<pre><code>function solution(s) {
    return s.split(&quot; &quot;).map(v =&gt; v.charAt(0).toUpperCase() + v.substring(1).toLowerCase()).join(&quot; &quot;);
}</code></pre><h2 id="배우고-싶은-코드-2">배우고 싶은 코드 2</h2>
<pre><code>function solution(s) {
    var answer = &#39;&#39;;
    for (let i = 0; i &lt; s.length; i++) {
      if (i === 0 || s[i-1] === &quot; &quot;) {
        answer += s[i].toUpperCase();
      } else {
        answer += s[i].toLowerCase();
      }
    }
    return answer;
}</code></pre><h2 id="내코드">내코드</h2>
<pre><code>function solution(s) {
    var answer = &#39;&#39;;
    for(let i=0;i&lt;s.length ; i++){
        if(i==0 ){

            answer += s[i].toUpperCase();

        }else if(s[i-1]== &#39; &#39;){

            answer += s[i].toUpperCase();
        }else if(s[i-1]!= &#39; &#39; &amp;&amp; s[i] == s[i].toUpperCase()){

            answer += s[i].toLowerCase();
        }else{
            answer += s[i]
        }
        console.log(answer)
    }
    return answer;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | JS ] 다항식 구하기 ]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-%EB%8B%A4%ED%95%AD%EC%8B%9D-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-%EB%8B%A4%ED%95%AD%EC%8B%9D-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 04 Apr 2023 03:01:32 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yurim-ai/post/08a4ecec-aacf-428e-a24c-70ce3f7a649b/image.png" alt=""></p>
<h2 id="문제-설명">문제 설명</h2>
<p>한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.</p>
<h2 id="제한사항">제한사항</h2>
<ul>
<li>0 &lt; polynomial에 있는 수 &lt; 100</li>
<li>polynomial에 변수는 &#39;x&#39;만 존재합니다.</li>
<li>polynomial은 0부터 9까지의 정수, 공백, ‘x’, ‘+&#39;로 이루어져 있습니다.</li>
<li>항과 연산기호 사이에는 항상 공백이 존재합니다.</li>
<li>공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.</li>
<li>하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.</li>
<li>&quot; + 3xx + + x7 + &quot;와 같은 잘못된 입력은 주어지지 않습니다.</li>
<li>&quot;012x + 001&quot;처럼 0을 제외하고는 0으로 시작하는 수는 없습니다.</li>
<li>문자와 숫자 사이의 곱하기는 생략합니다.</li>
<li>polynomial에는 일차 항과 상수항만 존재합니다.</li>
<li>계수 1은 생략합니다.</li>
<li>결괏값에 상수항은 마지막에 둡니다.</li>
<li>0 &lt; polynomial의 길이 &lt; 50</li>
</ul>
<h3 id="입출력-예">입출력 예</h3>
<p>polynomial    result
&quot;3x + 7 + x&quot;    &quot;4x + 7&quot;
&quot;x + x + x&quot;    &quot;3x&quot;</p>
<h3 id="입출력-예-설명">입출력 예 설명</h3>
<h4 id="입출력-예-1">입출력 예 #1</h4>
<p>&quot;3x + 7 + x&quot;에서 동류항끼리 더하면 &quot;4x + 7&quot;입니다.</p>
<h4 id="입출력-예-2">입출력 예 #2</h4>
<p>&quot;x + x + x&quot;에서 동류항끼리 더하면 &quot;3x&quot;입니다.</p>
<h2 id="배우고싶은-코드">배우고싶은 코드</h2>
<pre><code>function solution(polynomial) {
    const arr = polynomial.split(&quot; + &quot;);
    const xNum = arr
                .filter(n =&gt; n.includes(&quot;x&quot;))
                .map(n =&gt; n.replace(&#39;x&#39;, &#39;&#39;) || &#39;1&#39;)
                .reduce((acc, cur) =&gt; acc + parseInt(cur, 10), 0);
    const num = arr
                .filter(n =&gt; !isNaN(n))
                .reduce((acc, cur) =&gt; acc + parseInt(cur, 10), 0);

    let answer = [];
    if(xNum) answer.push(`${xNum === 1 ? &quot;&quot; : xNum}x`);
    if(num) answer.push(num);

    return answer.join(&quot; + &quot;);
}</code></pre><h2 id="내코드">내코드</h2>
<pre><code>function solution(polynomial) {
    var answer = &#39;&#39;;
    let numx = 0 ;
    let num = 0;
    const arr = polynomial.split(&quot; &quot;);
    console.log(arr)
    for(let i =0 ; i &lt;arr.length ;i+=2){
        if(arr[i].includes(&quot;x&quot;)){
            //numx += Number(arr[i].substr(arr[i].length-1, 1))
            let tempx = arr[i].replace(&quot;x&quot; , &quot;&quot;)|| 1;
            numx += Number(tempx)
        }else{
            num+= Number(arr[i])
        }
        console.log(numx ,num)
    }


    if(numx == 0 ){
        answer = String(num)
    }else if( numx !=1 &amp;&amp; num ==0 ){
        answer = String(numx)+ &quot;x&quot;
    }else if(numx ==1  &amp;&amp; num !=0){
        answer= &quot;x + &quot; + String(num)
    }else if(numx ==1  &amp;&amp; num ==0){
        answer= &quot;x&quot; 
    }else{
        answer= String(numx)+ &quot;x + &quot; + String(num)
    }


    return answer;
}</code></pre><p>다항식구하기 테스트 케이스 8
다항식구하기 테스트 케이스 10
다항식구하기 테스트 케이스 12
가 안되가지고 열받았는데 </p>
<p>1.x의 계수가 1인경우 
2 상수가 0 인경우 등을 생각해줘야했다. 
ex)입력값 &quot;x + 0&quot;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | JS ] 캐릭터의 좌표]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-%EC%BA%90%EB%A6%AD%ED%84%B0%EC%9D%98-%EC%A2%8C%ED%91%9C</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-%EC%BA%90%EB%A6%AD%ED%84%B0%EC%9D%98-%EC%A2%8C%ED%91%9C</guid>
            <pubDate>Mon, 03 Apr 2023 11:21:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yurim-ai/post/e6be03ca-8492-423d-a6af-1a9eedba3163/image.png" alt=""></p>
<h2 id="문제-설명">문제 설명</h2>
<p>머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.</p>
<p>[0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.</p>
<h2 id="제한사항">제한사항</h2>
<p>board은 [가로 크기, 세로 크기] 형태로 주어집니다.
board의 가로 크기와 세로 크기는 홀수입니다.
board의 크기를 벗어난 방향키 입력은 무시합니다.
0 ≤ keyinput의 길이 ≤ 50
1 ≤ board[0] ≤ 99
1 ≤ board[1] ≤ 99
keyinput은 항상 up, down, left, right만 주어집니다.</p>
<h3 id="입출력-예">입출력 예</h3>
<p>keyinput    board    result
[&quot;left&quot;, &quot;right&quot;, &quot;up&quot;, &quot;right&quot;, &quot;right&quot;]    [11, 11]    [2, 1]
[&quot;down&quot;, &quot;down&quot;, &quot;down&quot;, &quot;down&quot;, &quot;down&quot;]    [7, 9]    [0, -4]</p>
<h3 id="입출력-예-설명">입출력 예 설명</h3>
<h3 id="입출력-예-설명-1">입출력 예 설명 #1</h3>
<p>[0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.</p>
<h3 id="입출력-예-설명-2">입출력 예 설명 #2</h3>
<p>[0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.</p>
<h2 id="배우고싶은-코드">배우고싶은 코드</h2>
<pre><code>function solution(keyinput, board) {
    let key = {&quot;right&quot; : [1,0], &quot;up&quot; : [0,1], &quot;down&quot; : [0,-1], &quot;left&quot; : [-1,0]};


    let rslt = keyinput.map(v =&gt; key[v]).reduce((a,b) =&gt; { 
        if (Math.abs(a[0] + b[0]) &gt; board[0]/2 || Math.abs(a[1] + b[1]) &gt; board[1]/2) 
            return [a[0],a[1]] ; 

        return [a[0] + b[0], a[1] + b[1]];}
    , [0,0])


    return rslt;
}</code></pre><h2 id="내코드">내코드</h2>
<pre><code>function solution(keyinput, board) {
    var answer = [0,0];
    let x = 0;
    let y = 0;

    const xRange= Math.floor(board[0]/2);
    const yRange= Math.floor(board[1]/2);
    console.log(xRange, yRange)
    for(let i = 0 ; i &lt; keyinput.length ;i++){
        if(keyinput[i] ==&quot;left&quot; &amp;&amp; -xRange &lt; x )x--
        else if(keyinput[i] ==&quot;right&quot; &amp;&amp; xRange &gt; x )x++
        else if(keyinput[i] ==&quot;up&quot; &amp;&amp; yRange &gt; y )y++
        else if(keyinput[i] ==&quot;down&quot; &amp;&amp; -yRange &lt; y )y--
        console.log([x,y])
    }
    return [x,y];
}</code></pre><p>좌표를 구하는 부분에서 X, Y를 배열안에 넣는 것이
조금애먹었지만 </p>
<p>한번 푸니까 감잡음!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | js ] 이진수 더하기]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%9D%B4%EC%A7%84%EC%88%98-%EB%8D%94%ED%95%99%EA%B8%B0</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%9D%B4%EC%A7%84%EC%88%98-%EB%8D%94%ED%95%99%EA%B8%B0</guid>
            <pubDate>Mon, 27 Mar 2023 11:43:11 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yurim-ai/post/6a8d2978-403b-4fb9-91e7-c607fbd59fa7/image.png" alt=""></p>
<h2 id="문제-설명">문제 설명</h2>
<p>이진수를 의미하는 두 개의 문자열 bin1과 bin2가 매개변수로 주어질 때, 두 이진수의 합을 return하도록 solution 함수를 완성해주세요.</p>
<h2 id="제한사항">제한사항</h2>
<p>return 값은 이진수를 의미하는 문자열입니다.
1 ≤ bin1, bin2의 길이 ≤ 10
bin1과 bin2는 0과 1로만 이루어져 있습니다.
bin1과 bin2는 &quot;0&quot;을 제외하고 0으로 시작하지 않습니다.</p>
<h3 id="입출력-예">입출력 예</h3>
<p>bin1    bin2    result
&quot;10&quot;    &quot;11&quot;    &quot;101&quot;
&quot;1001&quot;    &quot;1111&quot;    &quot;11000&quot;</p>
<h4 id="입출력-예-설명">입출력 예 설명</h4>
<h4 id="입출력-예-1">입출력 예 #1</h4>
<p>10 + 11 = 101 이므로 &quot;101&quot; 을 return합니다.</p>
<h4 id="입출력-예-2">입출력 예 #2</h4>
<p>1001 + 1111 = 11000 이므로 &quot;11000&quot;을 return합니다.</p>
<h2 id="코드">코드</h2>
<pre><code>function solution(bin1, bin2) {

    return (parseInt(bin1,2)+parseInt(bin2 , 2)).toString(2);
}</code></pre><h3 id="못풀었다당당">못풀었다.(당당)</h3>
<p>솔직하게 답 봤다 </p>
<p>근데 정답보는 순간 깜짝 놀랐다. 
둘다 내가 아는 함수였기때문이다. </p>
<p><del>그럴거면 더빨리 정답볼걸 그랬다</del></p>
<ol>
<li>parseInt 함수 </li>
<li>toString 함수 </li>
</ol>
<p>정수변환, 문자열로 변환은 알았지만
함수 호출시 괄호 안에 매개변수로 2를 던지면 이진수를 제어할수있다는거 첨알았다 
<del>그래 먼가 있을거같았어</del></p>
<p>지금 알았으면됬다 
역시 아는게 힘 
power
knowing is strong
<del>야매영어</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[
[ 프로그래머스 | js ] 제일작은수 제거하기 ]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%A0%9C%EC%9D%BC%EC%9E%91%EC%9D%80%EC%88%98-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%A0%9C%EC%9D%BC%EC%9E%91%EC%9D%80%EC%88%98-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 05 Feb 2023 06:19:35 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-설명">문제 설명</h3>
<p>정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.</p>
<h3 id="제한-조건">제한 조건</h3>
<p>arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.</p>
<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/yurim-ai/post/35d4708c-b421-4c6e-a409-8902c70ffa28/image.png" alt=""></p>
<h2 id="내코드">내코드</h2>
<pre><code>function solution(arr) {
    let newArr = [...arr];

    if(arr.length ==1){
        newArr[0] = -1;
    }else{
        let s = arr.sort((a,b)=&gt; a-b);
        newArr= newArr.filter(v=&gt; v != s[0]);   
    }
    return newArr;
}</code></pre><h2 id="배우고싶은-코드-1">배우고싶은 코드 1</h2>
<pre><code>function solution(arr) {
    arr.splice(arr.indexOf(Math.min(...arr)),1);
    if(arr.length&lt;1)return[-1];
    return arr;
}</code></pre><ol>
<li>Math.min 이용 </li>
<li>min 함수안 rest 문법 이용하여 파라미터 보내기</li>
<li>indexOf() 함수이용하여 인덱스 구하기</li>
<li>splice 이용하여 원하는인덱스의 문자 자르기 </li>
</ol>
<h2 id="배우고싶은-코드-2">배우고싶은 코드 2</h2>
<pre><code>function solution(arr) {
    const min = Math.min(...arr);
    return arr.length !== 1 ? arr.filter(i =&gt; i !== min) : [-1]
}</code></pre><ol>
<li>삼항연산자 이용하기 </li>
<li>삼항연산자 안에 true 값일때 filter 로 하기 </li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 순위 기록 ]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%9C%EC%9C%84-%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%9C%EC%9C%84-%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Sat, 04 Feb 2023 13:19:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yurim-ai/post/c0d45ecc-cfea-43a8-81db-bf4b53782098/image.png" alt=""></p>
<p>오늘부터 표로 기록하려한다. </p>
<table>
<thead>
<tr>
<th align="left">날짜</th>
<th align="left">순위</th>
<th align="left">점수</th>
<th align="left">해결한문제수</th>
<th align="left">문제레벨</th>
</tr>
</thead>
<tbody><tr>
<td align="left">2.1</td>
<td align="left">34,629 위</td>
<td align="left">1,206 점</td>
<td align="left">93 개</td>
<td align="left">lv.0 : 5 / lv.1 : 4</td>
</tr>
<tr>
<td align="left">2.2</td>
<td align="left">29,175 위 (5454등▲)</td>
<td align="left">1,234 점 (28점▲)</td>
<td align="left">101 개 (8문제▲)</td>
<td align="left">lv.0 : 2 / lv.1  : 6</td>
</tr>
<tr>
<td align="left">2.3</td>
<td align="left">28,546 위 (629등▲)</td>
<td align="left">1,238 점 (4점▲)</td>
<td align="left">104 개 (3문제▲)</td>
<td align="left">lv.0 : 3</td>
</tr>
<tr>
<td align="left">2.4</td>
<td align="left">27,930 위 (616등▲)</td>
<td align="left">1,242 점 (4점▲)</td>
<td align="left">107 개 (3문제▲)</td>
<td align="left">lv.0 : 3</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | js ] 영어가 싫어요 ]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%98%81%EC%96%B4%EA%B0%80-%EC%8B%AB%EC%96%B4%EC%9A%94</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%98%81%EC%96%B4%EA%B0%80-%EC%8B%AB%EC%96%B4%EC%9A%94</guid>
            <pubDate>Sat, 04 Feb 2023 12:54:32 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yurim-ai/post/ce30c560-73f6-4894-a158-56292cf91340/image.png" alt=""></p>
<h3 id="문제-설명">문제 설명</h3>
<p>영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.</p>
<h3 id="제한사항">제한사항</h3>
<p>numbers는 소문자로만 구성되어 있습니다.
numbers는 &quot;zero&quot;, &quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;, &quot;five&quot;, &quot;six&quot;, &quot;seven&quot;, &quot;eight&quot;, &quot;nine&quot; 들이 공백 없이 조합되어 있습니다.
1 ≤ numbers의 길이 ≤ 50
&quot;zero&quot;는 numbers의 맨 앞에 올 수 없습니다.</p>
<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/yurim-ai/post/bfcf01a9-5118-4c86-82d0-399dedc9fb73/image.png" alt=""></p>
<h3 id="입출력-예-설명">입출력 예 설명</h3>
<h4 id="입출력-예-1">입출력 예 #1</h4>
<p>&quot;onetwothreefourfivesixseveneightnine&quot;를 숫자로 바꾼 123456789를 return합니다.</p>
<h4 id="입출력-예-1-1">입출력 예 #1</h4>
<p>&quot;onefourzerosixseven&quot;를 숫자로 바꾼 14067를 return합니다.</p>
<h2 id="내코드">내코드</h2>
<pre><code>function solution(numbers) {
    let arr = [ &quot;zero&quot;, &quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;, &quot;five&quot;, &quot;six&quot;, &quot;seven&quot;, &quot;eight&quot;, &quot;nine&quot;]

    for(let i = 0 ; i&lt;arr.length ; i++){
        if(numbers.includes(arr[i])){
            numbers = numbers.replaceAll(arr[i] , String(i));  
             console.log(numbers)
        }
    }

    return +numbers;
}</code></pre><p>틀린 포인트 기록: </p>
<ol>
<li>replace를 하면 하나만 되고 replaceAll 을 해야 다바뀐다</li>
<li>numbers.replace를 해서 다시 numbers 변수에 담아야한다 .</li>
</ol>
<h2 id="배우고-싶은-코드">배우고 싶은 코드</h2>
<pre><code>function solution(numbers) {
    const number = [&quot;zero&quot;,&quot;one&quot;,&quot;two&quot;,&quot;three&quot;, &quot;four&quot;, &quot;five&quot;, &quot;six&quot;, &quot;seven&quot;, &quot;eight&quot;, &quot;nine&quot;]
    for(let i = 0 ; i&lt;number.length; i++){
        numbers = numbers.split(number[i]).join(i)
    }
    return +numbers
}</code></pre><p>배운 포인트 : </p>
<ol>
<li>join() 함수 :  괄호안에 i 를 넣었는데 나누어진 것을 i 사이에 끼우면서 문자열로 합칠 수 있다는것 
ex) 문자열에서 one 를 split을 해서 나누고 1 으로 다시 join 을 한다 .
그러면 1twothree ....이렇게 됨 ..!!! 
참신한방법이네 </li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 프로그래머스 | js ] 잘라서 배열로 저장하기 ]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%9E%98%EB%9D%BC%EC%84%9C-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%9E%98%EB%9D%BC%EC%84%9C-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 03 Feb 2023 11:53:07 GMT</pubDate>
            <description><![CDATA[<p>잘라서 슬라이스 햄으로 저장하기 
원래는 통햄인데 
비닐이 배열이고 그안에 슬라이스된 햄을 넣는당(?) 
그걸 코드로 표현해보장 </p>
<p>힌트 : slice() ==&gt; 칼</p>
<h3 id="문제-설명">문제 설명</h3>
<p>문자열 my_str과 n이 매개변수로 주어질 때, my_str을 길이 n씩 잘라서 저장한 배열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="제한사항">제한사항</h3>
<p>1 ≤ my_str의 길이 ≤ 100
1 ≤ n ≤ my_str의 길이
my_str은 알파벳 소문자, 대문자, 숫자로 이루어져 있습니다.</p>
<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/yurim-ai/post/7ef0e363-d9eb-4d99-8464-fe7c1cdca80f/image.png" alt=""></p>
<h3 id="입출력-예-설명">입출력 예 설명</h3>
<h4 id="입출력-예-1">입출력 예 #1</h4>
<p>&quot;abc1Addfggg4556b&quot; 를 길이 6씩 잘라 배열에 저장한 [&quot;abc1Ad&quot;, &quot;dfggg4&quot;, &quot;556b&quot;]를 return해야 합니다.</p>
<h4 id="입출력-예-2">입출력 예 #2</h4>
<p>&quot;abcdef123&quot; 를 길이 3씩 잘라 배열에 저장한 [&quot;abc&quot;, &quot;def&quot;, &quot;123&quot;]를 return해야 합니다.</p>
<h4 id="유의사항">유의사항</h4>
<p>입출력 예 #1의 경우 &quot;abc1Addfggg4556b&quot;를 길이 6씩 자르면 &quot;abc1Ad&quot;, &quot;dfggg4&quot; 두개와 마지막 &quot;556b&quot;가 남습니다. 이런 경우 남은 문자열을 그대로 배열에 저장합니다.</p>
<h2 id="내코드">내코드</h2>
<pre><code>function solution(my_str, n) {
    var answer = [];
    let str = &quot;&quot;;
    for(let i = 0 ; i &lt; my_str.length; i++){
        str+= my_str[i];
        if((i+1)%n ==0){
            answer.push(str);
            str = &#39;&#39;;
        }else if((i+1) == my_str.length){
            answer.push(str);
        }

    }
    return answer;
}</code></pre><p>반복하면서 n의 배수일 경우 push 한다 이거였는데 </p>
<h2 id="배우고-싶은-코드">배우고 싶은 코드</h2>
<pre><code>function solution(my_str, n) {
    let res = [];
    for (let i = 0; i &lt; my_str.length; i+=n) res.push(my_str.slice(i, i+n));
    return res;
}</code></pre><p>for 문의 i 의 증감식을 보면 i+=n 이라고 되어있다 
참 괜찮은 아이디어다 
i 를 n 만큼 더해줘서 배열을 잘라서 넣어준다 </p>
<p>slice 함수는 i 번째 함수에서 i+n 번째의 앞까지 잘라준다. 
이 문자열 더미를 배열에 넣어준당 ! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | js] 중복된 문자 제거]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%A4%91%EB%B3%B5%EB%90%9C-%EB%AC%B8%EC%9E%90-%EC%A0%9C%EA%B1%B0</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%A4%91%EB%B3%B5%EB%90%9C-%EB%AC%B8%EC%9E%90-%EC%A0%9C%EA%B1%B0</guid>
            <pubDate>Fri, 03 Feb 2023 10:50:50 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-설명">문제 설명</h3>
<p>문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="제한사항">제한사항</h3>
<p>1 ≤ my_string ≤ 110
my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
대문자와 소문자를 구분합니다.
공백(&quot; &quot;)도 하나의 문자로 구분합니다.
중복된 문자 중 가장 앞에 있는 문자를 남깁니다.</p>
<h3 id="입출력-예">입출력 예</h3>
<p>my_string    result
&quot;people&quot;    &quot;peol&quot;
&quot;We are the world&quot;    &quot;We arthwold&quot;</p>
<h3 id="입출력-예-설명">입출력 예 설명</h3>
<h4 id="입출력-예-1">입출력 예 #1</h4>
<p>&quot;people&quot;에서 중복된 문자 &quot;p&quot;와 &quot;e&quot;을 제거한 &quot;peol&quot;을 return합니다.</p>
<h4 id="입출력-예-2">입출력 예 #2</h4>
<p>&quot;We are the world&quot;에서 중복된 문자 &quot;e&quot;, &quot; &quot;, &quot;r&quot; 들을 제거한 &quot;We arthwold&quot;을 return합니다.</p>
<h1 id="내코드">내코드</h1>
<p>리듀스함수를 이용한 코드 </p>
<pre><code>

function solution(my_string) {

    //my_string을 spread 연산자로 배열을 만들어준다 .
    //acc 의 초기값은 [] 이다 
    //배열에 cur(현재값) 이 포함되어있는지 확인한다 
    // 포함되어있으면 그대로 배열을 출력하고 
    // 포함되어있지않으면 현재 값을 push 한다. 

    let check = [...my_string].reduce((acc, cur ) =&gt; 
        acc.includes(cur) ? acc : [...acc , cur] 
     ,[]).join(&quot;&quot;)
    // 출력 
    //[&#39;p&#39;] 
    //[&#39;p&#39;, &#39;e&#39;]
    //[&#39;p&#39;, &#39;e&#39; , &#39;o&#39;]
    //[&#39;p&#39;, &#39;e&#39; , &#39;o&#39;] 중복문자인 p 는 출력되지않고 그전배열 그대로 출력
    //[&#39;p&#39;, &#39;e&#39; , &#39;o&#39; , &#39;ㅣ&#39;]
    //[&#39;p&#39;, &#39;e&#39; , &#39;o&#39; , &#39;ㅣ&#39;] 중복문자인 e 는 출력되지않고 그전배열 그대로 출력
    return check;
}
let my_string = &#39;people&#39;
console.log(solution(my_string))</code></pre><h1 id="배우고싶은-코드">배우고싶은 코드</h1>
<p>set 을 이용한 풀이</p>
<pre><code>function solution(my_string) {
    return [...new Set(my_string)].join(&#39;&#39;);
}</code></pre><p>reduce 함수는 너무재밌는거같당 ,,, 
set 은 중복제거니까 바로 되넹 </p>
<p>이미지출처 : <a href="https://www.ajunews.com/view/20190722152409181">https://www.ajunews.com/view/20190722152409181</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 순위 기록 2일차 ]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%9C%EC%9C%84-%EA%B8%B0%EB%A1%9D-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%9C%EC%9C%84-%EA%B8%B0%EB%A1%9D-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 02 Feb 2023 15:18:06 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yurim-ai/post/f102e405-356d-4e0d-8523-e25a2a7195b1/image.png" alt=""></p>
<p>어제
순위 34629위
점수 1206점
해결한문제 93개</p>
<p>오늘
순위 29175위 (어제대비 5454등 상승)
점수 1234점 (어제대비 28점 상승)
해결한 문제 101 개 (어제대비 8문제 품)</p>
<p>푼문제
lv.0 문제 * 2개
lv.1 문제 * 6개</p>
<p>아니 점수상승 머냐.. 
8문제에 5000등 상승  !!
근데 12만등에서 출발한거는 1점만 올라도 쑥쑥이었는데
좀 더디긴해 ..^^ </p>
<p>그래도 20000 등 입성 ㅊㅋㅊㅋㅊㅋㅊㅋ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | js ] 소인수분해]]></title>
            <link>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%86%8C%EC%9D%B8%EC%88%98%EB%B6%84%ED%95%B4</link>
            <guid>https://velog.io/@yurim-ai/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-js-%EC%86%8C%EC%9D%B8%EC%88%98%EB%B6%84%ED%95%B4</guid>
            <pubDate>Thu, 02 Feb 2023 11:02:15 GMT</pubDate>
            <description><![CDATA[<p>소인수 분해 내가 세상에서 젤 좋아하는 곱창집 개레전드인데 ...
각설하고 문제를 풀어볼게요</p>
<h3 id="문제-설명">문제 설명</h3>
<p>소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="제한사항">제한사항</h3>
<p>2 ≤ n ≤ 10,000</p>
<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/yurim-ai/post/7ee4f909-755e-4373-a92b-7337335d3d1b/image.png" alt=""></p>
<h3 id="입출력-예-설명">입출력 예 설명</h3>
<h4 id="입출력-예-1">입출력 예 #1</h4>
<p>12를 소인수분해하면 2 * 2 * 3 입니다. 따라서 [2, 3]을 return합니다.</p>
<h4 id="입출력-예-2">입출력 예 #2</h4>
<p>17은 소수입니다. 따라서 [17]을 return 해야 합니다.</p>
<h4 id="입출력-예-3">입출력 예 #3</h4>
<p>420을 소인수분해하면 2 * 2 * 3 * 5 * 7 입니다. 따라서 [2, 3, 5, 7]을 return합니다.</p>
<p>참고한 코드 </p>
<pre><code>function solution(n) {
    var answer = [];
    let idx = 2;
    while(n !== 1){
        if(n% idx ==0){
            n/=idx;
            answer.push(idx);
        }else{
            idx+=1;
        }
    }

    return Array.from(new Set(answer));
}</code></pre><p>문제포인트</p>
<ol>
<li>Array.from 으로 배열을 초기화할수있는가</li>
<li>Set 을 씀으로써 중복제거를 할수있는가 </li>
<li>소인수분해를 할수있는지 (서면소인수분해 곱창은 개잘먹을수있는데 .. ) 
저거는 하도생각이 안나서 참고한코드인데 
2로 존나게 나누다가 
0으로 안떨어지면 이제 
나누는수에 1을 추가하고 
다시3이 된수로 나머지 0 이 아닐때까지 
존나게 나누는 것이다
정말 좋은아이디어인듯.. ! </li>
</ol>
]]></description>
        </item>
    </channel>
</rss>