<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>red-orange.log</title>
        <link>https://velog.io/</link>
        <description>귤을 죽으로도 먹고싶을 만ㅋ큼 좋아합니다.귤귤귤</description>
        <lastBuildDate>Tue, 24 Jun 2025 23:51:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>red-orange.log</title>
            <url>https://velog.velcdn.com/images/red-orange/profile/bdbab8ed-dcc4-424c-a8ca-6027ff7a29b5/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. red-orange.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/red-orange" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[chat gpt를 통해 언어 공부를 해보자!]]></title>
            <link>https://velog.io/@red-orange/chat-gpt%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%96%B8%EC%96%B4-%EA%B3%B5%EB%B6%80%EB%A5%BC-%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@red-orange/chat-gpt%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%96%B8%EC%96%B4-%EA%B3%B5%EB%B6%80%EB%A5%BC-%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Tue, 24 Jun 2025 23:51:19 GMT</pubDate>
            <description><![CDATA[<p>학교에서 코틀린 타이핑 수업을 하고 있었다..
그렇다 &quot;타이핑&quot;.. 선생님께서는 단 하나의 개념 설명 없이 타이핑만 주구장창 하고 계신 것이었다.</p>
<p>난 새로 선생님을 구하기 시작했다. 
&quot;chat gpt&quot;. </p>
<p>그에게 코틀린 선생님을 부탁했던 슬픈 프롬프트를 공개하고 싶다.</p>
<h2 id="첫-요청">첫 요청</h2>
<pre><code>당신은 지금부터 나의 코틀린 선생님입니다. 
저는 이전에 xml 관련 코틀린을 한 적이 있는데, 
타이핑 중심 수업으로 해당 원리나 쓰는 방법을 전혀 이해하지 못했다. 
즉 인터넷을 참고하지 않은 개발은 어려웠다. 

나는 이 수업에서 논리이해를 중점으로 두고 싶다. 
그리고 당신에게 배운 개발을 통해서 jetpack compose kotlin 관련 전문가가 되고 싶다. 

제가 이해할 수 있도록 학습 예시코드를 부탁드립니다.</code></pre><p>위의 프롬프트는 구조가 다음과 같다.</p>
<ol>
<li><p>역할 부여 
당신은 지금부터 나의 [언어] 선생님입니다.</p>
</li>
<li><p>기존 경험
저는 이 [언어]에 대해서 ~정도 압니다.</p>
</li>
<li><p>목표 
이 [언어]를 통해서 전문가가 되고 싶다.</p>
</li>
<li><p>수업 목표/스타일 지정</p>
</li>
</ol>
<p>이런 식으로 진행되었고, 프롬프트에 해당하는 출력 결과는 아쉬웠다.
특히 아무런 학습 단원이나 이런 것이 없이 그냥 막가르치는 느낌이 들었다. 물론, 기본 문법은 잘 가르쳐주었다. </p>
<p>전부를 여기에 나타낼 수 없지만 어쨋든 계속 다음 단원의 학습을 요구하기 어려웠다.</p>
<h2 id="프롬프트-추가">프롬프트 추가</h2>
<p>그래서 더 정렬된 느낌을 위해 다음과 같은 프롬프트를 추가 했다.</p>
<pre><code>이 이후의 진도를 나가고 싶습니다. 
그 이전, 저는 코틀린 개발자가 되기 위해서 꼭 알아야하는 것을 알기를
원합니다. 그를 위해서 알아야하는 것을 정리해서 해당 순서에 
맞게 알려주세요.</code></pre><p>이후 나는 이 chat gpt 성격과 사랑에 빠졌다.. 
정확한 계획을 짜주었다. 단원에 따른 학습 후 다음으로 넘어가기 용이하며, 세션을 분리해서 코드 질문만 하는 곳을 또 따로 만들면 최고다.
<img src="https://velog.velcdn.com/images/red-orange/post/ad15ad55-c1c1-4359-adfd-fbfc4609ec49/image.png" alt=""></p>
<p>지금까지의 프롬프트 단계는 다음과 같다.</p>
<ol>
<li><p>역할 부여 
당신은 지금부터 나의 [언어] 선생님입니다.</p>
</li>
<li><p>기존 경험
저는 이 [언어]에 대해서 ~정도 압니다.</p>
</li>
<li><p>최종 목표 
이 [언어]를 통해서 전문가가 되고 싶다.</p>
</li>
<li><p>수업 목표/스타일 지정
진도를 제시, 수업이나 출력 결과 스타일 예시 제시</p>
</li>
</ol>
<h2 id="프롬프트-보완">프롬프트 보완</h2>
<p>물론 지금도 만족스럽지만 내가 발견하지 못한 보완점이 있을 것이라는 생각이 들어서 Gemini에게 물어보았다.</p>
<p><img src="https://velog.velcdn.com/images/red-orange/post/188abcd6-2ce1-4617-b984-31c53c58b025/image.png" alt=""></p>
<p>기존보다 더 정확하게 설명하고 가치관에 대한 강조를 잘 하는 거 같다.. 
분발해야겠다....</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FS 모듈 - nodejs]]></title>
            <link>https://velog.io/@red-orange/FS-%EB%AA%A8%EB%93%88-nodejs</link>
            <guid>https://velog.io/@red-orange/FS-%EB%AA%A8%EB%93%88-nodejs</guid>
            <pubDate>Wed, 12 Mar 2025 18:56:48 GMT</pubDate>
            <description><![CDATA[<p>fs가 헤깔리는 초급 이기에 &quot;DO IT NODE.JS&quot; 책 개념을 정리해보았습니다!
<a href="https://product.kyobobook.co.kr/detail/S000211207431">https://product.kyobobook.co.kr/detail/S000211207431</a> </p>
<p>nodeJs의 파일관리 모듈 - FS(File System)</p>
<h2 id="파일-읽기">파일 읽기</h2>
<p>파일을 처리하는 데 사용(읽기, 기록)
디렉토리, 새파일 등 파일에 관한 여러 기능 제공</p>
<p>비동기 처리 방법에 따른 함수 사용</p>
<ol>
<li>promise에서 사용하는 함수(비동기)</li>
<li>콜백에서 사용하는 함수(비동기)</li>
<li>동기 처리 시 사용하는 함수</li>
</ol>
<h3 id="모듈-가져오기">모듈 가져오기</h3>
<p><code>const fs = require(&#39;fs&#39;);</code> 모듈 가져오기
<code>fs.함수명</code></p>
<h2 id="현재-dir읽기">현재 dir읽기</h2>
<p>&#39;readdirSync&#39;, &#39;readdir&#39; 함수. (sync이 붙은 게 동기함수다.)</p>
<p>기본형 <code>fs.readdirSync(경로[, 옵션 인코딩])</code>
경로를 읽어서 해당 폴더의 파일 이름을 표시.</p>
<h3 id="readdirsync">readdirSync</h3>
<pre><code>const fs = require(&#39;fs&#39;);
let files = fs.readdirSync(&quot;./&quot;);
console.log(files);</code></pre><h3 id="readdir함수">readdir함수</h3>
<p><code>fs.readdir(경로[,옵션],콜백)</code>
디렉토리 처리가 시간이 걸려서 다른 일부터 처리하라는 의미에서 비동기 처리를 하는 것.</p>
<pre><code>fs.readdir(&quot;./&quot;, (err, files) =&gt; {

});</code></pre><br>

<h2 id="파일-관리">파일 관리</h2>
<p>많이 사용하는 파일 관리 함수
파일을 읽을 때 사용하는 readFileSync, readFile 함수</p>
<h3 id="동기-readfilesync-함수">동기. readFileSync 함수</h3>
<p>버퍼, 문자열로 반환.
<code>fs.readFileSync(경로[, 옵션 :  인코딩과 flag])</code>
flag란 ... 파일 열기, 권한? 느낌입니다. r이 기본값, r+ 읽고 쓰기, w 쓰기, a 추가</p>
<pre><code>const fs = require(&quot;fs&quot;); 
const data = fs.readFileSync(&quot;./example.txt&quot;); // 읽어오기
console.log(data);</code></pre><p>&gt;&gt;&gt; Buffer(158) [110, 111, 100, 101, 106, 115, 32, 105, 115, 32, 97, ...... 
난리가 난다. </p>
<p>인코딩 옵션을 붙여주어야한다.
<code>fs.readFileSync(&quot;./example.txt&quot;, &quot;utf-8&quot;);</code>
<br></p>
<h3 id="비동기-readfile-함수">비동기 readFile 함수</h3>
<p><code>fs.readFile(파일[,옵션], 콜백)</code></p>
<ul>
<li>signal : 파일 읽는 시간이 길어질경우, signal 옵션으로 읽기 취소 가</li>
<li>옵션 : encoding, flag, signal</li>
<li>콜백 : err, data의 매개변수<pre><code>const fs = require(&quot;fs&quot;);
</code></pre></li>
</ul>
<p>fs.readFile(&quot;./example.txt&quot;, &quot;utf-8&quot;, (err, data) =&gt; {
    if(err) console.error(err);
    console.log(data);
});</p>
<pre><code>&lt;br&gt;

## 파일에 기록
### writeFileSync
`fs.writeFileSync(파일, 내용[,옵션])`
- 파일 : 기록할 파일 
- 내용 : 내용
- 옵션 : encoding, flag(default:w), mode
- mode : 파일에 대한 사용자의 권한.. 

### existsSync
writeFileSync 함수로 똑같은 이름의 파일을 한 번더 생성하면 기존 내용은 사라짐. 그를 방지하기 위해서 파일 존재 여부를 확인할 때 쓰는 함수이다.  

### writeFile 
` fs.wirteFile(파일, 내용[, 옵션], 콜백)`
- 옵션 (encoding, mode, flag, signal)
- encoding - 기본  uft8
- mode 파일에 대한 권한
- signal 파일 기록 시간이 길 경우, 파일 쓰기 취소 가능
- 콜백 writeFile 함수서 콜백을 사용할때 err매개변수를 사용

## 기존 파일에 내용 추가
### appendFileSync
### appendFile
flag를 사용하지 않고 위의 해당 파일을 사용할 수 있음


## 파일 지우기 
### unlinkSync(파일), nulink(파일, 콜백) 
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[http 이해하기, NodeJs]]></title>
            <link>https://velog.io/@red-orange/http-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-NodeJs</link>
            <guid>https://velog.io/@red-orange/http-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-NodeJs</guid>
            <pubDate>Tue, 11 Mar 2025 17:50:13 GMT</pubDate>
            <description><![CDATA[<p>Do it Node js 책의 135page 네크워크 기초 및 서버 만들기의 내용 요약입니다.</p>
<p>아래 내용은 클라이언트와 서버간의 어떤 방식으로 데이터를 주고받는지에 관련된 내용입니다.</p>
<h2 id="http-protocol">HTTP PROTOCOL</h2>
<p>클라이언트(자료 요청) -&gt; 서버(응답, 자료 보냄) 방식의 웹 동작.
그러나 둘은 너무 달라서 공통의 규칙이 필요하다. -&gt; http 프로토콜이다.</p>
<p>클라이언트(자료 요청, HTTP 요청) -&gt;  서버(응답, HTTP 응답)</p>
<ul>
<li>서버는 요청, 응답을 어떻게 처리할지 결정.<br>

</li>
</ul>
<h2 id="요청-응답">요청&amp; 응답</h2>
<p>요청과 응답의 확인 -&gt; 개발자 도구의 네트워크창에서 요청응답 파일 확인 가능</p>
<p>서버의 요청 메세지- 요청 헤더(meta 정보), 요청 본문(요청 내용)으로 구성.</p>
<p>응답 헤더, 본문도 마찬가지의 내용이다. (네트워크창에서 응답 헤더 볼 수 있다.)</p>
<h3 id="요청-url-요청-메서드">요청 URL, 요청 메서드</h3>
<p>클이 서버에게 정보를 요구하는 url - 요청 url(ex.주소창에 url입력)</p>
<p>클 -&gt; 서버 관계에서 처리 방법을 알려줌. 대략 4가지</p>
<ol>
<li>GET METHOD - 서버서 정보 get할때 사용. </li>
<li>POST METHOD - 서버서 데이타 저장(post)시 사용.</li>
<li>PUT METHOD - 서버 데이타 수정(후 put)할때 사용.</li>
<li>DELETE METHOD - 지워버릴때 사용.
ㄴ 요청 메서드는 요청 클라이언트의 요구에 따라 다르네.</li>
</ol>
<h3 id="상태코드">상태코드</h3>
<p>클의 요청 성공 상태를 알려줌. </p>
<h3 id="원격주소">원격주소</h3>
<p>서버 IP주소 + 포트번호 형식.</p>
<br>

<h2 id="클라이언트-서버-만나는법">클라이언트 서버 만나는법</h2>
<p>당연 데이터 주고 받는데 통로 필요하다. 그 통로의 이름 &gt;&gt; &quot;소켓&quot;
소켓은 IP주소 포트를 통해 구분한다. &gt;&gt; 딴 집가면 안돼. 비번확인 필수.</p>
<h3 id="ip-주소란">IP 주소란</h3>
<p>이컴 저컴 속 내컴을 구분해내기 위한 주소.
International Protocol 주소 -&gt; IP 주소</p>
<h3 id="포트">포트</h3>
<p>서버는 하나의 프로그램만 열진 않는다. <del><em>아깝게</em></del>
그 많은 프로그램 중 어떤 프로그램을 실행하는지, 포트가 알랴준다.
도메인orIP주소:포트 =&gt; 소켓 주소.</p>
<p>어..? 원격주소 소켓주소 IP주소 헤깔리네요. 비슷비슷한데 원격주소는 포트에 연결된 IP주소. IP주소는 내 컴에 할당된 주소. 소켓주소는 아이피+포트</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발하면서 심심하고 막혔을때 해결법]]></title>
            <link>https://velog.io/@red-orange/%EC%95%84%EB%AC%B4%EC%86%8C%EB%A6%AC0001</link>
            <guid>https://velog.io/@red-orange/%EC%95%84%EB%AC%B4%EC%86%8C%EB%A6%AC0001</guid>
            <pubDate>Tue, 15 Oct 2024 16:10:18 GMT</pubDate>
            <description><![CDATA[<p>프로젝트 같지도 않은 프로젝트를 하며 정말 막히고 생각이 잘 안나는 경우가 많았는데 너무 좋은 방법인 거 같습니다.</p>
<p>특히 투머치 토커라면 더욱 좋은 방법일듯 싶네요. </p>
<pre><code>그냥 나는 딱 해당 블록에 해당하는 칸에 들어가면 
플레이어가 더 이상 못가게 막히는 거면 좋겠음

이것도 여러 방식이 있을 거 같은 데

후보 1
1. 해당 플레이어가 있는 좌표를 통해 블록의 length값 추출(x,y)
2. 해당 블록 값으로 접근하여 블록이 존재하는지 확인
3. 있을 시 멈추고 갈 수 없게 만듬(개별로 정지하게 한다던가하는 형식)
이점 : gap까지 멈춰지지 않음 정밀함
단점 : 블록이 존재하는지 확인하는 메서드가 만들기 어렵다. 

자 두번째 안건 class내에 위치하는 블록이 정말 존재하는지 확인할 수 있는 메서드를 어떻게 만들까?
해당 메서드의 목적 : 플레이어가 블록과 겹치치 못하게 하는 것(나는 그 방법으로 플레이어가 블록에 근접하면 블록에서 감지를 통해 겹쳐지지 못하도록하는 방법을 택함)
사실 위의 방법으로는 layout 계층을 같은 것으로 써서 접근하지 못하게 하는 것에 대해서도 찾을 수 있음 

but... 일단 원래 목표대로 하자. 할 ㅅㅜ 있다 ㅅ!바거

1. 좌표값을 통한 접근(인자 : player의 좌표)
좌표값을 통해 겹쳤는가? 를 확인. but이러면 Action class에 직접 들어가야할듯(움직이기 전에 판단해야하니까) 실행하는데 오래걸리고 나중에 뜯어고칠 확률도 있어보인다. 

2. 이외 클래스 canvus etc. 
대량 뜯어고치기 예상. 그냥 이 코드 전체의 구조를 바꿔야함. 게다가 난 frame 밖에 모르는 근시안적인 사람이다. ㅂㄱㄴ

3. 그냥 아예 player의 메서드로 만드는 것
근데 이것도 현실성이 없긴하다.^^

메서드 고민임.....
아니 있잖아
하 
ㅠㅠ
사실 좌표값을 통한 접근도 방법이 대따 많음
그냥 x,y값 비교도 가능하고, 아니면 블록의 인덱스를 구해서 가중치를 더해가지고 플레이어의 접근을 막을 수도 있단말야
그래서 xy값 비교를 하려했지? 

그래서 비교를 하려는데 에러사항이 생김
만약에 플레이어 좌표 (284,216) || 벽돌 (230,220) - 왼쪽 첫 벽돌로의 이동, X좌표로 이동했고 Y좌표는 전혀 바뀌지 않음 이런 경우 Y좌표만 비교하면됨
이의 반대의 경우 Y좌표이동(상하이동)을 할 경우 X좌표는 변하지 않음 
즉 Action class에 해당 움직임마다 이를 판별해주면 되겠다 라는 계산이 나옴. but... 시간복잡도 개오진다.(최적화 필요하스무니다.)



음 결국 만들었다. Brick class 속에 있는 메서드는 만듬. 
이 메서드는 어떻게 돌아가냐면 class의 속성인 flag를 확인하는 형식으로 이루어짐. flag가 false이면 brick은 없는 것으로 간주하고 이동해도된다. 이런식의 논리임
그러나 문제 클래스를 사용하는 입장에서는 Brick는 객체참조배열로 되어있으므로 brick[][]형식으로 접근해야함. 그러기에 현재 있는 좌표에 따라 인덱스의 값을 구해야할듯
예를 들어 지금 플레이어가 위치하는 곳은 3열 3행이다. 음 괜찮네 아무것도 없잖아? 형식. 만약 음 이동한 후에 3열 2행이잖아? 가만있어보자 음;  brick[3][2].getflag()가 true네? 그럼 벽돌이 있는거잖아. 벽돌에 박치기 할순없지ㅋㅋ  멈춰애겠다.ㅋㅋ 이런식의 작동을 원한다.


여기서 겁!나 큰 문제1 띠로리ㅠㅠ </code></pre><p>메모장을 통해 혼자서 대화하기ㅎㅎ 
정말 신기하게도 생각 정리가 된다... 그래서 너무 재밌다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[My SQL] 기초기초 명령어 정리]]></title>
            <link>https://velog.io/@red-orange/My-SQL-%EA%B8%B0%EC%B4%88%EA%B8%B0%EC%B4%88-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@red-orange/My-SQL-%EA%B8%B0%EC%B4%88%EA%B8%B0%EC%B4%88-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 25 Sep 2024 09:24:37 GMT</pubDate>
            <description><![CDATA[<h2 id="mysql">mysql</h2>
<p>DB의 모든 이름에는 소문자를 사용하는게 좋다.
주석 : &#39;#&#39;으로 사용한다. </p>
<p>데이터 -&gt; 필드 -&gt; 레코드 -&gt; 테이블 -&gt; database
<br><br></p>
<p>&lt;접속&gt;
mysql -u 아이디 -p
USE DATABASE (DB에 접속);
<br></p>
<p>&lt;생성&gt;
DB - CREATE DATABASE 이름 DEFAULT CHARACTER SET UTF8; (UTF8-한국어 사용가능)
테이블 - CREATE TABLE 이름( ); 
<br></p>
<p>&lt;조회&gt; 
DB - SHOW DATABASES; 
테이블목록 - SHOW TABLES;
테이블값 - SELECT (COLUM 범위) FROM TABLE; (조건 - WHERE 필드명= __ ;) 
<br>
&lt;구조확인&gt; 
DESC 테이블명; (DESCRIBE, EXPLAIN도 사용가능하다.)
<br></p>
<p>&lt;추가&gt; 
레코드 값추가 - INSERT INTO 테이블명(필드 1, 필드2, ..) VALUES(데이타1, 데이타2...);
2.                INSERT INTO 테이블명 VALUES(데이터1, 데이터2,...);
<br></p>
<p>&lt;변경&gt;
이름 - ALTER TABLE 테이블명 CHANGE 기존컬럼 변경후컬럼 컬럼타입;
순서 - ALTER TABLE 테이블명 MODIFY 순서변경컬럼 컬럼타입 ALTER 앞에오는컬럼;
컬럼타입변수 - ALTER TABLE 테이블명 MODIFY 컬럼명 변경할컬럼타입;
<br></p>
<p>&lt;수정&gt;
필드추가 - ALTER TABLE 테이블명 ADD 추가할칼럼 타입 DEFAULT 디폴값;
데이터수정 - UPDATE 테이블 SET 칼럼명 = &quot;수정할 값&quot;;
          UPDATE 테이블 SET 수정필드=&#39;값&#39; WHERE 검색필드=&#39;값&#39;;
<br></p>
<p>&lt;삭제&gt;
칼럼 - ALTER TABLE 테이블명 DROP COLUMN 칼럼명;
테이블 - DELETE FROM 테이블명; (그러나 테이블의 틀은 남아있다)
        DROP FROM 테이블명; (테이블 완전 삭제) 
데이터삭제 - DELETE FROM 테이블명 WHERE 필드=&#39;값&#39;;</p>
<hr>
<p><br><br><br>
명령어를 한 눈에 정리하면 좋을 거 같아서 모아보았다. 
오히려 눈에 잘들어와서 명령어간 비교가 잘 될 듯하다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | Lv.1] 강원도에 위치한 생산공장 목록 출력하기]]></title>
            <link>https://velog.io/@red-orange/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EA%B0%95%EC%9B%90%EB%8F%84%EC%97%90-%EC%9C%84%EC%B9%98%ED%95%9C-%EC%83%9D%EC%82%B0%EA%B3%B5%EC%9E%A5-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@red-orange/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EA%B0%95%EC%9B%90%EB%8F%84%EC%97%90-%EC%9C%84%EC%B9%98%ED%95%9C-%EC%83%9D%EC%82%B0%EA%B3%B5%EC%9E%A5-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 21 Sep 2024 15:50:25 GMT</pubDate>
            <description><![CDATA[<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/131112">https://school.programmers.co.kr/learn/courses/30/lessons/131112</a></p>
<h3 id="문제-설명">문제 설명</h3>
<blockquote>
<p>다음은 식품공장의 정보를 담은 <code>FOOD_FACTORY</code> 테이블입니다. <code>FOOD_FACTORY</code> 테이블은 다음과 같으며 <code>FACTORY_ID</code>, <code>FACTORY_NAME</code>, <code>ADDRESS</code>, <code>TLNO</code>는 각각 공장 ID, 공장 이름, 주소, 전화번호를 의미합니다.</p>
</blockquote>
<p>descript!</p>
<table>
<thead>
<tr>
<th>Column name</th>
<th>Type</th>
<th>Nullable</th>
</tr>
</thead>
<tbody><tr>
<td>FACTORY_ID</td>
<td>VARCHAR(10)</td>
<td>FALSE</td>
</tr>
<tr>
<td>FACTORY_NAME</td>
<td>VARCHAR(50)</td>
<td>FALSE</td>
</tr>
<tr>
<td>ADDRESS</td>
<td>VARCHAR(100)</td>
<td>FALSE</td>
</tr>
<tr>
<td>TLNO</td>
<td>VARCHAR(20)</td>
<td>TRUE</td>
</tr>
</tbody></table>
<pre><code>-- 코드를 입력하세요
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS 
FROM FOOD_FACTORY
WHERE ADDRESS LIKE &#39;강원도%&#39;
ORDER BY FACTORY_ID ASC;</code></pre><ul>
<li>FROM : 데이터를 가져올 TABLE NAME</li>
<li>LIKE &#39;~%&#39;: ~로 시작하는 값을 확인할 때(조건)</li>
<li>ORDER BY : 결과 정렬시 사용, (ASC : 오름차순/DESC : 내림차순)</li>
</ul>
<BR>
위의 코드에서 WHERE ADDRESS LIKE '강원도%'<BR>
-> '강원도'로 시작하는 필드를 ADDRESS 레코드에서 찾는다.<BR>
  만약 '%강원도' 라면 강화도로 끝나는 글자 <BR><BR>

<p>  ASC : ASCENDING, 오름차순이라는 의미이다. 
  DESC : DESCENDING, 내림차순의 의미이다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | Lv.0] 문자열 뒤집기]]></title>
            <link>https://velog.io/@red-orange/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.0-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0</link>
            <guid>https://velog.io/@red-orange/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.0-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0</guid>
            <pubDate>Sun, 18 Aug 2024 18:29:27 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/red-orange/post/a942d683-4857-4d55-98d6-a0505f633d95/image.png" alt=""></p>
<p><strong>문제 설명</strong>
문자열 my_string과 정수 s, e가 매개변수로 주어질 때, my_string에서 인덱스 s부터 인덱스 e까지를 뒤집은 문자열을 return 하는 solution 함수를 작성해 주세요.</p>
<p><strong>제한사항</strong>
my_string은 숫자와 알파벳으로만 이루어져 있습니다.
1 ≤ my_string의 길이 ≤ 1,000
0 ≤ s ≤ e &lt; my_string의 길이</p>
<h3 id="1lh-코드">1.LH 코드</h3>
<pre><code>class Solution {
    public String solution(String my_string, int s, int e) {
        String temp = &quot;&quot;;

        //바꿀부분을 추출
        for(int i=e; i&gt;=s; i--){
            temp += my_string.charAt(i);
        }

        String answer = &quot;&quot;;
        for(int i=0; i&lt;s; i++){
            answer += my_string.charAt(i);
        }

        answer += temp;

        for(int i=e+1; i&lt;my_string.length(); i++){
            answer += my_string.charAt(i);
        }

        return answer;
    }
}</code></pre><ul>
<li>직관적으로 문자를 끊어서 처리했다. </li>
<li>가독성 0 </li>
<li>처리 시간이 오래걸린다. </li>
</ul>
<h3 id="nam-코드">NAM 코드</h3>
<pre><code>class Solution {
    public String solution(String myString, int s, int e) {
        return myString.substring(0, s) + new StringBuilder(myString.substring(s, e + 1)).reverse().toString() + myString.substring(e + 1);
    }
}
</code></pre><ul>
<li>위 코드에서는 서브스트링을 이용하여 코드를 자르고 stringbuilder로 reverse를 한 후 곧바로 붙여서 return 하였다. </li>
</ul>
<p>String substring(int index)
문자열을 자를때 사용한다. </p>
<p>new StringBuilder(myString.substring(s,e+1).reverse().toString())
새 스트링빌더 &lt;- 자른 문자열을 뒤바꾼 것의 type를 스트링으로 바꾸었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[java | class, score 예제]]></title>
            <link>https://velog.io/@red-orange/%EC%9E%90%EB%B0%9401</link>
            <guid>https://velog.io/@red-orange/%EC%9E%90%EB%B0%9401</guid>
            <pubDate>Sun, 18 Aug 2024 17:02:36 GMT</pubDate>
            <description><![CDATA[<pre><code>import java.util.Scanner;

class stu_score{
    String num;
    String name;
    int score[];
    double aver;
    char gra; //절대평가 
    int rank; //상대평가
}

public class Score_1302{
    public static void main(String args[]){

        Scanner in = new Scanner(System.in);

        System.out.print(&quot;학생 수 입력 : &quot;);
        int stu_num=in.nextInt();

        stu_score stu_s[] = new stu_score[stu_num+1];
        String subj[] = {&quot;국어&quot;,&quot;영어&quot;,&quot;수학&quot;,&quot;자바&quot;};

        for(int i=0; i&lt;stu_num; i++){ //학생 수 만큼 돌아간다. 왜냐면 한 학생의 점수를 전부 입력하기 때무니다.

            System.out.print(&quot;학번 : &quot;);
            stu_s[i].num = in.next();
            System.out.print(&quot;이름 : &quot;);
            stu_s[i].name = in.next();
            stu_s[i].score=new int[5];

            for(int j=0; j&lt;4; j++) {
                do{
                    System.out.print(subj[j]+&quot;점수 : &quot;);
                    stu_s[i].score[j] = in.nextInt();
                }while((0&gt;stu_s[i].score[j] || stu_s[i].score[j]&gt;100));

            }
            stu_s[i].score[4] = method_sum(stu_s[i].score[3],stu_s[i].score[2],stu_s[i].score[1],stu_s[i].score[0]);
            stu_s[i].aver= (double)stu_s[i].score[4]/4;

            switch((int)stu_s[i].aver/10){
                case 9: case 10: stu_s[i].gra=&#39;A&#39;; break;
                case 8: stu_s[i].gra=&#39;B&#39;; break;
                case 7: stu_s[i].gra= &#39;C&#39;; break;
                case 6: stu_s[i].gra = &#39;D&#39;; break;
                default : stu_s[i].gra=&#39;E&#39;; 
            }
            System.out.println();
            stu_s[i].rank = 1;    
        }
        in.close();

        for(int i=0; i&lt;stu_num-1; i++){ 
            for(int j=i+1; j&lt;stu_num; j++){
                if(stu_s[i].score[i]&gt;stu_s[i].score[j]) stu_s[i].rank++;
                else if(stu_s[i].score[i]&lt;stu_s[i].score[j]) stu_s[i].rank++;
            }
        }
        for(int i=0; i&lt;stu_num; i++){
                System.out.printf(&quot;%5s %7s %5d %5d %5d %5d %6d %8.2f %5c %5d\n&quot;,stu_s[i].num,stu_s[i].name,stu_s[i].score[0],stu_s[i].score[1],stu_s[i].score[2],stu_s[i].score[3],stu_s[i].score[4],stu_s[i].aver,stu_s[i].gra,stu_s[i].rank);
        }
        //학번순 출력 
        /*
        else if(menu==2) {
            for(int i=0; i&lt;stu_num; i++) {
                for(int j=i; j&lt;stu_num-1; j++) {

                }
            }
        }
        */

    }//end of main

    static int method_sum(int kor, int eng, int math, int java){
        return (kor+eng+math+java);
    }
}
</code></pre><h2 id="문제발생">문제발생,</h2>
<p>Exception in thread &quot;main&quot; java.lang.NullPointerException: Cannot assign field &quot;num&quot; because &quot;stu_s[i]&quot; is null
        at Score_1302.main(Score_1302.java:26)</p>
<h2 id="해결">해결,</h2>
<p>각 배열 요소를 인스턴스화</p>
<h2 id="왜">왜?</h2>
<p>왜 각 배열 요소의 인스턴스화를 해야되고 그게 무엇인가... </p>
<p>배열의 선언만으로 각 요소가 객체로서 초기화되지 않아서이다.</p>
<h2 id="결론">결론</h2>
<p><code>class명 배열이름 = new 클래스[배열개수];</code> 는 
그냥 해당 클래스 타입의 객체 배열을 만든거다.
아직 클래스 객체를 직접 참조하지 않았다. 
그래서 전부 null로 초기화 되어있다. </p>
<p>그렇기에 for문을 돌려 전부 class의 객체를 직접 가르키도록 해주는 것이다. </p>
<p>대박 java신님 감사합니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공] 5주차 ]]></title>
            <link>https://velog.io/@red-orange/%ED%98%BC%EA%B3%B5-5%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@red-orange/%ED%98%BC%EA%B3%B5-5%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Mon, 12 Aug 2024 12:47:05 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/red-orange/post/30836b1c-1833-4e0c-a30c-968b3f756ede/image.jpg" alt=""></p>
<ul>
<li><input disabled="" type="checkbox"> 배열</li>
<li><input disabled="" type="checkbox"> null의 표기</li>
<li><input disabled="" type="checkbox"> null의 사용법</li>
</ul>
<br>

<h2 id="배열">배열</h2>
<p><code>int a, int b, int c, int d, int f = 0</code>
우리는 무더기로 많은 배열을 필요로 할때가 있다. 
그럴때마다 독립변수를 하나씩 잡는다면 가독성과 시간이 낭비된다. </p>
<p>그래서 전체로 붙어있는 것을 만들기로 했다. </p>
<p><code>int a[5];</code> 이렇게 선언하면 int형 저장공간이 만들어지고 배열의 시작주소는 배열의 이름과 같다.</p>
<p>배열은 이어진 형태이므로 방이 있을 것이고 위의 &#39;a&#39;라는 배열은 int형 5개가 합쳤기에 20byte다.</p>
<p>각 배열의 요소에는 index가 있으며, 순서가 0부터 시작한다. 그러기에 배열 크기-1 만큼 사용한다.</p>
<p><code>int a[5] = 0;</code> 첫 요소만 0으로 초기화
<code>int a[5] = {0};</code> 전체 요소 0으로 초기화</p>
<br>

<h2 id="배열초기화">배열초기화</h2>
<p><code>int a[1234] = {0};</code>  0으로 전부 초기화 
<code>int a[] = {1,2,3,4};</code> 배열 개수 생략
<code>int a[1234];</code> 쓰레기값이 들어있다</p>
<br>

<h2 id="sizeof-연산자">sizeof 연산자</h2>
<p>반복문을 다룰때, 배열 개수 조건을 동적으로 사용하기 위한다.
배열 요소의 개수를 구하기 -&gt; sizeof(배열명)si##zeof(배열 요소)</p>
<br>

<h2 id="null표기">null표기</h2>
<p>문자열을 저장할때 사용, 문자열 끝에 붙어서 끝을 알리는데에 사용
널은 아스키 문자가 0인 것을 의미
문자열보다 크거나 +|1인경우가 많은 듯 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 | Lv0] 다항식 더하기]]></title>
            <link>https://velog.io/@red-orange/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv0-%EB%8B%A4%ED%95%AD%EC%8B%9D-%EB%8D%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@red-orange/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv0-%EB%8B%A4%ED%95%AD%EC%8B%9D-%EB%8D%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 31 Jul 2024 04:23:55 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/red-orange/post/947b9f67-a040-4d5d-ba69-02f063adf848/image.png" alt=""></p>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/120863">프로그래머스|Lv0 : 다항식 더하기</a></p>
<h2 id="🫧문제">🫧문제</h2>
<blockquote>
<h3 id="🎁문제">🎁문제</h3>
<p>한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.</p>
</blockquote>
<h3 id="🪄제한">🪄제한</h3>
<ul>
<li>0 &lt; polynomial에 있는 수 &lt; 100</li>
<li>polynomial에 변수는 &#39;x&#39;만 존재합니다.</li>
<li>polynomial은 양의 정수, 공백, ‘x’, ‘+&#39;로 이루어져 있습니다.</li>
<li>항과 연산기호 사이에는 항상 공백이 존재합니다.</li>
<li>공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.</li>
<li>하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.</li>
<li>&quot; + 3xx + + x7 + &quot;와 같은 잘못된 입력은 주어지지 않습니다.</li>
<li>0으로 시작하는 수는 없습니다.</li>
<li>문자와 숫자 사이의 곱하기는 생략합니다.</li>
<li>polynomial에는 일차 항과 상수항만 존재합니다.</li>
<li>계수 1은 생략합니다.</li>
<li>결괏값에 상수항은 마지막에 둡니다.</li>
<li>0 &lt; polynomial의 길이 &lt; 50</li>
</ul>
<br>

<hr>
<br>

<h2 id="👻풀이subjavasub">👻풀이<sub>(java)</sub></h2>
<h3 id="◾1-sub첫시도sub">◾1 <sub><del>첫시도</del></sub></h3>
<pre><code>class Solution {
    public String solution(String polynomial) {
        String temp = polynomial.replace(&quot; &quot;,&quot;&quot;); //공백없애기
        String arr[] = temp.split(&quot;\\+&quot;); //더하기를 기준으로 분리한다. 

        //각 x의 계수와 정수를 계산하는 변수
        int x = 0;
        int num = 0;
        String answer = &quot;&quot;; 

        //항의 개수가 2개가 아닐 시(2개일 시 그대로 반환)
        if(arr.length!=2){
            for(int i=0; i&lt;arr.length; i++){
                if(arr[i].contains(&quot;x&quot;))

                    //엑스를 떼어내었을 때 null이라면 1, 아니라면 계수 그대로를 저장.
                    x += ((arr[i].replace(&quot;x&quot;,&quot;&quot;)).equals(&quot;&quot;))? 1 : Integer.parseInt(arr[i].replace(&quot;x&quot;,&quot;&quot;)); 
                // 정수일 경우를 감지
                else if(!(arr[i].equals(&quot;&quot;))){
                    num += Integer.parseInt(arr[i]);
                }  
            }

            //x의 계수나 양의 정수 둘 중 하나가 0일 경우를 대비
            answer = (x&gt;0&amp;&amp;num&gt;0)? x+&quot;x + &quot;+num : (x&gt;0&amp;&amp;num&lt;=0)? x+&quot;x&quot; : num+&quot;&quot;;
        }

        //항이 2개라면에 대한 경우 처리
        else if(arr.length==2){
            answer = polynomial;
        }
        return answer;
    }
}</code></pre><p><del>많이 드릅다 
여러분의 눈은 소중하다</del></p>
<h4 id="코드설명-">코드설명 :</h4>
<p>항의 개수를 세서 공백과 덧셈기호로 나눈다음, x의 계수와 양의 정수를 각각 더하여 센다. 그 후 x의 계수는 x문자에 붙인 상태로 양의 정수와 함께 return 한다. </p>
<p>결국 위의 코드는 항이 2개에 대해 집착한다.(&quot;x + 4&quot;인 경우 라던가)</p>
<p>만약 &quot;2 + 2&quot;, &quot;2x + 7x&quot;라면?? -&gt; 이에 대한 고려가 안돼있다. </p>
<p><br><br><br></p>
<h3 id="◾2성공🥳">◾2(성공🥳)</h3>
<pre><code>class Solution {
    public String solution(String polynomial) {
        String temp = polynomial.replace(&quot; &quot;,&quot;&quot;);
        String arr[] = temp.split(&quot;\\+&quot;);

        int x = 0;
        int num = 0;
        String answer = &quot;&quot;;

        //x에 대한 계수와 정수에 대한 합을 진행한다. 
        for(int i=0; i&lt;arr.length; i++){
            if(arr[i].contains(&quot;x&quot;))
                x += ((arr[i].replace(&quot;x&quot;,&quot;&quot;)).equals(&quot;&quot;))? 1 : Integer.parseInt(arr[i].replace(&quot;x&quot;,&quot;&quot;));
            else if(!(arr[i].equals(&quot;&quot;))){                    num += Integer.parseInt(arr[i]);
            }  
        }

        //x계수, 정수의 접합 수술을 진행한다.
        answer += (x==0)? &quot;&quot;: (x==1)? &quot;x&quot;: x+&quot;x&quot;;
        answer += (num==0)? &quot;&quot;: (answer.length()&gt;0)? &quot; + &quot;+num : num ;

        return answer;
    }
}</code></pre><p><del>삼항연산자가 드러워보인다</del></p>
<p>코드 설명 :
다항식을 할당하는 변수 answer에 x의 계수, 정수에 대한 예외 사항을 적용하여 각각 적용한다. 예외는 다음과 같다. </p>
<p>x의 계수나 정수가 0일때 -&gt; 다항식에 표기되지 말아야한다. 
x의 계수가 1일때 -&gt; &quot;x&quot;</p>
<p>또한 &quot; + &quot;의 형태로 피연산자가 이어져야한다. 
ㄴ-&gt; 해결 : 뒤에 오는 정수에 조건에 포함했다. 
(만약 앞에 항이 있다면 &quot; + &quot;를 포함한 형태로 할당되게끔🫥 length()이용)</p>
<p>아쉬운 점 : 코드자체가 길고 한 눈에 이해가 어렵다. 특히 각 계수를 세는 방법이나 answer를 따로 할당하는 방법이 깔끔하지 않다. 알고리즘 자체의 변화가 있었으면 하는 아쉬움이 있었다. 🥲</p>
<p><br><br></p>
<h2 id="🌼다른-사람의-풀이">🌼다른 사람의 풀이</h2>
<pre><code>
class Solution {
    public String solution(String polynomial) {
        int xCount = 0;
        int num = 0;

        for (String s : polynomial.split(&quot; &quot;)) {
            if (s.contains(&quot;x&quot;)) {
                xCount += s.equals(&quot;x&quot;) ? 1 : Integer.parseInt(s.replaceAll(&quot;x&quot;, &quot;&quot;));
            } else if (!s.equals(&quot;+&quot;)) {
                num += Integer.parseInt(s);
            }
        }
        return (xCount != 0 ? xCount &gt; 1 ? xCount + &quot;x&quot; : &quot;x&quot; : &quot;&quot;) + (num != 0 ? (xCount != 0 ? &quot; + &quot; : &quot;&quot;) + num : xCount == 0 ? &quot;0&quot; : &quot;&quot;);
    }
}</code></pre><p>🥺
처음봤을때 코드가 정말 잘생기고 이쁘다는 생각이 들었다.
역시 다른 사람의 풀이에서 배울 것이 너무 많다. </p>
<br>

<h3 id="배운-점">배운 점</h3>
<p><code>for (String s : polynomial.split(&quot; &quot;))</code> 
split으로 인한 분리를 따로 어딘가에 할당하지 않고 바로 for-each문으로 순환하였다.</p>
<p>만약 x를 포함하고 있다면 계수를 떼어서 xCount에 더해주었다. 그에 반해 정수라면 num이라는 정수의 합을 세는 변수에 수를 추가해주었다. </p>
<p><code>return (xCount != 0 ? xCount &gt; 1 ? xCount + &quot;x&quot; : &quot;x&quot; : &quot;&quot;) + (num != 0 ? (xCount != 0 ? &quot; + &quot; : &quot;&quot;) + num : xCount == 0 ? &quot;0&quot; : &quot;&quot;);</code>
계산된 다항식을 삼항을 통한 예외처리 후 별도의 변수에 할당없이 바로 반환하였다. 😍😍😍</p>
<p>삼항연산자를 한 줄로 썼음에도 각 부분별 예외처리가 자세히 보인다.</p>
<p>이목구비가 뚜렷한 코드같다 🤔🤔</p>
<br>

<h3 id="반성">반성</h3>
<p>삼항을 쓸때 각 섹션별 분류가 중요할 듯하다. 
또한 변수에 사용이 정말 필요한가 다시 생각해보는 것도 좋을 듯하다.
최적화와 연관이 되어있으니🥺</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공C] 4주]]></title>
            <link>https://velog.io/@red-orange/%ED%98%BC%EA%B3%B5C-4%EC%A3%BC</link>
            <guid>https://velog.io/@red-orange/%ED%98%BC%EA%B3%B5C-4%EC%A3%BC</guid>
            <pubDate>Wed, 24 Jul 2024 16:19:38 GMT</pubDate>
            <description><![CDATA[<ol>
<li><input disabled="" type="checkbox"> 함수란 무엇인가</li>
<li><input disabled="" type="checkbox"> 함수의 종류</li>
<li><input disabled="" type="checkbox"> my love🌹_ 재귀함수<sub>recursive call fn</sub></li>
</ol>
<blockquote>
<p>안녕하세요
<sup>인용문을 넣으면 좋을거같아서 넣어보았습니다.</sup></p>
</blockquote>
<br>

<h2>함수?</h2>

<p>😘함수의 3단계 </p>
<ul>
<li><code>함수 정의</code> : 함수에 대한 내용을 정의하는 것</li>
<li><code>함수 선언</code> : 함수 사용을 컴파일러에게 알리기 위해 전처리기나 main,특정 함수 안에 쓰는 것</li>
<li><code>함수 호출</code> : 함수를 사용하기 위해 부르는 것, 매개변수라고 불리는 값을 괄호 안에 넣어 전달한다</li>
</ul>
<p><em>*함수 선언에 경우, 함수 정의를 상단에 하는 경우 생략이 가능하다.</em>
<em>*함수 호출에서는 인자, 함수 정의 시 사용되는 변수를 매개변수라 부르나 보통 섞어서 쓰기도 한다.</em></p>
<br>

<p><em>&amp;예시&amp;</em></p>
<pre><code>#include &lt;stdio.h&gt;

int add(int, int); //1.함수 선언 : 인자에 대한 변수는 생략가능

int main(){
    int a = 1;
    int b = 2;

    printf(&quot;%d&quot;,add(a,b)); //2.함수 호출 : 인자값 전달

    return 0;
}

int add(int n,int m){ //3.함수 정의 : return값은 하나만 가능하다
    return n+m;
}</code></pre><ol>
<li>== int add(int n, int m); ++ 함수 원형을 작성.</li>
<li>return 값이 있을 수도 있으며 없을 수도 있다. </li>
<li>main()에서 온 인자값은 add()의 지역변수 n,m으로 값이 복제된다.</li>
</ol>
<br>

<h2 id="함수의-종류💖">함수의 종류💖</h2>
<h4 id="1-return-값이-없는-함수">1. return 값이 없는 함수</h4>
<pre><code>#include &lt;stdio.h&gt;

void apple_cnt(int); //void:데이터없음.

int main(){
    int a = 1;
    apple_cnt(1);
    return 0;
}
void apple_cnt(int a){
    printf(&quot;I have %d apples&quot;,a);
    return; //작업을 끝내길 원할때 언제나 끝낼 수 있다. 
}
</code></pre><p>return 값이 없어도되나 값을 필요로 하는 출력에 사용될 수 있다. </p>
<br>

<h4 id="2-매개변수가-없는-함수">2. 매개변수가 없는 함수</h4>
<pre><code>#include &lt;stdio.h&gt;

int scan(void);

int main(){
    int a[3];

    //함수 호출&amp;배열에 각 값을 할당
    for(int i=0; i&lt;3; i++){
        printf(&quot;%d index방 입력 : &quot;,i);
        a[i] = scan(); //void는 호출시 사용x

    return 0;
    }

    //전체 출력 
    for(int i=0; i&lt;3; i++)
        printf(&quot;%d ,a[i]&quot;);
}
int scan(void){
    int a;
    scanf(&quot;%d&quot;,&amp;a);
    return a;
}</code></pre><p>매개값이 필요없을 때 주로 사용한다. </p>
<br>

<h4 id="3-return도-매개변수도-없는-함수">3. return도, 매개변수도 없는 함수</h4>
<pre><code>#include &lt;stdio.h&gt;

void hello(void);

int main(){
    printf(&quot;지금부터 인사 10번 해볼게요 얍!&quot;);

    for(int i=0; i&lt;10; i++)
        hello();

    return 0;
}
void hello(void){
    printf(&quot;Hello!\n&quot;);
}</code></pre><p>단순 출력에 사용되었다. </p>
<p><br><br></p>
<h2 id="재귀호출-함수">재귀호출 함수</h2>
<p>자기 자신을 호출해서 사용 후, 조건문을 통해 빠져나온다. </p>
<br>
<sub>WhY?</sub> 왜 이렇게는 실행이 안될까? 🫥😢
그동안 그냥 혹은 빨리 넘기며, 왜 인지는 생각을 안해보았다.

<pre><code>#include &lt;stdio.h&gt;

void apple(void);

int main(){
    apple();
    return 0;
}
void apple(void){
    printf(&quot;apple\n&quot;);
    apple();
}</code></pre><p>문제점 분석 </p>
<ol>
<li>&#39;재귀&#39;함수이기에, 자신을 계속 부르게된다. -&gt; 끝없는 루프가 이어진다. </li>
<li>위의 코드로는 재귀 함수의 종료 조건을 걸 수 없다. </li>
<li>재귀가 깊고 많아져서 스택 메모리가 초과되는 현상이다. -&gt; 오류 발생 가능성</li>
</ol>
<p>*스택 메모리- 함수 호출 마다 정보가 쌓이는 메모리.</p>
<br>
<sub>apple을 10번 출력하는 재귀호출 함수</sub>



<pre><code>#include &lt;stdio.h&gt;

void apple(int);

int main(){
    apple(1);
}
void apple(int cnt){
    if(cnt&gt;10) return 0; //종료를 의미 
    printf(&quot;apple\n&quot;);
    cnt++;
    apple(cnt+1);
}</code></pre><br>
개선 
1. 매개변수에 시작하는 수를 넣어주며 cnt를 할 수 있도록 하였다. 전달된 값은 stack memory에 쌓인 채로 존재한다. 
2. apple(cnt)로 쓰면 값의 증가가 일어나지 않아 계속 apple(1)인 상태로 재귀를 한다. 
3. if문을 넣어 cnt가 조건을 넘으면 종료를 하도록 하였다.

<br>

<p>다음엔 꼬리재귀에 대해서도 알아보고 싶습니다.
헤야할 일
-어떻게 컴파일 최적화가 이루어지는지 
-어떤 과정인지
-알고리즘 별로 어떻게 달라지는지 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공C] 3주]]></title>
            <link>https://velog.io/@red-orange/%ED%98%BC%EA%B3%B5C-3%EC%A3%BC</link>
            <guid>https://velog.io/@red-orange/%ED%98%BC%EA%B3%B5C-3%EC%A3%BC</guid>
            <pubDate>Sun, 21 Jul 2024 19:05:17 GMT</pubDate>
            <description><![CDATA[<ul>
<li><input disabled="" type="checkbox"> chapter 5 선택문</li>
<li><input disabled="" type="checkbox"> chapter 6 반복문</li>
</ul>
<br>

<h3>제어문</h3>

<p><code>제어문</code>~-&gt; 선택문(if,switch), 반복문(while), 분기문(break,continue,goto,return)</p>
<p>조건에 따라 명령을 제어한다. </p>
<h4>if문</h4>

<ol>
<li><p>단독 
<code>return ;</code></p>
</li>
<li><p>if-else</p>
</li>
</ol>
<pre><code>if(a==b) return a;
else return b;</code></pre><p>이때 else에는 조건을 쓰지 않는다.</p>
<ol start="3">
<li>if-else if-(else)</li>
</ol>
<pre><code>if(a==b) return a;
else if(a!=b) return b;
else return c;
</code></pre><h4>switch case</h4>


<pre><code>switch(a){
    case 1: 
        a=1; break;
    case 2:
        a=2; break;
    default :
        a=1024;
}
</code></pre><ul>
<li>switch() 괄호 안에는 값이 들어간다. </li>
<li>case들은 일종의 if조건문이며 괄호안의 값과 일치한지 확인한다. </li>
<li>break;를 쓰지 않는다면 조건이 참이 되는 부분부터 쭈우욱 실행된다. </li>
<li>default는 위의 모든 이 이뤄지지 않았을때 실행되고 마지막에 오기에 break는 필요가 없다<br>

</li>
</ul>
<h3>도전예제</h3>
<h4>계산기 프로그램</h4>


<pre><code>#include &lt;stdio.h&gt;

int main(){
    int a,b,answer;
    char op;
    printf(&quot;사칙연산 입력(정수) : &quot;);
    scanf(&quot;%d%c%d&quot;,&amp;a,&amp;op,&amp;b); //입력

    switch(op){ 
        case &#39;+&#39;: answer=a+b; break;
        case &#39;-&#39;: answer=a-b; break;
        case &#39;*&#39;: answer=a*b; break;
        case &#39;/&#39;: answer=a/b; break; //피연산자가 전부 정수라서 정수값 반환
    }

    printf(&quot;%d%c%d=%d&quot;,a,op,b,answer); //출력

    return 0;
}
</code></pre><pre><code>
//또다른 풀이
#include &lt;stdio.h&gt;

int main(){
    int a,b,answer;
    char op;
    printf(&quot;사칙연산 입력(정수) : &quot;);
    scanf(&quot;%d%c%d&quot;,&amp;a,&amp;op,&amp;b); //입력, 같다.

    answer = (op==&#39;+&#39;)?a+b:(op==&#39;-&#39;)?a-b:(op==&#39;*&#39;)?a*b:(op==&#39;/&#39;)?a/b: -4444; //-4444는 예외처리

    printf(&quot;%d%c%d=%d&quot;,a,op,b,answer); //출력

}
</code></pre><p><br><br><br></p>
<h2 id="반복문">반복문</h2>
<p>종류 : while, for, do-while</p>
<pre><code>
while - 조건 강조

for - 실행 횟수 강조
    - 분기문(break(주변에 블록하나를 깨트림)
            continue(블록끝에서 실행)

do~while - 한 번 무조건 실행을 강조

</code></pre><h3 id="확인문제😘">확인문제(😘)</h3>
<h4 id="x자-별모양-출력">x자 별모양 출력</h4>
<p>1.첫번째 풀이 </p>
<pre><code>int main(){
    printf(&quot;*   *&quot;);
    printf(&quot; * * &quot;);
    printf(&quot;  *  &quot;);
    printf(&quot; * * &quot;);
    printf(&quot;*   *&quot;);

    return 0;
}</code></pre><p>이렇게 쓸 수 있지만 문제의 목적에 맞지 않으므로 풀이가 틀린답이겟져.?😢
<br>
2. 두번째 풀이</p>
<pre><code>#include &lt;stdio.h&gt;

int main(){
    for(int i=0; i&lt;5; i++){
        for(int j=0; j&lt;5; j++){
            if((i+j)==4 || i==j)
                printf(&quot;*&quot;);
            else
                printf(&quot; &quot;);
        }
        printf(&quot;\n&quot;);
    }
    return 0;
}</code></pre><br>

<h4 id="도전실전예제---소수-출력-프로그램prime-num">도전실전예제 - 소수 출력 프로그램(prime num)</h4>
<ol>
<li>첫 시도 [실패]<pre><code>#include &lt;stdio.h&gt;
</code></pre></li>
</ol>
<p>int main(){
    int number;
    printf(&quot;2 이상의 정수를 입력하세요 : &quot;);
    scanf(&quot;%d&quot;,&amp;number);</p>
<pre><code>int br=0;
for(int i=2; i&lt;number; i++){
    if(number%i){
        int cnt = 0;
        for(int D=2; D&lt;i; D++){
            if(D%i)
                cnt ++;    
        }
        if(!cnt==0)
            printf(&quot;%2d   &quot;,i);
    }
}

return 0;</code></pre><p>}</p>
<pre><code>#### 코드해석
- br = 줄바꿈
- flow  
        number에서 입력된 수 만큼 for문을 돌린다. 
        만약 증가하는 i와 number가 0으로 나눠진다면(?)
        for문을 다시 i만큼 중첩으로 돌린다. 
        그 후 증가하는 D와 i가 서로 나눠서 0이 된다면(?)
        cnt를 증가한다. 
        cnt가 0이면 소수다(?)

이유 
- 소수가 나오는 형태를 이해하지 못했다. 
- 코드의 흐름을 보면 세울 알고리즘을 정리 못한 듯하다(말이 안된다). 
&lt;br&gt;

문제 재정의</code></pre><p>예제의 목표 : 입력한 수까지의 소수를 전부 출력한다. (2이상)
소수란 : 1과 자신만을 약수로 가지는 수</p>
<p>HOW : for문으로 입력한 수까지 증가하면서 해당 숫자가 1과 자기 자신을
약수로 가지고 있는지 확인해야한다.</p>
<p>HOW2 : 어떻게 1과 자기 자신을 약수로 가졌는지 확인할 것인가?</p>
<ol>
<li>해당 수를 범위로 for문을 돌리며 나누었을때(해당 수와 증가값) 0으로 나눠지면 안된다.</li>
</ol>
<p>-&gt; 중첩문 사용!</p>
<pre><code>
&lt;br&gt;
&lt;br&gt;

2. 두번째 시도도도 도도새</code></pre><p>#include &lt;stdio.h&gt;
#include &lt;stdbool.h&gt;</p>
<p>int main(){
    int n; 
    printf(&quot;숫자 입력 : &quot;);
    scanf(&quot;%d&quot;,&amp;n);</p>
<pre><code>//*n과 i의 인과관계는 없다. 

int br = 0; //줄바꿈 
for(int i=2; i&lt;n; i++){
    bool flag = true; //나눠지는 지 여부를 조사하는 flag // 소수라는 가정으로 true 
    for(int j=2; j&lt;i; j++){
        if(i%j==0)
            flag = false;
    }
    if(flag){
        printf(&quot;%2d  &quot;,i);
        br++;
        if(br%5==0)
            printf(&quot;\n&quot;);
    }
} 
return 0;</code></pre><p>}</p>
<pre><code>주목점 : for문에 증가하는 i는 n과 인과관계가 없다. -&gt; n은 for문의 범위이다. 

flow  : 
1. 전체 for문은 입력된 숫자 `n`만큼 2부터 증가한다.
2. 전체 for문 안에서 `flag`를 사용하여 판별 여부를 알 수 있다. 
3. i를 입력 받았다면 `i`가 소수인지 판별한다. (약수가 1과 자신외에 없는가?)
4. 있다면 flag를 false로 바꾼다. 있다면 조건문에 의해 출력된다. 
&lt;h5&gt;위의 경우와 같이 줄바꿈을 하는 경우 flag 조건문에서 br을 판별해야한다.
  &lt;br&gt;
 전체 for문 블록이며 flag 판별 if문 아래에 넣었는데 결과가 완전 이상하게 나왔다🫥🫥😶‍🌫️😶‍🌫️

&lt;/h5&gt;  
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공C] 씨는 즐거워! ]]></title>
            <link>https://velog.io/@red-orange/%ED%98%BC%EA%B3%B5%EC%94%A8-%EC%94%A8%EB%8A%94-%EC%A6%90%EA%B1%B0%EC%9B%8C</link>
            <guid>https://velog.io/@red-orange/%ED%98%BC%EA%B3%B5%EC%94%A8-%EC%94%A8%EB%8A%94-%EC%A6%90%EA%B1%B0%EC%9B%8C</guid>
            <pubDate>Sun, 14 Jul 2024 16:04:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>ref
이 블로그는 제가 중얼대며 공부하는 블로그입니다.<br>이상한 말에 대한 조언은 너무 감사합니다. </p>
</blockquote>
<br>

<h4 id="full-course">&quot;full course&quot;</h4>
<ul>
<li><input disabled="" type="checkbox"> 제어문자</li>
<li><input disabled="" type="checkbox"> 입출력 // printf함, puts() gets()</li>
<li><input disabled="" type="checkbox"> 변수 </li>
<li><input disabled="" type="checkbox"> 예약어 식별자😍</li>
<li><input disabled="" type="checkbox"> #define _CRT_SECURE_NO_WARNINGS 106p</li>
<li><input disabled="" type="checkbox"> 연산자 </li>
<li><input checked="" disabled="" type="checkbox"> c언어 사랑</li>
</ul>
<br>

<hr>
<br>

<h3 id="c기본형-💖">C기본형 💖</h3>
<pre><code>#include &lt;stdio.h&gt; #전처리기

int main(){ #main 함수
printf(&quot;first C&quot;);
printf(&quot;%s&quot;,&quot;i love C&quot;);

return 0; #종료 
}</code></pre><p>C는 헤더파일에 있는 일종의 지침서를 가지고 와서 실행한다. 
그 헤더파일을 보고 소스파일의 명령어를 알잘딱해서 실행하는 것이조.</p>
<p>return 0은 main함수가 정수를 반환하는 것으로 명시되었기에 0을 반환
또한 0으로 리턴되며 OS에 정상종료를 한다. </p>
<p>현재는 생략이 가능한데 대부분 컴파일러에서 생략 가능
써도 안써도 괜찮은 상태!!</p>
<h3 id="제어문자-모음집escape-sequence">제어문자 모음집(escape sequence)</h3>
<p>\n : 다음줄이동, 개행문자 
\b : 출력 커서가 한 칸 왼쪽으로 이동 
\r : 캐리지 리턴, 처음으로 이동 
\a : 벨소리
&quot; : 출력시 &quot;
&#39; : 출력시 &#39;
\ : 출력시 <br>\t : 커서를    탭만큼 옮긴다</p>
<p>등등.. <del>흥미로운 캐리지리턴</del></p>
<br/>

<h3 id="scanf♥️printf-gets❤️puts">scanf()♥️printf(), gets()❤️puts()</h3>
<pre><code>#include &lt;stdio.h&gt;

int main(void){
    int n; //2입력가정 
    scanf(&quot;%d&quot;,&amp;n); //&amp; 무조건 작성
    printf(&quot;너가 입력한 수는 바로바로 짠짠 %d야!&quot;,n);

    int m; 
    gets(m); //3 입력가정
    puts(m);

}</code></pre><p>위의 네 함수 모두 헤더파일 stdio.h에 위치한다. </p>
<p>scanf()는 주소 엑세스를 통해 입력을 하므로 &amp;(주소연산자) 중요! , 토큰별 입력
printf()는 변환문자(%d..)를 사용하며 문자열로 변환하는 과정이 있다.</p>
<p>이외에도 변환 문자는 </p>
<ul>
<li>실수형
  <code>printf(&quot;%.1lf&quot;);</code> -&gt; 1자리 까지 반올림<ul>
<li>%lf (double)</li>
<li>%f (float)</li>
</ul>
</li>
<li>정수형 
  <code>printf(&quot;%10d&quot;);</code> -&gt; 10칸을 확보<ul>
<li>%d</li>
</ul>
</li>
<li>문자/문자열<ul>
<li>%s(문자열) <code>printf(&quot;%s&quot;,char[10]);</code></li>
<li>%c(character) </li>
</ul>
</li>
</ul>
<p>이외.. %p(주소) 
<br></p>
<p>gets()는 입력을 담당, &amp;를 사용x , 한 줄을 기준으로 입력을 받는다. 
puts()는 출력이며, 자동으로 줄바꿈을 한다</p>
<br>

<h3 id="변수">변수</h3>
<p><code>int a=10;</code>
&#39;=&#39;는 대입연산자, 가장 늦게 적용된다.
a방에 10이 들어간 형태이며, 이때 a방의 데이터 타입은 int(정수)이기에 a방에는 정수인 것만 들어갈 수 있다. </p>
<h4 id="데이타-타입">데이타 타입</h4>
<table>
<thead>
<tr>
<th align="center">type</th>
<th align="center">byte</th>
</tr>
</thead>
<tbody><tr>
<td align="center">char</td>
<td align="center">1byte</td>
</tr>
<tr>
<td align="center">short</td>
<td align="center">2byte</td>
</tr>
<tr>
<td align="center">int</td>
<td align="center">4byte</td>
</tr>
<tr>
<td align="center">long</td>
<td align="center">4byte</td>
</tr>
<tr>
<td align="center">long long</td>
<td align="center">8byte</td>
</tr>
<tr>
<td align="center">float</td>
<td align="center">4byte</td>
</tr>
<tr>
<td align="center">double</td>
<td align="center">8byte</td>
</tr>
<tr>
<td align="center"><em>컴파일러마다 크기가 다를 수도 있으니 sizeof()를 사용하여 확인 필수❤️</em></td>
<td align="center"></td>
</tr>
</tbody></table>
<p><br><br></p>
<h4 id="unsigned-signed">unsigned signed</h4>
<p><code>(signed) int a = 10;</code>
사실은 signed가 변수 선언 앞에 생략되어 있다., </p>
<p><code>unsigned int a;</code>로 선언한다면, int의 표현가능범위의 2배를 양수로 사용할 수 있다. 
<br></p>
<h4 id="문자열-저장">문자열 저장</h4>
<p>String 데이터 타입이 없다. </p>
<p>-&gt; <code>char 배열명[문자열길이+1] = 문자열</code>
-&gt; <code>chat array[6] = &quot;apple&quot;;</code>
    ㄴ 마지막 인덱스는 null이 들어간다.ㅣ문자열의 끝은 null이 알린다. </p>
<h4 id="실수형-특징">실수형 특징</h4>
<p>컴퓨터 실수 표현방식에 의해 오차가 나타난다. 
float : 소수점 아래 7자리 유효
double : 소수점 아래 15자리 유효</p>
<p>정수형으로 바꾸는 습관은 좋다! 
<br><br></p>
<h4 id="const">const</h4>
<p>변수는 변하는 수 언제나 바꿀 수 있으나, 
const(상수 constant)는 바꿀 수 없다. </p>
<p>const (자료형) (변수명) = 값; 으로사용 
<br><br></p>
<h3 id="예약어-식별자">예약어&amp; 식별자</h3>
<p>예약어(reserved word/key word) : 컴파일러 속 사용방법이 약속된 단어
식별자(identifier) : 필요에 따라 만들어 쓰는 단어</p>
<blockquote>
<h4 id="식별자의-규칙">식별자의 규칙</h4>
<p>-알파벳대소, 숫자, _로 만듭니다. 
-숫자로 시작X
-대소문자의 구분
-예약어는 식별자로 사용X</p>
</blockquote>
<br>

<h3 id="비정상-종료">비정상 종료</h3>
<pre><code>char a[2];
scanf(&quot;%d&quot;,&amp;a); //input : &quot;constant&quot;</code></pre><p>문자열이 저장될 곳보다, 저장하는 내용이 크다. 
프로그래머스에서는 core dumped하는 모습을 자주보고 눈물을 훔chin 나날들. </p>
<p>이외 gets, strcpy(복사복사) 사용 시 발생가능 </p>
<p>VC++ 컴파일러에서는 위의 사태로 인한 비정상 종료 우려로인해 경고장을 보내곤한다. </p>
<p>그때 &#39; #define _CRT_SECURE_NO_WARNINGS&#39;를 사용하면 경고장이 안날라온다. <del>함수 잘쓸테니까 에러 그만보내</del>
<br></p>
<h3 id="연산자">연산자</h3>
<p>a-b -&gt; 피연산자 : a,b / 연산자 : - 
a++ -&gt; 피연산자 : a / 연산자 : ++
(a&lt;b)? 1: 0; -&gt; 피연산자 : (a&lt;b),1,0 / 연산자 : ?, :</p>
<p>산술연산자: +,- 
나누기 나머지: /,%
대입연산자: 오른쪽을 왼쪽에 저장 = 
관계연산자: &lt; &lt;= &gt; &gt;= == !=
논리연산자: &amp;&amp;(and), ||(or), !(not)
-121p</p>
<h2 id="확인문제">!확인문제</h2>
<ol>
<li>short 형과 long형위 자료형 크기를 비교해 크기가 큰 자료형이 무엇인지 출력하는 프로그램이 완성되도록 빈칸을 채우세요<pre><code>#include &lt;stdio.h&gt;
</code></pre></li>
</ol>
<p>int main(){
    int result;
    //sizeof 연산자 활용 
    if(sizeof(short)&lt;sizeof(long))
        printf(&quot;long&quot;);
    else
        printf(&quot;short&quot;);</p>
<pre><code>return 0;</code></pre><p>}</p>
<pre><code>&lt;br&gt;
2. 야구경기장의 좌석 수가 70개이고, 입장객 수가 65명일 때, 입장률을 표시하는 프로그램이 완성되도록 빈칸을 채우세요.
</code></pre><p>#include &lt;stdio.h&gt;</p>
<p>int main(){</p>
<pre><code>int seats = 70;
int audience = 65; 
double rate = 65/70*100; //입장률 저장 변수 

printf(&quot;%.1lf&quot;,rate);</code></pre><p>}</p>
<pre><code>&lt;br&gt;
3. 3.76시간은 몇 시간, 몇 분, 몇 초인지 출력하는 프로그램이 완성되도록 빈칸을 채우세요.
</code></pre><p>#include &lt;stdio.h&gt;</p>
<p>int main(){
    int hour, min, sec; 
    double time = 3.76;</p>
<pre><code>hour = (int)time;
min = (int)(time-hour*60);
sec = (min-(time-hour*60))*0.6;</code></pre><p>}</p>
<pre><code>

### 도전 실전 예제 148p
체중(kg), 키(cm)를 입력해 BMI(신체질량지수)를 구한 후 BMI 값이 20.0이상 25.0 미만이면 &quot;표준입니다&quot;를 출력, 그렇지 않다면 &quot;체중관리가 필요합니다.&quot;를 출력합니다.

BMI는 표준체중, 저체중, 과체중을 판별한느 수치로 몸무게를 키의 제곱으로 나누어 구합니다. 
</code></pre><p>#include &lt;stdio.h&gt;</p>
<p>int main(){
    int ki,momm;
    printf(&quot;몸무게(kg)과 키(cm) 입력 : &quot;);
    scanf(&quot;%d %d&quot;,&amp;ki,&amp;momm);</p>
<pre><code>double bmi = momm/(ki*ki);

if(20.0&lt;=bmi&amp;&amp;bmi&lt;25.0)
    printf(&quot;표준입니다.&quot;);
else
    printf(&quot;체중관리가 필요합니다.);

return 0;</code></pre><p>}</p>
<p>좋은 하루 보내세요</p>
]]></description>
        </item>
    </channel>
</rss>