<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jason-project.log</title>
        <link>https://velog.io/</link>
        <description>어제보다 매일 1% 성장하고 있습니다.</description>
        <lastBuildDate>Mon, 22 Apr 2024 01:28:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jason-project.log</title>
            <url>https://velog.velcdn.com/images/jason-project/profile/5c8a2c5e-fce0-44fe-aa65-8d285261028e/image.webp</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jason-project.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jason-project" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Coding] 연속 펄스 부분 수열의 합]]></title>
            <link>https://velog.io/@jason-project/Coding-%EC%97%B0%EC%86%8D-%ED%8E%84%EC%8A%A4-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@jason-project/Coding-%EC%97%B0%EC%86%8D-%ED%8E%84%EC%8A%A4-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Mon, 22 Apr 2024 01:28:35 GMT</pubDate>
            <description><![CDATA[<h2 id="첫-코딩테스트를-봤다">첫 코딩테스트를 봤다.</h2>
<p>코딩테스트에 카데인 알고리즘을 이용한 해당 문제와 다른 문제를 선택하는 것이 나왔는데, 솔직히 신입 개발자로 지원하는건데 이렇게 어려운 문제가 나올줄은 몰랐다. 처음 알게된 개념이지만 그래도 카데인 알고리즘이 궁금할 때 찾아보면 좋을 것 같아서 기록한다.</p>
<h2 id="platform">Platform</h2>
<blockquote>
<p>programmers</p>
</blockquote>
<br/>

<h2 id="description">Description</h2>
<blockquote>
</blockquote>
<p>어떤 수열의 연속 부분 수열에 같은 길이의 펄스 수열을 각 원소끼리 곱하여 연속 펄스 부분 수열을 만들려 합니다. 펄스 수열이란 [1, -1, 1, -1 …] 또는 [-1, 1, -1, 1 …] 과 같이 1 또는 -1로 시작하면서 1과 -1이 번갈아 나오는 수열입니다.
예를 들어 수열 [2, 3, -6, 1, 3, -1, 2, 4]의 연속 부분 수열 [3, -6, 1]에 펄스 수열 [1, -1, 1]을 곱하면 연속 펄스 부분수열은 [3, 6, 1]이 됩니다. 또 다른 예시로 연속 부분 수열 [3, -1, 2, 4]에 펄스 수열 [-1, 1, -1, 1]을 곱하면 연속 펄스 부분수열은 [-3, -1, -2, 4]이 됩니다.
정수 수열 sequence가 매개변수로 주어질 때, 연속 펄스 부분 수열의 합 중 가장 큰 것을 return 하도록 solution 함수를 완성해주세요.</p>
<img src="https://velog.velcdn.com/images/jason-project/post/55837091-627d-4d05-8a52-80e65a008cf5/image.png" width="150"/>


<blockquote>
</blockquote>
<p>주어진 수열의 연속 부분 수열 [3, -6, 1]에 펄스 수열 [1, -1, 1]을 곱하여 연속 펄스 부분 수열 [3, 6, 1]을 얻을 수 있고 그 합은 10으로서 가장 큽니다.</p>
<h2 id="solution">Solution</h2>
<pre><code class="language-java">class Solution {
    public long solution(int[] sequence) {
        return Math.max(
            // 펄스 수열이 [1, -1, 1, -1, ...] 시작
            maxSubarraySumWithPulse(sequence, true),
            // 펄스 수열이 [-1, 1, -1, 1, ...] 시작
            maxSubarraySumWithPulse(sequence, false) 
        );
    }

    private long maxSubarraySumWithPulse(int[] sequence, boolean startWithPositive) {
        // 현재까지의 최대 부분 배열 합
        long maxEndingHere = 0; 
        // 전체 최대 부분 배열 합
        long maxSoFar = Integer.MIN_VALUE;
        // 현재 인덱스의 펄스 수열 값
        int multiplier = startWithPositive ? 1 : -1;

        for (int num : sequence) {
            maxEndingHere += num * multiplier;
            maxSoFar = Math.max(maxSoFar, maxEndingHere);
            maxEndingHere = Math.max(maxEndingHere, 0);
            // 펄스 수열 값 반전
            multiplier *= -1;  
        }

        return maxSoFar;
    }
}

</code></pre>
<h2 id="other-solution">Other solution</h2>
<pre><code class="language-java">
</code></pre>
<br/>

<h2 id="til---카데인-알고리즘kadanes-algorithm">TIL - 카데인 알고리즘(Kadane&#39;s Algorithm)</h2>
<blockquote>
<p>카데인 알고리즘(Kadane&#39;s Algorithm)은 주어진 수열에서 연속된 요소들의 최대 합을 효율적으로 찾는 방법입니다. 이 알고리즘은 한 번의 순회만으로 최대 부분 배열의 합을 찾을 수 있어 시간 복잡도는 O(n)입니다.</p>
</blockquote>
<h3 id="카데인-알고리즘의-기본-아이디어">카데인 알고리즘의 기본 아이디어</h3>
<p>배열을 순회하면서, 각 요소에서 끝나는 최대 부분 배열의 합을 계산합니다.
이 합은 이전 요소에서 끝나는 최대 부분 배열에 현재 요소를 더하는 것과 현재 요소만을 포함하는 것 중 큰 값입니다.
전체 배열을 순회하면서 최대 부분 배열의 합을 업데이트합니다.</p>
<pre><code class="language-java">class Solution {
    public int maxSubArray(int[] nums) {
        int maxEndingHere = nums[0]; // 현재 요소에서 끝나는 최대 부분 배열의 합 초기화
        int maxSoFar = nums[0]; // 전체 최대 부분 배열의 합 초기화

        for (int i = 1; i &lt; nums.length; i++) {
            maxEndingHere = Math.max(nums[i], maxEndingHere + nums[i]);
            maxSoFar = Math.max(maxSoFar, maxEndingHere);
        }

        return maxSoFar;
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Project] 난이도를 낮춰서 많이 시도하자]]></title>
            <link>https://velog.io/@jason-project/Project-%EB%82%9C%EC%9D%B4%EB%8F%84%EB%A5%BC-%EB%82%AE%EC%B6%B0%EC%84%9C-%EB%A7%8E%EC%9D%B4-%EC%8B%9C%EB%8F%84%ED%95%98%EC%9E%90</link>
            <guid>https://velog.io/@jason-project/Project-%EB%82%9C%EC%9D%B4%EB%8F%84%EB%A5%BC-%EB%82%AE%EC%B6%B0%EC%84%9C-%EB%A7%8E%EC%9D%B4-%EC%8B%9C%EB%8F%84%ED%95%98%EC%9E%90</guid>
            <pubDate>Wed, 17 Apr 2024 08:04:10 GMT</pubDate>
            <description><![CDATA[<h2 id="난이도가-내-수준에-비해-너무-높은-프로젝트">난이도가 내 수준에 비해 너무 높은 프로젝트</h2>
<p>너무 어려운건 결과물 진전도 없고 시간만 버린다는 것을 알게 되었다.
내가 너무 자만한 것 같다.
쉽고 새로운 기술을 하나만 추가한 프로젝트를 많이 시도하자.
그래도 이 경험도 언젠가는 나에게 좋은 자양분이 될 것이라 믿는다.</p>
<h3 id="향후-프로젝트-규칙">향후 프로젝트 규칙</h3>
<blockquote>
</blockquote>
<ol>
<li>프로젝트 당 신규 스택은 1개만 추가하며, 익숙해 진 후에 다른 스택을 적용한다.</li>
<li>난이도는 내가 GPT 에 너무 의존하지 않는 수준으로 정한다.</li>
<li>프로젝트 기간은 최대 1주를 넘기지 않는다.
(향후 실력이 좋아졌을 시 2주로 늘린다.)</li>
<li>결과물은 무조건 호스팅한다.
(실패한 결과물도 무조건한다. 어차피 완벽하지 않다.)</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[목표 - 24년 04월]]></title>
            <link>https://velog.io/@jason-project/%EB%AA%A9%ED%91%9C-24%EB%85%84-04%EC%9B%94</link>
            <guid>https://velog.io/@jason-project/%EB%AA%A9%ED%91%9C-24%EB%85%84-04%EC%9B%94</guid>
            <pubDate>Sun, 14 Apr 2024 07:29:10 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>나의 실력 대비 목표와 스택이 지나치게 과한 것이 나의 패착인 것 같다.
기술의 갯수에 집중하지 말고 실질적으로 구현 가능한 수준으로 만드는 것이 더 중요한 것 같다.</p>
<h2 id="03월-리뷰">03월 리뷰</h2>
<blockquote>
</blockquote>
<p>회사 면접을 보기 시작했다.</p>
<h2 id="04월은-더-작은-실행-단위로-쪼개는-달">04월은 더 작은 실행 단위로 쪼개는 달</h2>
<blockquote>
</blockquote>
<p>오픈소스로 만들자.
앞으로 한 프로젝트 당 신규 기술 적용은 1개로 제한한다.
점진적으로 확장할 수 있는 프로젝트로 만들자.</p>
<h2 id="04월-목표">04월 목표</h2>
<blockquote>
</blockquote>
<p>MVP 2주 내에 1개 배포 완료 
(시간이 길면 오히려 늘어진다. 빡세게 가자..)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Project] 이미지 생성 모델 만들기]]></title>
            <link>https://velog.io/@jason-project/Project-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%83%9D%EC%84%B1-%EB%AA%A8%EB%8D%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@jason-project/Project-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%83%9D%EC%84%B1-%EB%AA%A8%EB%8D%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Thu, 21 Mar 2024 09:51:36 GMT</pubDate>
            <description><![CDATA[<h2 id="모델-호출-및-이미지-생성-코드-기록">모델 호출 및 이미지 생성 코드 기록</h2>
<blockquote>
<p>venv 생성하는 법도 모르고 헤매고, image_processor 에러 때문에 버벅이던 어제보다는 오늘이 매우 뿌듯하다. 지금부터가 진짜 시작이다. 가장 기본적인 text to image 모델 부터 API 연결하고 이후에 모델을 어떻게 지속적으로 training 할지 계획을 세워보자.</p>
</blockquote>
<pre><code class="language-python">import os
from diffusers import DiffusionPipeline
import torch

# load both base &amp; refiner
base = DiffusionPipeline.from_pretrained(
    &quot;stabilityai/stable-diffusion-xl-base-1.0&quot;, torch_dtype=torch.float16, variant=&quot;fp16&quot;, use_safetensors=True
)

# mps 는 Metal performers shaders 의 약자로 Apple silicon Mac 은 이걸로 해야함. 그 외는 cuda
base.to(&quot;mps&quot;)
refiner = DiffusionPipeline.from_pretrained(
    &quot;stabilityai/stable-diffusion-xl-refiner-1.0&quot;,
    text_encoder_2=base.text_encoder_2,
    vae=base.vae,
    torch_dtype=torch.float16,
    use_safetensors=True,
    variant=&quot;fp16&quot;,
)
refiner.to(&quot;mps&quot;)

# Define how many steps and what % of steps to be run on each experts (80/20) here
n_steps = 30
high_noise_frac = 0.8

prompt = &quot;어쩌구 저쩌구&quot;

# run both experts
image = base(
    prompt=prompt,
    num_inference_steps=n_steps,
    denoising_end=high_noise_frac,
    output_type=&quot;latent&quot;,
).images
image = refiner(
    prompt=prompt,
    num_inference_steps=n_steps,
    denoising_start=high_noise_frac,
    image=image,
).images[0]

# 이미지 경로와 기본 파일명 설정
image_dir = os.path.expanduser(&quot;~/경로&quot;)
base_filename = &quot;image.png&quot;

# 파일명에 추가할 숫자 초기화
num = 0

# 최종 파일명 생성
final_path = os.path.join(image_dir, base_filename)

# 파일이 이미 존재하는 경우, 새로운 파일명 생성
while os.path.exists(final_path):
    num += 1
    # 파일명과 확장자 분리
    name, ext = os.path.splitext(base_filename)
    # 새로운 파일명 생성
    new_filename = f&quot;{name}({num}){ext}&quot;
    final_path = os.path.join(image_dir, new_filename)

# 최종 경로에 이미지 저장
image.save(final_path)
print(f&quot;Image saved to {final_path}&quot;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[목표 - 24년 03월]]></title>
            <link>https://velog.io/@jason-project/%EB%AA%A9%ED%91%9C-24%EB%85%84-03%EC%9B%94</link>
            <guid>https://velog.io/@jason-project/%EB%AA%A9%ED%91%9C-24%EB%85%84-03%EC%9B%94</guid>
            <pubDate>Mon, 04 Mar 2024 06:12:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>채용 시장이 얼어붙었다.
그렇다고 손가락만 빨고 있을 수는 없다.
인디해킹을 시작하자.</p>
</blockquote>
<h2 id="02월-리뷰">02월 리뷰</h2>
<blockquote>
<p>MVP 아이디어를 정립하고, 해당 프로젝트를 성공시키기 위한 스택을 정리하고, 내 제품을 알릴 방법을 찾아보았다.
X 를 시작했다.
MVP Front end 구성을 시작했다.
내가 이루고 싶은 것, 되고 싶은 것을 10년, 1년, 월간, 주간 단위로 
건강, 부, 비즈니스 영역으로 나눠서 작성했다.
영어는 간단한 문장으로 대화가 가능해졌다.</p>
</blockquote>
<h2 id="03월은-mvp-배포의-달">03월은 MVP 배포의 달</h2>
<blockquote>
</blockquote>
<p>시간은 금이다.
Time blocking 잘하자.
확장성은 최소화 하고 MVP 기능에 집중하자.
모든 프로세스는 Notion, Github 에 문서화 하자.</p>
<h2 id="03월-목표">03월 목표</h2>
<blockquote>
</blockquote>
<ul>
<li>영어를 대화의 맥락을 이해할 수 있는 능숙한 수준으로 구사한다.</li>
<li>MVP 1개 배포 완료</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ML] Hugging Face 란?]]></title>
            <link>https://velog.io/@jason-project/ML-Hugging-Face-%EB%9E%80</link>
            <guid>https://velog.io/@jason-project/ML-Hugging-Face-%EB%9E%80</guid>
            <pubDate>Wed, 28 Feb 2024 02:04:10 GMT</pubDate>
            <description><![CDATA[<p>Hugging Face는 기계 학습의 다양한 분야에서 모델과 데이터셋을 제공하는 주요 플랫폼입니다. 이 중에서도 Transformers 라이브러리는 자연어 처리(NLP)를 비롯해 컴퓨터 비전, 음성 인식 등에 걸쳐 광범위하게 사용되는 사전 훈련된 모델들을 쉽게 접근할 수 있게 해 줍니다. PyTorch, TensorFlow, JAX 등 여러 프레임워크를 지원하며, BERT, GPT, T5와 같은 유명 모델들을 포함하고 있습니다.</p>
<h3 id="특징">특징</h3>
<blockquote>
</blockquote>
<ul>
<li><strong>모델 제공</strong>: 다양한 작업과 언어에 적용 가능한 수천 개의 사전 훈련된 모델을 제공합니다.</li>
<li><strong>데이터셋 접근성</strong>: 사전 구축된 NLP 데이터셋을 쉽게 다운로드하고 탐색할 수 있습니다.</li>
<li><strong>토크나이저 통합</strong>: 텍스트를 모델이 이해할 수 있는 형태로 변환하는 토크나이저를 제공합니다.</li>
</ul>
<h3 id="transformers">Transformers</h3>
<blockquote>
</blockquote>
<p>Hugging Face의 Transformers는 사용자가 쉽게 모델을 파인튜닝하거나 자신의 데이터셋으로 학습을 진행할 수 있도록 지원하며, 지속적으로 커뮤니티의 기여를 통해 모델과 기능이 추가되고 있습니다. 이는 기계 학습 분야에서의 연구와 개발을 가속화하는 데 크게 기여하고 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[NEXT.js] page 와 layout]]></title>
            <link>https://velog.io/@jason-project/NEXT.js-page-%EC%99%80-layout</link>
            <guid>https://velog.io/@jason-project/NEXT.js-page-%EC%99%80-layout</guid>
            <pubDate>Mon, 26 Feb 2024 11:30:02 GMT</pubDate>
            <description><![CDATA[<h2 id="nextjs-의-라우팅-방식">NEXT.js 의 라우팅 방식</h2>
<p>Next.js 의 폴더구조는 대략 아래와 같다.</p>
<blockquote>
<p>NEXT.js 가 정한 규칙은 폴더의 이름으로 라우팅이 쉽게 구현된다.
CRA(create-react-app) 에다가 react-router-dom 으로 협업 시 어떻게 라우팅할지 고민하는 시간을 줄여준다.
<code>app</code> = <code>/</code>
<code>image-maker</code> = <code>/image-maker</code>
모두 폴더 이름과 동일하다.</p>
</blockquote>
<p>직관적인 pages routing 방식도 있지만, NEXT.js 를 쓰기로 했으면 다이나믹 라우팅을 지원해주는 app routing 방식을 써봐야 하지 않을까?</p>
<p><img src="https://velog.velcdn.com/images/jason-project/post/bcc61a4b-e56a-45d9-85a0-ea27a6f5efb3/image.png" alt=""></p>
<h2 id="page-파일">page 파일</h2>
<blockquote>
<p>위 사진을 보면 page.tsx 가 두개인 것을 볼 수 있다.
page 라는 이름으로 폴더 하위에 파일을 만들면 해당 폴더명으로 라우팅이 되며, page 파일에서 만든 컴포넌트를 렌더링한다.
<strong>전부 SSR 로 만들어져서 로딩 속도도 CRA 에 비해 매우 빠르다.</strong>
쓰다 보니 팀 프로젝트 때 왜 이걸 안썼을까 후회된다.</p>
</blockquote>
<pre><code class="language-tsx">export default function ImageMaker(){
    return (
        &lt;div&gt;
            &lt;h1&gt;Image Maker&lt;/h1&gt;
        &lt;/div&gt;
    )
}</code></pre>
<h2 id="layout">layout</h2>
<blockquote>
<p>layout 파일은 기본으로 app 디렉토리에 하나만 만들어져 있는데, 많이 본 모습이 나온다.
바로 <code>{children}</code> 
하위에 자식 컴포넌트들을 렌더링 하겠다는 의지가 보인다.</p>
</blockquote>
<p>현재는 내가 <Navigation/> 컴포넌트를 최상위에 둔 거승ㄹ 볼 수 있다.
layout 파일은 다른 디렉토리 하위에도 만들 수 있는데, /image-maker 에 layout 을 만들었다면, 해당 layout 에 컴포넌트를 넣는다면, <code>/image-maker/**</code> 하위 모든 경로에만 일괄로 컴포넌트를 뿌려준다고 이해하면 쉽겠다.</p>
<pre><code class="language-tsx">export default function RootLayout({
  children,
}: Readonly&lt;{
  children: React.ReactNode;
}&gt;) {
  return (
    &lt;html lang=&quot;en&quot;&gt;
      &lt;body className={inter.className}&gt;
        &lt;Navigation/&gt;
        {children}
      &lt;/body&gt;
    &lt;/html&gt;
  );
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[NEXT.js] 환경변수 사용]]></title>
            <link>https://velog.io/@jason-project/Front-end-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@jason-project/Front-end-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Mon, 26 Feb 2024 04:29:18 GMT</pubDate>
            <description><![CDATA[<p>React, Next.js 등 프론트엔드 환경에서 환경 변수 사용하기
Next.js를 예로 들면, 프론트엔드에서 API 키를 사용할 때는 보안을 유의해야 합니다. 일반적으로 클라이언트 측에서 API 키를 직접 사용하는 것은 권장되지 않습니다. 그러나 퍼블릭 API(예: 맵 서비스, 공개 데이터 API 등)의 경우 Next.js에서는 다음과 같이 환경 변수를 설정하고 사용할 수 있습니다.</p>
<blockquote>
<p>.env.local 파일 생성: 프로젝트 루트에 .env.local 파일을 생성하고, 퍼블릭 API 키를 다음과 같이 저장합니다.</p>
</blockquote>
<pre><code>NEXT_PUBLIC_API_KEY=your_public_api_key_here</code></pre><p>Next.js에서는 NEXT_PUBLIC_ 접두사가 붙은 환경 변수를 클라이언트 사이드에서 안전하게 사용할 수 있도록 합니다.</p>
<blockquote>
<p>환경 변수 사용: 환경 변수를 불러와서 사용합니다.</p>
</blockquote>
<pre><code class="language-ts">import axios from &#39;axios&#39;;

const fetchData = async () =&gt; {
  try {
    const response = await axios.get(&#39;https://api.example.com/data&#39;, {
      headers: {
        &#39;Authorization&#39;: `Bearer ${process.env.NEXT_PUBLIC_API_KEY}`
      }
    });
    console.log(response.data);
  } catch (error) {
    console.error(&#39;API 요청 중 오류 발생:&#39;, error);
  }
};

export default function Component() {
  return (
    &lt;div&gt;
      &lt;button onClick={fetchData}&gt;데이터 불러오기&lt;/button&gt;
    &lt;/div&gt;
  );
}</code></pre>
<p>이렇게 환경 변수를 사용하여 API 키와 같은 민감한 정보를 코드에 직접 하드코딩하지 않고 관리할 수 있습니다. 이 방법은 보안을 유지하고, 개발과 프로덕션 환경에서의 설정 변경을 용이하게 합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Project] MVP 만드는 방법]]></title>
            <link>https://velog.io/@jason-project/MVP-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@jason-project/MVP-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Wed, 21 Feb 2024 03:03:46 GMT</pubDate>
            <description><![CDATA[<p>많은 인디해커들과 스타트업에서는 사업 아이디어를 가장 최소한의 기능을 가진 상품, MVP(Minumum Viable Product) 를 빠르게 빌드하고 이를 반복하고 있다고 한다.
참고한 자료와 내 생각을 몇가지 기록하려 한다.</p>
<hr/>

<h2 id="mvp-제작---검증-흐름">MVP 제작 - 검증 흐름</h2>
<blockquote>
</blockquote>
<ul>
<li>문제와 문제 영역 설정</li>
<li>가설 수립</li>
<li>테스트</li>
<li>결과 도출</li>
<li>가설 방향성 재 검토 || 프로젝트 종료
...(반복)</li>
</ul>
<hr/>

<h2 id="제작-시-참고할-점">제작 시 참고할 점</h2>
<blockquote>
</blockquote>
<ol>
<li>Time box your spec
데드라인 정하기(2주, 4주, 8주 등)</li>
<li>Write your spec
필요한 기능을 전부 나열한다.</li>
<li>Cut your spec
나열한 기능들 중 필요한 부분만 남기고 일부는 back log 기록 혹은 삭제한다.</li>
<li>Don&#39;t fall in love with your MVP
만든 하나의 MVP 에 너무 집착하여 시간을 낭비하지 않는다.</li>
</ol>
<ul>
<li><a href="https://youtu.be/oWZbWzAyHAE?si=RJC0OZNf1FQF5QdB">참고 유튜브 : Y Combinator</a></li>
</ul>
<hr/>

<h2 id="피드백-받기">피드백 받기</h2>
<blockquote>
</blockquote>
<ul>
<li>실제 앱 / 웹으로 배포한다.</li>
<li>내가 활동하는 소셜미디어에 공유한다.</li>
<li><a href="https://www.producthunt.com/">Product Hunt</a> 와 같은 플랫폼에 공유한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java Collection]HashSet, LinkedHashSet]]></title>
            <link>https://velog.io/@jason-project/Java-CollectionHashSet-LinkedHashSet</link>
            <guid>https://velog.io/@jason-project/Java-CollectionHashSet-LinkedHashSet</guid>
            <pubDate>Wed, 14 Feb 2024 00:49:50 GMT</pubDate>
            <description><![CDATA[<h1 id="hashset과-linkedhashset-특징과-차이점">HashSet과 LinkedHashSet: 특징과 차이점</h1>
<p>Java의 <code>HashSet</code>과 <code>LinkedHashSet</code>은 Set 인터페이스를 구현한 클래스로, 중복을 허용하지 않는 데이터의 집합을 관리할 때 사용됩니다. 두 클래스는 유사해 보일 수 있지만, 내부 구현과 사용 사례에 있어 중요한 차이점을 가지고 있습니다.</p>
<hr/>

<h2 id="hashset">HashSet</h2>
<ul>
<li><strong>중복 허용 안 함</strong>: 같은 값을 가진 요소의 추가 시도는 무시됩니다.</li>
<li><strong>순서 보장 안 함</strong>: 요소의 추가 순서와 관계없이, 내부 해시 함수에 따라 요소가 저장됩니다.</li>
<li><strong>빠른 접근 속도</strong>: 해시 함수를 사용하여 요소의 존재 여부를 빠르게 확인할 수 있습니다.</li>
</ul>
<p><code>HashSet</code>은 주로 요소의 중복을 방지하면서 순서가 중요하지 않은 데이터 집합을 관리할 때 사용됩니다.</p>
<pre><code class="language-java">import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet&lt;Integer&gt; numbers = new HashSet&lt;&gt;();

        // 요소 추가
        numbers.add(2);
        numbers.add(3);
        numbers.add(1);

        // 요소 순회
        for (int number : numbers) {
            System.out.println(number);
        }

        // 요소 삭제
        numbers.remove(2);

        // 특정 요소 포함 여부 확인
        if (numbers.contains(3)) {
            System.out.println(&quot;HashSet contains 3&quot;);
        }
    }
}
</code></pre>
<hr/>

<h2 id="linkedhashset">LinkedHashSet</h2>
<ul>
<li><strong>중복 허용 안 함</strong>: <code>HashSet</code>과 마찬가지로 중복된 요소의 추가는 허용되지 않습니다.</li>
<li><strong>순서 보장</strong>: 요소가 추가된 순서대로 요소를 순회할 수 있습니다.</li>
<li><strong>빠른 접근 속도</strong>: <code>HashSet</code>과 유사한 속도로 요소의 존재 여부를 확인할 수 있으면서도, 요소의 순서를 유지합니다.</li>
</ul>
<p><code>LinkedHashSet</code>은 중복을 허용하지 않으면서도 요소의 삽입 순서를 유지해야 할 때 유용합니다. 예를 들어, 사용자가 입력한 데이터의 순서를 보존하면서 중복을 제거해야 하는 경우에 적합합니다.</p>
<pre><code class="language-java">import java.util.LinkedHashSet;

public class LinkedHashSetExample {
    public static void main(String[] args) {
        LinkedHashSet&lt;Integer&gt; orderedNumbers = new LinkedHashSet&lt;&gt;();

        // 요소 추가
        orderedNumbers.add(2);
        orderedNumbers.add(3);
        orderedNumbers.add(1);

        // 요소 순회
        for (int number : orderedNumbers) {
            System.out.println(number); // 순서대로 출력됨: 2, 3, 1
        }

        // 요소 삭제
        orderedNumbers.remove(3);

        // 특정 요소 포함 여부 확인
        if (orderedNumbers.contains(1)) {
            System.out.println(&quot;LinkedHashSet contains 1&quot;);
        }
    }
}
</code></pre>
<hr/>

<h2 id="차이점">차이점</h2>
<ul>
<li><strong>순서 유지</strong>: <code>HashSet</code>은 요소의 순서를 유지하지 않는 반면, <code>LinkedHashSet</code>은 요소가 추가된 순서를 유지합니다.</li>
<li><strong>성능 차이</strong>: <code>LinkedHashSet</code>은 요소의 순서를 유지하기 위해 추가적인 메모리를 사용하며, 이로 인해 아주 미세하게 <code>HashSet</code>보다 느릴 수 있습니다. 그러나 대부분의 경우 이 차이는 무시할 수 있을 정도입니다.</li>
<li><strong>사용 사례</strong>: 순서가 중요하지 않고 데이터의 중복만 제거하고 싶을 때는 <code>HashSet</code>이 적합합니다. 반면, 요소의 삽입 순서를 유지하면서 중복을 제거해야 할 경우 <code>LinkedHashSet</code>이 더 적합합니다.</li>
</ul>
<hr/>

<h2 id="결론">결론</h2>
<blockquote>
<p><code>HashSet</code>과 <code>LinkedHashSet</code> 사이의 선택은 요소의 순서 유지 여부와 애플리케이션의 성능 요구사항에 따라 결정됩니다. 데이터의 순서가 중요하지 않다면 <code>HashSet</code>을, 순서가 중요하다면 <code>LinkedHashSet</code>을 사용하는 것이 좋습니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Coding] 중복된 문자 제거]]></title>
            <link>https://velog.io/@jason-project/Coding-%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/@jason-project/Coding-%EC%A4%91%EB%B3%B5%EB%90%9C-%EB%AC%B8%EC%9E%90-%EC%A0%9C%EA%B1%B0</guid>
            <pubDate>Wed, 14 Feb 2024 00:12:50 GMT</pubDate>
            <description><![CDATA[<h2 id="platform">Platform</h2>
<blockquote>
<p>programmers</p>
</blockquote>
<br/>

<h2 id="description">Description</h2>
<blockquote>
</blockquote>
<p>문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<img src="https://velog.velcdn.com/images/jason-project/post/4e17c782-52f2-4dd9-90be-8488a2cf9ef5/image.png" width="150"/>


<blockquote>
</blockquote>
<p>입출력 예 #1
&quot;people&quot;에서 중복된 문자 &quot;p&quot;와 &quot;e&quot;을 제거한 &quot;peol&quot;을 return합니다.
입출력 예 #2
&quot;We are the world&quot;에서 중복된 문자 &quot;e&quot;, &quot; &quot;, &quot;r&quot; 들을 제거한 &quot;We arthwold&quot;을 return합니다.</p>
<h2 id="solution">Solution</h2>
<pre><code class="language-java">import java.util.LinkedHashSet;

class Solution {
    public String solution(String my_string) {

        // StringBuilder 를 사용해본다.
        StringBuilder answer = new StringBuilder();

        // 중복 허용이 안돼고, 결과값이 순서대로 추가되는 LinkedHashSet 을 사용한다.
        LinkedHashSet&lt;Character&gt; set = new LinkedHashSet&lt;&gt;();

        // LinkedHashSet 에 my_string 의 char 를 중복 없는 값으로 넣는다.
        for (char c : my_string.toCharArray()) {
            set.add(c);
        }

        // StringBuilder 에도 넣는다.
        for (char c : set) {
            answer.append(c);
        }

        // String 타입으로 변환한다.
        return answer.toString();

    }
}
</code></pre>
<h2 id="other-solution">Other solution</h2>
<pre><code class="language-java">import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public String solution(String my_string) {

        //stream
        return Arrays.stream(myString.split(&quot;&quot;))
                      .distinct()
                     .collect(Collectors.joining());
    }
}
</code></pre>
<br/>

<h2 id="til---hashset과-linkedhashset-특징과-차이점">TIL - HashSet과 LinkedHashSet: 특징과 차이점</h2>
<blockquote>
</blockquote>
<ul>
<li><code>HashSet</code>
중복 허용 안함
순서 보장 안함
빠른 접근 속도</li>
<li><code>LinkedHashSet</code>
중복 허용 안함
순서 보장
빠른 접근 속도</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git] .gitignore 설정 후에도 commit 에 파일 안 없어질 때 ]]></title>
            <link>https://velog.io/@jason-project/git-.gitignore-%EC%84%A4%EC%A0%95-%ED%9B%84%EC%97%90%EB%8F%84-commit-%EC%97%90-%ED%8C%8C%EC%9D%BC-%EC%95%88-%EC%97%86%EC%96%B4%EC%A7%88-%EB%95%8C</link>
            <guid>https://velog.io/@jason-project/git-.gitignore-%EC%84%A4%EC%A0%95-%ED%9B%84%EC%97%90%EB%8F%84-commit-%EC%97%90-%ED%8C%8C%EC%9D%BC-%EC%95%88-%EC%97%86%EC%96%B4%EC%A7%88-%EB%95%8C</guid>
            <pubDate>Tue, 13 Feb 2024 08:27:15 GMT</pubDate>
            <description><![CDATA[<h2 id="새-프로젝트-생성-시-겪는-gitignore-설정-문제">새 프로젝트 생성 시 겪는 .gitignore 설정 문제</h2>
<p><img src="https://velog.velcdn.com/images/jason-project/post/f7bce035-2a97-408f-bd15-c5238efc04fe/image.png" alt=""></p>
<p>IntelliJ 기준으로 새 프로젝트를 생성 시, git 저장소 추가를 체크박스 후 프로젝트를 생성했다면, IDE 가 만들어 준 기본 .gitignore 내의 내용만 Git index 에서 무시되며, 나머지는 자동을 staging(git add) 된다.</p>
<h2 id="git-index-해제하기staging-제외">Git index 해제하기(staging 제외)</h2>
<pre><code class="language-git">git rm --cached &lt;파일시스템 경로/파일명&gt;</code></pre>
<blockquote>
<p>이미 프로젝트를 만든 상황인데, commit 하기 싫은 파일을 Git index 에서 지우고 싶다면 CLI(프로젝트 디렉토리에 위치) 에서 위 명령어를 치면 index 해제된다.</p>
</blockquote>
<p><br/><hr/></p>
<h2 id="gitignore-내용-추가">.gitignore 내용 추가</h2>
<p><img src="https://velog.velcdn.com/images/jason-project/post/a11da6a1-2e0d-4c80-8a58-a664ba3e1969/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jason-project/post/8fc7c212-b2fc-4a04-b376-893836124124/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>이후 .gitignore 에 commit 을 원하지 않는 디렉토리/파일 적으면 내용이 정상 반영되는 것을 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Coding]자릿수 더하기]]></title>
            <link>https://velog.io/@jason-project/%EC%9E%90%EB%A6%BF%EC%88%98-%EB%8D%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jason-project/%EC%9E%90%EB%A6%BF%EC%88%98-%EB%8D%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 31 Jan 2024 00:54:10 GMT</pubDate>
            <description><![CDATA[<h2 id="platform">Platform</h2>
<blockquote>
<p>programmers</p>
</blockquote>
<br/>

<h2 id="description">Description</h2>
<blockquote>
</blockquote>
<p>정수 <code>n</code>이 매개변수로 주어질 때 <code>n</code>의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요</p>
<img src="https://velog.velcdn.com/images/jason-project/post/e2b33057-a9e5-47f4-b6bb-3347a4389f33/image.png" width="150"/>


<blockquote>
</blockquote>
<p>입출력 예 #1
1 + 2 + 3 + 4 = 10을 return합니다.
입출력 예 #2
9 + 3 + 0 + 2 + 1 + 1 = 16을 return합니다.</p>
<h2 id="solution">Solution</h2>
<pre><code class="language-java">class Solution {
    public int solution(int n) {
        int answer = 0;
        String temp = String.valueOf(n);

        for (int i = 0; i &lt; temp.length(); i++){
            answer += Character.getNumericValue(temp.charAt(i));
        }

        return answer;
    }
}
</code></pre>
<h2 id="other-solution">Other solution</h2>
<pre><code class="language-java">
</code></pre>
<br/>

<h2 id="til---charactergetnumericvalue">TIL - Character.getNumericValue();</h2>
<blockquote>
</blockquote>
<ul>
<li><code>Character.getNumericValue(char)</code>
정수로 표기된 char 의 숫자 값 1개를 가져온다.
A 나 ! 같은 것들은 숫자로 가져올 수 없어서 -1 이 반환된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Coding]모음 제거]]></title>
            <link>https://velog.io/@jason-project/%EB%AA%A8%EC%9D%8C-%EC%A0%9C%EA%B1%B0</link>
            <guid>https://velog.io/@jason-project/%EB%AA%A8%EC%9D%8C-%EC%A0%9C%EA%B1%B0</guid>
            <pubDate>Tue, 30 Jan 2024 11:56:40 GMT</pubDate>
            <description><![CDATA[<h2 id="platform">Platform</h2>
<blockquote>
<p>programmers</p>
</blockquote>
<br/>

<h2 id="description">Description</h2>
<blockquote>
</blockquote>
<p>영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 <code>my_string</code>이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<blockquote>
</blockquote>
<p>입출력 예 #1
&quot;bus&quot;에서 모음 u를 제거한 &quot;bs&quot;를 return합니다.
입출력 예 #2
&quot;nice to meet you&quot;에서 모음 i, o, e, u를 모두 제거한 &quot;nc t mt y&quot;를 return합니다.</p>
<h2 id="solution">Solution</h2>
<pre><code class="language-java">class Solution {
    public String solution(String my_string) {
        String answer = my_string.replace(&quot;a&quot;, &quot;&quot;)
                                 .replace(&quot;e&quot;, &quot;&quot;)
                                 .replace(&quot;i&quot;, &quot;&quot;)
                                 .replace(&quot;o&quot;, &quot;&quot;)
                                 .replace(&quot;u&quot;, &quot;&quot;);

        return answer;
    }
}
</code></pre>
<h2 id="other-solution">Other solution</h2>
<pre><code class="language-java">class Solution {
    public String solution(String my_string) {
        String answer = &quot;&quot;;

        answer = my_string.replaceAll(&quot;[aeiou]&quot;, &quot;&quot;);

        return answer;
    }
}
</code></pre>
<br/>

<h2 id="til---regex-characters">TIL - regex [characters]</h2>
<blockquote>
</blockquote>
<ul>
<li><code>my_string.replaceAll(&quot;[aeiou]&quot;, &quot;&quot;)</code>
a,e,i,o,u 에 해당하는 문자들을 모두 공백처리한다.
여기서 [char1, char2...] 는 [ ] 안의 어느 것이든 해당할 수 있음.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[목표 - 24년 02월]]></title>
            <link>https://velog.io/@jason-project/%EB%AA%A9%ED%91%9C-24%EB%85%84-02%EC%9B%94</link>
            <guid>https://velog.io/@jason-project/%EB%AA%A9%ED%91%9C-24%EB%85%84-02%EC%9B%94</guid>
            <pubDate>Tue, 30 Jan 2024 02:22:11 GMT</pubDate>
            <description><![CDATA[<h2 id="02월은-계획-조정의-달">02월은 계획 조정의 달</h2>
<p>01월의 루틴이 적응 되었지만, 단기용 계획이었기 때문에, 좀 더 정량적이고 구체적이고, 재미있는 것들을 써보자.</p>
<blockquote>
</blockquote>
<p>외적인 동기는 스트레스와 번아웃만 주는 것 같다.
무엇이 나에게 재미를 주는지 이번 달 하고싶은 것을 써보자.</p>
<h2 id="이번-달-하고싶은-것">이번 달 하고싶은 것</h2>
<blockquote>
<ol>
<li>개발 : 미니 프로젝트 기획</li>
<li>자격증 : <del>네이버클라우드 자격증 취득</del>(NCP 취득 완료!)</li>
<li>영어 : 일상 회화</li>
</ol>
</blockquote>
<h2 id="일간-목표삭제"><del>일간 목표</del>(삭제)</h2>
<blockquote>
</blockquote>
<p><del>1. 영어 : 레슨 3개
2. 알고리즘 : 문제 풀이 5개
3. 자격증 : 전체 분야 1독
4. 블로그 : 1개</del></p>
<h2 id="행동을-위한-노트삭제"><del>행동을 위한 노트</del>(삭제)</h2>
<blockquote>
</blockquote>
<p><del>1. 목표는 항목으로 구분하고, 정량적으로 정한다.
2. 모든 행동은 빠르게 대충 시작한다.
3. 최대한 쉬운 목표로 시작한다.</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Coding]1672. Richest Customer Wealth]]></title>
            <link>https://velog.io/@jason-project/1672.-Richest-Customer-Wealth</link>
            <guid>https://velog.io/@jason-project/1672.-Richest-Customer-Wealth</guid>
            <pubDate>Fri, 26 Jan 2024 00:51:02 GMT</pubDate>
            <description><![CDATA[<h2 id="platform">Platform</h2>
<blockquote>
<p>LeetCode</p>
</blockquote>
<br/>

<h2 id="description">Description</h2>
<blockquote>
</blockquote>
<p>주어진 <code>m x n</code> 정수 그리드 <code>accounts</code>에서 <code>accounts[i][j]</code>는 <code>i​​​​​​​​​​​번째​​​​</code> 고객이 <code>j​​​​​​​​​​​번째​​​​</code> 은행에 가지고 있는 돈의 양입니다. 가장 부유한 고객의 재산을 반환하세요.
고객의 재산은 그들이 모든 은행 계좌에 가지고 있는 돈의 양입니다. 가장 부유한 고객은 최대 재산을 가진 고객입니다.</p>
<h2 id="solution">Solution</h2>
<pre><code class="language-java">class Solution {
    public int maximumWealth(int[][] accounts) {
        int[] answer = new int[accounts.length];
        for (int i = 0; i &lt; accounts.length; i++){
            int sum = 0;
            for (int j = 0; j &lt; accounts[i].length; j++){
                sum  += accounts[i][j];
            }
            answer[i] = sum;
        }

        Arrays.sort(answer);
        return answer[answer.length - 1];

    }
}</code></pre>
<h2 id="summary">Summary</h2>
<blockquote>
<p>2차원 배열은 개인적으로 내가 풀기 어려워하는 문제 중에 하나이기 때문에, 하나 쯤 기록으로 남긴다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Coding]짝수는 싫어요]]></title>
            <link>https://velog.io/@jason-project/%EC%A7%9D%EC%88%98%EB%8A%94-%EC%8B%AB%EC%96%B4%EC%9A%94</link>
            <guid>https://velog.io/@jason-project/%EC%A7%9D%EC%88%98%EB%8A%94-%EC%8B%AB%EC%96%B4%EC%9A%94</guid>
            <pubDate>Thu, 25 Jan 2024 08:14:26 GMT</pubDate>
            <description><![CDATA[<h2 id="platform">Platform</h2>
<blockquote>
<p>programmers</p>
</blockquote>
<br/>

<h2 id="description">Description</h2>
<blockquote>
</blockquote>
<p>정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.</p>
<img src="https://velog.velcdn.com/images/jason-project/post/3efb441f-f8b8-4608-a079-c313a9ace458/image.png" width="200"/>


<h2 id="solution">Solution</h2>
<pre><code class="language-java">class Solution {
    public int[] solution(int n) {
        int[] answer = new int[(n+1)/2];
        int j = 0;
        for (int i = 1; i &lt;= n; i+=2){
            answer[j] = i;
            j++;
        }
        return answer;
    }
}
</code></pre>
<h2 id="other-solution">Other solution</h2>
<pre><code class="language-java">import java.util.stream.IntStream;

class Solution {
    public int[] solution(int n) {
        return IntStream.rangeClosed(0, n).filter(value -&gt; value % 2 == 1).toArray();
    }
}
</code></pre>
<br/>

<h2 id="til---intstreamrangecloseda-bfilter">TIL - IntStream.rangeClosed(a, b).filter()</h2>
<blockquote>
</blockquote>
<ul>
<li><code>IntStream.rangeClosed(0, n)</code> 
0부터 n을 포함한 수 까지의 정수 범위를 나타낸다.<br/></li>
<li><code>filter(value -&gt; value % 2 == 1)</code>
2로 나눈 나머지가 1(홀수)인 조건에 맞는 값만 걸러낸다.<br/></li>
<li><code>toArray()</code>
걸러진 stream 요소들을 배열로 바꾼다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[목표 - 24년 01월]]></title>
            <link>https://velog.io/@jason-project/%EB%AA%A9%ED%91%9C-24%EB%85%84-01%EC%9B%94</link>
            <guid>https://velog.io/@jason-project/%EB%AA%A9%ED%91%9C-24%EB%85%84-01%EC%9B%94</guid>
            <pubDate>Wed, 24 Jan 2024 09:55:11 GMT</pubDate>
            <description><![CDATA[<h2 id="01월-까지-일주일">01월 까지 일주일</h2>
<p>늦었지만 올해부터 매 달 3개의 목표를 정하기로 했다.</p>
<h2 id="행동을-위한-노트">행동을 위한 노트</h2>
<blockquote>
</blockquote>
<ol>
<li>목표는 항목으로만 구분하고, 시간 단위로 계획을 세우지 않는다.</li>
<li>모든 행동은 빠르게 대충 시작한다.</li>
<li>내가 기록하고 싶은 건 모두 블로그에 작성한다.</li>
</ol>
<h2 id="월간-목표">월간 목표</h2>
<blockquote>
<ol>
<li>사이드 프로젝트 : [구상 중]</li>
<li>알고리즘 공부 : 매일 5개 문제 풀이</li>
<li>영어 : 매일 레슨 3개</li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Coding] 최빈값 구하기]]></title>
            <link>https://velog.io/@jason-project/%EC%BD%94%EB%94%A9%EB%AC%B8%EC%A0%9C-%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jason-project/%EC%BD%94%EB%94%A9%EB%AC%B8%EC%A0%9C-%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 17 Jan 2024 00:34:15 GMT</pubDate>
            <description><![CDATA[<h2 id="platform">Platform</h2>
<blockquote>
<p>programmers</p>
</blockquote>
<br/>

<h2 id="description">Description</h2>
<blockquote>
</blockquote>
<ul>
<li>제한사항
0 &lt; array의 길이 &lt; 100
0 ≤ array의 원소 &lt; 1000</li>
</ul>
<img src="https://velog.velcdn.com/images/jason-project/post/55ebc5b3-2a91-42d7-bfe6-8f3986753179/image.png" width="200" height="200"/>

<blockquote>
<ul>
<li>입출력 예 설명
입출력 예 #1
[1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.
입출력 예 #2
[1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.
입출력 예 #3
[1]에는 1만 있으므로 최빈값은 1입니다.</li>
</ul>
</blockquote>
<h2 id="solution">Solution</h2>
<pre><code class="language-java">class Solution {
    public int solution(int[] array) {
        int[] frequency = new int[1000];
        int maxFrequency = 0;

        // 각 숫자의 빈도를 계산
        for (int num : array) {
            frequency[num]++;
            maxFrequency = Math.max(maxFrequency, frequency[num]);
        }

        // 최빈값이 여러 개 있는지 확인
        int maxValCount = 0;
        int maxVal = -1;
        for (int i = 0; i &lt; frequency.length; i++) {
            if (frequency[i] == maxFrequency) {
                maxValCount++;
                maxVal = i;
                if (maxValCount &gt; 1) {
                    return -1; // 최빈값이 여러 개면 -1 반환
                }
            }
        }

        // 최빈값이 하나만 있으면 그 값을 반환
        return maxVal;
    }
}
</code></pre>
<br/>

<h2 id="mathmax-과-mathmin">Math.max() 과 Math.min()</h2>
<blockquote>
</blockquote>
<p><code>Math.max(a, b)</code> 는 a 와 b 중에 가장 높은 수를 반환한다.
<code>Math.min(a, b)</code> 는 a 와 b 중에 가장 낮은 수를 반환한다.
인자 a, b 는 같은 Primitive type 끼리만 비교 가능하다. <br/>
ex) <code>Math.max(int a, int b)</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[시간복잡도, 공간 복잡도]]></title>
            <link>https://velog.io/@jason-project/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%8B%9C%EA%B0%84-%EA%B3%B5%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84</link>
            <guid>https://velog.io/@jason-project/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%8B%9C%EA%B0%84-%EA%B3%B5%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84</guid>
            <pubDate>Wed, 17 Jan 2024 00:06:24 GMT</pubDate>
            <description><![CDATA[<h2 id="시간-복잡도time-complexity">시간 복잡도(Time Complexity)</h2>
<blockquote>
<p>알고리즘이 문제를 해결하는 데 걸리는 시간을 측정하는 기준
알고리즘의 효율성을 평가하고, 대규모 데이터에 대한 성능을 예측하는 데 유용</p>
</blockquote>
<p>Big O 표기법 사용 예시:
O(1): 입력 크기에 상관없이 항상 일정한 시간이 걸리는 경우 (예: 배열에서 특정 인덱스의 요소에 접근)
O(N): 입력 크기에 비례하여 시간이 증가하는 경우 (예: 선형 검색)
O(N²): 입력 크기의 제곱에 비례하여 시간이 증가하는 경우 (예: 이중 루프를 사용하는 알고리즘)
O(log N): 입력 크기가 커질수록, 시간이 로그 비율로 증가하는 경우 (예: 이진 검색)</p>
<h2 id="공간-복잡도space-complexity">공간 복잡도(Space Complexity)</h2>
<blockquote>
<p>알고리즘이 문제를 해결하는 데 필요한 메모리 양을 측정하는 기준
메모리 사용을 최적화하고, 메모리 제한이 있는 환경에서의 알고리즘 성능을 평가</p>
</blockquote>
<p>Big O 표기법 사용 예시:
O(1): 입력 크기에 상관없이 항상 일정한 메모리를 사용하는 경우
O(N): 입력 크기에 비례하여 메모리 사용량이 증가하는 경우</p>
<blockquote>
<p><strong>지금은 잘 이해는 안가지만 계속 진행하다 보면 이해될 것 같다.</strong></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>