gkswlcjs2의 등록된 링크

 gkswlcjs2로 등록된 네이버 블로그 포스트 수는 206건입니다.

Async(비동기) 함수 이해 [내부링크]

최근 회사 업무를 하면서 Async 형으로 주어지는 API를 받아서 코드를 짜보았다. 코드를 짜면서 내 부족했던 운영체제 개념을 다시 정립하게 되었는데, 이를 글로 남겨보려고 한다. Async 함수란? "비동기"란 어떤 작업이 완료될 때까지 프로그램 실행이 블로킹되지 않고, 다른 작업을 계속 진행할 수 있는 방식을 의미한다. 주로 특정 함수를 BackGround에서 실행시킬때 사용된다. *(주로 자바스크립트에서 자주 이용된다고 하는데, 이 글은 C언어 기반 임베디드 펌웨어에서 동작하는 원리를 설명하려고 한다.) 비동기 프로그래밍의 장점 I/O 작업이나 네트워크 요청과 같이 시간이 오래 걸리는 작업을 백그라운드에서 처리하여 애플리케이션은 Stuck되지 않고 다른 작업을 계속 수행할 수 있다. 순차적 실행과는 다른 관점으로 접근해야 한다. C언어 뿐만 아니라 다양한 언어를 사용하며, 디버거를 사용해본 경험이 있을 것이다. 디버거를 사용하면 1 line씩 코드를 실행하며 우리가 작성한 코

[C++] 백준 1406 연결리스트 풀이 [내부링크]

문제 풀이 #include <iostream> #include <string> using namespace std; typedef struct NODE { NODE* LLINK; char data; NODE* RLINK; }; NODE* head ; NODE* tail ; void CreateNode() { head = new NODE; tail = new NODE; head->LLINK = NULL; head->data = '\0'; head->RLINK = tail; tail->LLINK = head; tail->data = '\0'; tail->RLINK = NULL; } void InsertNode(NODE* node, char data) { // Insert 'newnode' front of 'node' NODE* newnode = new NODE; newnode->data = data; newnode->RLINK = node; newnode->LLINK = node->LL

[Git] 레파지토리 복구(Github 지원 요청 방법) [내부링크]

상황설명 한 저장소의 커밋을 다른 저장소에 추가하고 싶었다. 하나를 'A'라고 가정하고, 다른 하나를 'B'라고 했을때 다음의 명령어를 실행했다. git clone --mirror https://github.com/myname/A.git 그리고 나서 다음 명령어를 실행했다. git push --mirror https://github.com/myname/B.git 레파지토리를 확인했을때, B의 모든 커밋이 사라져있었고 A와 동일해져 있었다....... 구글링해봐도 커밋 기록이 있어야 복원을 하는데, 모든 커밋 기록이 사라졌기에 복원을 할 수 없을 것 같았다. 로컬에 백업둔것도 없어서, 정말 "나는 왜 이렇게 어리석을까.."하며 자책하다가, 혹시나 하는 마음에 깃헙 지원 요청을 해봤다. 다행히 친절한 Haruna씨가 도와주어서, 복구 완료했다... 내 프로젝트라서 다행이지, 만약 이게 협업하는 프로젝트라면 어땠을까... 생각만 해도 아찔하다.. 교훈: 로컬에 백업 하자, 함부로 pus

CPU 스케쥴링 [내부링크]

Basic Concepts CPU 스케쥴링 멀티프로그래밍의 목표 동시에 동작하는 프로세스를 가지는 것 CPU 이용을 최대화하는 것 빈도 분석 CPU Bound(Burst)의 빈도수를 분석해봤을때, long CPU Burst는 빈도수가 적고, 보편적으로 short CPU BURST는 빈도수가 많다. CPU 스케쥴러 메모리에 있는 프로세스들로부터 프로세스를 선택한다 실행할 준비가된 프로세스에 CPU를 할당한다 다음에 어떤 프로세스를 할당할지 어떻게 선택할 수 있는가? 링크드 리스트? 이진 트리? FIFO 큐? 그렇다면 어떻게 프로세스의 우선 순위를 정할 수 있는가?? Preemptive vs Non-preemptive CPU-scheduling 결정은 아래 4가지 상황에 따른다. Decesion Making for CPU-scheduling: Process state running → waiting state 선택권이 없이 non-preemtive Process state running

프로세스 [내부링크]

프로세스 컨셉 프로세스란? Program in excution 프로세스당 최소 한 개의 스레드를 가지고 있다. 프로세스는 독립된 메모리 영역을 할당받는다. 한 프로세스가 다른 프로세스의 자원에 접근할 수 없다. IPC를 이용하면 가능하다. 메모리 구조 코드 데이터 스택 힙 프로세스 상태 다이어그램 프로세스를 생성하고 종료하기까지 진행과정을 표현한 다이어그램 New 프로세스가 생성된 상태 Running 명령어가 실행되는 상태 Waiting 프로세스가 어떤 이벤트가 발생하길 기다리는 상태 I/O 완료 혹은 시그널을 기다리는 것과 같이.. Ready 프로세스가 프로세서에게 할당되기를 기다리는 상태 Terminated 프로세스가 실행을 종료한 상태 PCB(Process Control Block) OS에서 프로세스를 관리할때 필요한 정보를 자료 구조로 표현한 것 내용 Process state Program counter CPU registers CPU-scheduling information

[C++] 백준 14891(DFS) [내부링크]

문제 문제가 너무 길어서 생략하겠습니다. 링크 참조... 접근법 이 문제를 풀면서 크게 두 가지 부분으로 나누어서 생각했다. 톱니를 선택 주변 탐색 자신의 양 옆 톱니의 극을 확인해서,(저는 우측,좌측 톱니 순으로 확인했지만 순서는 중요하지 않습니다.) 가장 우측에 있는 톱니부터 돌기 시작해서, 최초 선택한 톱니 우측에 있는 톱니에 도달한다면, 가장 좌측의 톱니로 이동하고 최초 선택한 톱니의 좌측에 있는 톱니까지 회전한다면, 최초 선택한 톱니가 회전합니다.(선택한 톱니는 가장 나중에 회전) 돌 수 있다면 돌리고, 아니면 stay 나머지 해설은 주석을 참조해주세요! 소스 코드 #include <iostream> #include <vector> #include <string> #define abs(a) ((a)>(0)?(a):(-a)) using namespace std; vector<int> q1,q2,q3,q4; vector<pair<int,int> > m; int K, num, d

[Java] 프로그래머스 가장 큰 수 [내부링크]

문제 접근법 1 첫번째로 풀었던 방법은 다음과 같았다. numbers로 만들 수 있는 모든 경우의 수를 생각한다(DFS) 정렬 후 거기서 가장 큰 수를 리턴한다. import java.io.*; import java.util.*; class Solution { boolean visited[] ; int length; String ans = "0"; List<Integer> nums = new ArrayList<>(); void dfs(int cnt, String str){ if(cnt == length){ Long num = Long.parseLong(str); if(num > Long.parseLong(ans)) ans = str; return ; } for(int i=0;i<length;i++){ if(visited[i]) continue; visited[i] = true; dfs(cnt+1,str+nums.get(i)); visited[i] = false; } } public

맥북-아이패드 사이드카 안뜰때 [내부링크]

약 1시간 동안 삽질했네요. 누군가는 저 같이 시간낭비 하지 않길 바라는 마음에 포스팅 합니다. 거두절미하고 본론만 말씀드리겠습니다. Wifi, Bluetooth를 껐다가 켜보세요. 맥북과 아이패드가 동일한 네트워크에 있는지 확인해주세요. 애플 계정을 로그아웃하고 재 로그인 시도해보세요. 두 기기를 재부팅해보세요. 핸드오프(시스템 환경설정 > 일반 > 핸드오프 허용) 기능이 활성화 되어있어야 합니다. 이미 활성화 되어 있더라도 맥북, 아이패드 둘다 비활성화 후 다시 활성화 시켜보세요. 전 이 부분이 문제였습니다...

[Java] 문자열 압축 [내부링크]

문제 접근법 3번 예제로, 길이 10인 "abcabcdede" 문자열을 압축하는 경우를 살펴보겠습니다. 압축 단위에 따라 다음과 같이 표현됩니다. 1. 단일 문자 단위 a, b, c, a, b, c, d, e, d, e 2. 두 문자 단위 ab, ca, bc, de, de 3. 세 문자 단위 abc, abc, ded, e 4. 그 이상의 단위는 생략하겠습니다. 여기서 포인트는 다음과 같습니다. 길이의 절반인 값보다 큰 값으로 압축하는 것은 의미 X 길이가 10인데, 압축 단위가 6이면 해당 단위로는 문자열 압축을 못하겠죠? 특정 인덱스 문자열이 이전 문자열 혹은 다음 문자열과 같은지'만' 비교 문자열이 연속적으로 같아야 압축이 가능합니다. 이러한 비교를 위해 스택을 사용하는 방법을 고안하였고 다음과 같이 구현하였습니다. import java.io.*; import java.util.*; class Solution { public int solution(String s) { int l

[Java] N으로 표현 [내부링크]

문제 접근법 1 첫번째로 생각했던 방법은 점화식을 만드는 것이었습니다. 이 방법으로 꽤 고민해봤지만 결론은 "일반적인 사칙연산 점화식으로 표현할 수 없다." 였습니다. 점화식을 세우기 위해서는 아래와 같이 "Bottom-Up" 형식으로 밑에서 부터 쌓아나아가야 합니다. ------------------------------------ dp[target] = dp[target-1] + dp[1]; dp[target] = dp[target-2] + dp[2]; ... dp[target] = dp[target-n] + dp[n]; ------------------------------------- dp[target] = 위 값중 최소값 그런데 문제에서처럼 N을 붙이는 것이 가능하다면, dp[55] = 2가 되어버립니다. 12 = 5 + 5 + (5/5) + (5/5) 12 = 55/5 + 5/5 12 = (55 + 5)/5 ------------------------------------

[Java] 최고의 집합 [내부링크]

문제 접근법 1 처음 접근할때는 단순히 브루트포스 방식으로 모든 조합을 만들어 풀면 될것이라고 생각했습니다. 모든 조합을 구한다 1번에서 합이 s가 되는것만 걸러낸다. 2번에서 가장 큰 곱을 구한다 import java.io.*; import java.util.*; class Solution { List<List<Integer>> sets = new ArrayList<>(); public void makeCombination(int level, int sum, List<Integer> s, int Summation){ /* sum인지 먼저 확인 */ /* sum 이라면 집합에 추가*/ if(sum == Summation && s.size() == level) { sets.add(new ArrayList<>(s)); return ; } /* level에 도달했지만 sum이 아니라면 종료 */ if(level == s.size()) { return ;} for(int i=1;i<=100

[Java] 보행자 천국 [내부링크]

문제 접근법 1(시간 초과) 이전에도 비슷한 카테고리의 문제를 풀어본 경험이 있기에 BFS로 풀면 될것이라고 생각했습니다. 문제에서 까다로운 부분은 "좌회전이나 우회전이 금지되었을때"입니다. 이를 극복하기 위하여 Position이라는 Class를 선언하였고 x좌표, y좌표 뿐만아니라 추가로 direction까지 담았습니다. 이 direction을 활용하여 map에서 숫자 2를 만났을때, 기록되어있는 direction으로만 갈 수 있도록 구현했습니다. import java.io.*; import java.util.*; class Solution { int [][] map; int MOD = 20170805; int [][] userMap; int answer = 0; int targetY; int targetX; int dx[] = {1, 0}; int dy[] = {0, 1}; void bfs(){ Queue<Position> que = new LinkedList<>(); que.a

[Java] 추석 트래픽 [내부링크]

문제 접근법 1(틀린 풀이) 처음 문제를 봤을때 처음보는 유형이었기에 많이 당황했습니다. 어떻게 접근하면 좋을까 고민하다가 다음 그림을 보고, "24시간을 배열로 표현해보자!"하는 생각이 들었습니다. int []time = new int[236000000]; 23600000 사이즈의 배열을 만들었지만, 어떻게 겹치는 부분을 찾을 수 있을지 고민이었습니다. for(String line:lines){ String tmp_1[] = line.split(" "); String tmp_2[] = tmp_1[1].split(":"); String tmp_3[] = tmp_2[2].split("\\."); String dateTime = tmp_2[0]+tmp_2[1]+tmp_3[0]+tmp_3[1]; int interval = (int)(Float.parseFloat(tmp_1[2].substring(0,tmp_1[2].length()-1))*1000); int dateTimeInt = Int

[Java] 스티커 모으기(2) [내부링크]

문제 접근법 까다로운 부분은 원형이라는 것입니다. 먼저, 원형 배열이기 때문에 어디서 시작하더라도 끝은 다시 시작점으로 돌아옵니다. 따라서 "방향을 정한다"는 것은 아주 중요합니다. 이 문제에서는 원소를 뽑은 후에 그 원소의 양측을 뽑지 못하게 되므로, 한 방향으로만 원소를 뽑을 것인지 미리 결정하는 것이 필요합니다. 이렇게 하면 원형 배열에서도 일차원 배열처럼 문제를 다룰 수 있습니다. 이 문제에서는 우측을 방향으로 뽑는다고 생각하겠습니다. sticker: [14, 6, 5, 11, 3, 9, 2, 10] 위의 스티커가 주어진다고 했을때, 첫번째로 14를 뽑는다면 마지막 원소(10)를 뽑을 수 없습니다. 마지막 원소를 0으로 두면, 0을 더하는 것이니 뽑지 않은것과 마찬가지입니다. 이를 코드에 반영합니다. tmp_sticker: [14, 6, 5, 11, 3, 9, 2, 0] 만약 첫번째로 6을 뽑는다면 어떻게 될까요? 첫번째 원소(14)를 뽑지 못할것입니다. 이르 코드에 반영합니

[Java] 베스트 앨범 [내부링크]

문제 접근법 전형적인 Hash 문제입니다. -------------------------------------------------------------- genres: ["classic", "pop", "classic", "classic", "pop"] plays: [500, 600, 150, 800, 2500] -------------------------------------------------------------- 위의 데이터를 다음과 같이 맵을 이용하여 표현한다면 쉽게 풀리는 문제입니다. <"pop", [2500, 600]> <"classic", [800, 500, 150]> 소스 코드 import java.io.*; import java.util.*; class Solution { public int[] solution(String[] genres, int[] plays) { Map<String, List<Pair>> hashmap = new HashMap<>(); f

[Java] 연속 펄스 부분 수열의 합 [내부링크]

문제 접근법 1(완전 탐색) 문제가 간단해 금방 풀수 있을 것이라고 생각했지만, 생각보다 문제를 푸는데 시간을 많이 소요했습니다. 첫번째 접근법은 완전 탐색이었습니다. 사실 이것으로는 풀리지 않을것이라 예상은 하고 있었지만, 금방 구현할 수 있기에 시도해보았습니다. 주어진 문제는 수열에 펄스를 준 이후 연속된 수열의 최대값을 찾는 것입니다. [2, 3, -6, 1, 3, -1, 2, 4] 문제를 풀면서 한가지 알게된 것이 있습니다. 위와 같이 배열이 있을때, 펄스 수열을 곱해보겠습니다. 펄스 수열 1 [-2, 3, 6, 1, -3, -1, -2, 4] 최대 값: 3 + 6 + 1 = 10 최소 값: -6 펄스 수열 2 [2, -3, -6, -1, 3, 1, 2, -4] 최대 값: 3 + 1 + 2 = 6 최소 값: -3 -6 -1= -10 즉, "어떤 펄스 수열을 곱하듯 최대/최소 크기는 같다"는 것입니다. 따라서, 첫 번째 풀이방법은 모든 구간의 합을 구하면서 동시에 그 값이 음수

[Java]단속카메라 [내부링크]

문제 접근법 접근법을 모른다면 꽤 헤매는 문제입니다. 이 문제를 푸는 핵심 Key는 정렬입니다. 나가는 지점을 기준으로 오름차순 정렬하면, 가장 먼저 나가는 차량에서부터 카메라를 설치해 나갈 수 있습니다. 이렇게 하면 이후에 나가는 차량들 중 그 지점을 지나는 차량은 이미 카메라에 단속되므로, 추가적인 카메라 설치가 필요 없게 됩니다. 위의 routes를 나가는 지점을 기준으로 정렬하여, 로직을 설명하겠습니다. [-20, -15], [-18, -13], [-14, -5], [-5, -3] 만약 -15에 카메라를 설치한다고 하면, -18에서 출발하는 자동차가 지나가는 것을 커버할 수 있습니다. [-20, -15], [-18, -13], [-14, -5], [-5, -3] -14에서 출발하는 자동차가 지나가는 것은 커버할 수 없습니다. 다음으로 넘어가겠습니다. (넘어가면서 카메라의 개수를 하나 더 해줍니다.) [-20, -15], [-18, -13], [-14, -5], [-5, -3]

[Java] 입국 심사 [내부링크]

문제 접근법 1(시간 초과) n명이 줄을 서서 기다리고 있습니다. 빈자리가 나면 한 명을 심사대로 보내거나, 기다렸다가 다른 곳으로 보내면 됩니다. 이를 수도 코드로 구현해보겠습니다. while(남은 인원수 > 0){ if(빈자리 있다면){ if(현재 자리보다 나머지 자리 중 더 빨리 끝나는 곳이 있다면) 그곳으로 보낸다. else 그렇지 않으면, 한 사람을 심사대로 보낸다. 남은 인원수--; } time++; } return time; 위와 같이 구현할 수 있을 것입니다. 그런데 현재 자리보다 나머지 자리들 중 더 빨리 끝나는 곳을 찾기 위해서는 반복문을 돌아야할 것 입니다. 이를 개선하기 위해서는 어떻게 하면 될까요? 초점을 현재 시간에 맞추면 됩니다. 한 사람이 심사대에 들어가서 입국 심사를 언제 마칠지에 초점을 두지 말고, 현재 시간을 기준으로 봤을때 몇명이 최대로 마칠 수 있는가?에 집중해야 합니다. 6, [7,10]이라는 인풋이 주어졌다고 생각해보겠습니다. time: 1

[Java] 다단계 칫솔 판매 [내부링크]

문제 접근법 처음 문제를 봤을때 텍스트 길이에 압도 당했다... 그럼에도 불구하고 천천히 문제를 읽어보니 어떻게 풀어야할지 감이 왔다. 특정 사람이 돈을 벌면 그 윗사람에게도 수수료를 전달해주어야 하므로, 상향식으로 계속 타고타고 올라가야하는 것을 캐치해야 한다. 타고타고 올라가려면, 결국 사람과 사람 사이의 연관관계를 만들어주어야하는데... 이는 HashMap을 이용하면 될것 같았다. int length = enroll.length; /*Make Hash*/ for(int i=0;i<length;i++){ if(hashMapping.get(enroll[i]) == null){ hashMapping.put(enroll[i],referral[i]); hashData.put(enroll[i],0); } } 구조는 위와같이 만들어졌다. 로직만 추가하면 된다. 로직 - Seller 배열을 순회하면서, 벌어들인 돈을 계산해야한다. 1. Seller에게 수수료를 제한 돈을 준다. 2. Sell

[Java] 양과 늑대 [내부링크]

문제 접근법 정말 낯선 유형의 탐색문제였다. 보통 DFS나 BFS 같은 탐색 문제를 풀때, 이전 경로로 돌아갔다가 다시 방문했던 노드를 가는 경우는 한번도 푼적이 없었기에 구현을 생각하는게 너무 머리아팠다. 결국 오랜 고민끝에 구글링을 해보았고, 백트래킹 방식으로 풀었다는 것을 알게 되었다. 위의 예제에서 트리 구조를 List로 표현하면, 다음과 같다. 0: 1,8 1: 2, 4 2: 3: 4: 3, 6 5: 6 6: 7: 8: 7, 9 9:10, 11 0번 노드에서 방문할 수 있는 노드는 1, 8이다. 이를 저장해두고, 다음 두가지를 생각한다. 1번 노드를 방문했을 경우 8번 노드를 방문했을 경우 1번 케이스 다음 경로 - [8, 2, 4] 2번 케이스 다음 경로 - [1, 7, 9] - 이 경우는 "늑대 >= 양"의 케이스이므로 더 이상 탐색하지 않게 된다. 중요한 포인트는 만약 특정 노드에 도착했으나 늑대가 더 많아 방문하지 못했다고 하더라도, 그 노드를 살려두어 나중에라도 방

[Java] 가장 먼 노드 [내부링크]

문제 접근법1 (DFS 시간초과) 이 문제는 BFS로 풀면 될것 같았지만, 최근 백트래킹을 연습하고 있어서 한번 시도해보았다. 백트래킹으로 풀때 고려해야할 사항은 특정 조건일때만 탐색을 지속해서 하는 것인데, 이 코드에서는 그 조건을 거리로 기준 잡았다. 문제에서 요구하는 것은 최소 거리를 찾는 것이다. dfs를 사용하면 고려해야할 사항이 있다. 특정 노드에 도착했을때, 본인의 경로가 다른 곳을 경유했는지, 아니면 바로 방문했는지이다. 예를들어 예제 같은 경우는 1번에서 시작해 2번으로 가는 경우가 세 가지 있다. 1->2 직접 가는 경우 1->3->2 3을 경유해가는 경우 1->3->4->2 3, 4를 경유해가는 경우 우리가 문제에서 구하고자 하는 것은 1번 케이스이다. 따라서, 그 외의 경우일때는 탐색을 하지 않는다. 첫번째 방문을 했을때 hashDistance에 경로를 담아두고, 처음 담아둔 경로보다 작을때만 로직을 진행한다. 이를 코드로 표현했을때, 다음과 같았다. if(ha

서시 - 윤동주 [내부링크]

죽는 날까지 하늘을 우러러 한점 부끄럼이 없기를, 잎새에 이는 바람에도 나는 괴로워 했다. 별을 노래하는 마음으로 모든 죽어가는 것을 사랑해야지. 그리고 나안테 주어진 길을 거러가야겠다. 오늘 밤에도 별이 바람에 스치운다. 1941.11.20.

[Java] 순위 [내부링크]

문제 접근법 해당 문제는 2시간 정도 고민해보았지만, 도저히 감을 잡지 못했었다. 너무 당연하다고 생각할 수 있지만, 2시간 동안 고민하면서 알아낸 사실은 다음 세 가지 였다. 1등은 '승'만 있고, 패배는 없다. 꼴등은 '패'만 있고, 승리는 없다. 만약 특정 숫자의 "승 + 패"의 합이 n -1 이라면 해당 숫자의 위치를 알 수 있다. 사실 3번 사실이 문제를 풀기위한 핵심 Key 였는데, 고민해볼 당시에는 그걸 알지 못하고 넘어갔다. 왜냐하면 그때는 위의 인풋을 표로 만들어 보았을때, '2' 만 n-1으로 알 수 있다고 생각해서이고, 나머지 케이스인 '5'는 알 수 없다고 생각해서이다. 승 패 1 2 2 5 1, 3, 4 3 2 4 4 3, 2 5 2 이때 사용하는 알고리즘이 플로이드 와샬 알고리즘이다. 플로이드 와샬 알고리즘은 경로의 최단 거리를 구하는 알고리즘으로, 중간에 다른 정점을 거치는 경우를 모두 고려하여, 두 정점 사이의 최단 경로를 찾는 것이다. 갑자기 최단거리

[Java] 쿼드압축 후 개수 세기 [내부링크]

문제 접근법 푸는데 꽤나 오래 걸린 문제이다. 이런 류의 재귀 문제는 처음이라, 낯설었다. 문제를 읽고 나서 간단히 반 나누고, 반 나누고 ... 반복하면 될 것 같았지만, 막상 코드로 쉽게 떠오르지 않았다. 본론으로 들어가서, 내가 구상한 방법은 다음과 같다. 주어진 그래프를 확인하고, 압축 가능한지 체크한다. 만약 그렇다면 더 이상 탐색은 없다. 0 이라면 0을 1이라면 1의 개수를 카운트 한다. 주어진 그래프가 Atomic하여, 더 이상 쪼개질 수 없다면 0, 1의 개수를 카운트 한다. 네 등분하는 로직이 필요하다. 데카르트 좌표계를 떠올려보자. 2 사분면(좌측 상단)으로 재귀를 타고 들어간다. 3 사분면으로 재귀를 타고 들어간다. 1 사분면으로 재귀를 타고 들어간다. 4 사분면으로 재귀를 타고 들어간다. 4등분 하는 것을 코드로 표현하면 다음과 같다. public void dfs(int y, int x, int lastY, int lastX, int size){ ... dfs

[Java] 하노이의 탑 [내부링크]

문제 퇴근길 지하철에서 계속 고민해봤지만, 결국 검색을 해봤다. 막상 답을 보니, 꽤나 정답에 근접하게 다가갔음에 놀랐다. 좀 더 풀어봤으면 풀렸을 것 같다. 실전이란게 이런것 같다. 막상 정답에 다가가고 있음에도, 문제를 푸는 시점에는 "이게 맞나?" 싶은 순간들이 많다. 그런 순간에도 어떻게든 답을 쥐어 짜내봐야겠다. 틀린답이라도 상관 없으니 말이다. 접근법 재귀로 푸는 문제이다. 하노이 탑은 대표적인 재귀 문제라고 한다. 하노이탑의 핵심은 크기가 N인 원반을 시작 점에서 목표 점으로 옮기기 위해서는, 크기가 N-1인 원반을 보조 점으로 먼저 옮기는 것이다. 즉, N-1 크기의 원반을 from에서 other로 옮긴 후, N인 원반을 from에서 to로 옮기고 마지막으로 N-1 크기의 원반을 other에서 to로 옮기면 된다. void hanoi(int numOfCircle, int from, int to, int other){ ... hanoi(numOfCircle-1,from,

[Java] 튜플 [내부링크]

문제 접근법 풀이 로직 자체가 어려운것은 아니다. 문자열을 어떻게 파싱해주느냐가 어려운 문제인 것 같다. 문제에서 제시된 튜플의 특성은 다음과 같다. {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}} 이를 이용해보자. 위의 특성과 같이 사이즈를 기준으로 리스트를 정렬한다. 정답을 담을 리스트에 각 리스트에서 중복되지 않은 원소만 추가한다. 첫 번째 리스트에서는 a1 두 번째 리스트에서는 a2 세 번째 리스트에서는 a3 ... n 번째 리스트에서는 an 리스트를 배열로 변환한다. for(List<Integer> lis:parsedData){ for(int i:lis){ if(ans.contains(i) == false) ans.add(i); } } int idx=0; for(int i:ans) answer[idx++] = i; 소스 코드 import java.io.*; import java.u

[Java] 올바른 괄호의 갯수 [내부링크]

문제 접근법 해당 문제는 완전탐색 + 올바른 괄호 체크 로직으로 간단하게 풀 수 있어 보였다. 다음은 그 구현코드이다. import java.io.*; import java.util.*; class Solution { int Parenthesis; boolean[] visited; List<String> ansList = new ArrayList<>(); Set<String> tmpList = new HashSet<>(); void makeParenthesis(int level, boolean[] visited, Character[] ParenthesisArray, String curS){ if(level == 2*Parenthesis) { tmpList.add(curS); return; } else{ for(int i=0;i<2*Parenthesis;i++){ if(visited[i] == true) continue; visited[i] = true; String tmpStr =

[Java] 단순한 동전 챙기기 [내부링크]

문제 접근법 위 문제를 20분 정도 곰곰히 생각해봤을때, 모든 위치를 탐색해서 풀 수 있을것 같았다. 이를테면 start 위치의 좌표를 x,y라고 두었을때, 밑의 코드와 같이 백트래킹을 이용해 한칸씩 이동하고 특정 조건일때 가지를 쳐내는 방식으로 풀면 될 것 같았다. static void choose(int x, int y){ /* 조건 만족시 */ if(...) return; choose(x+1,y); choose(x,y+1); choose(x-1,y); choose(x,y-1); } 하지만 시간초과/메모리초과가 발생했고, 혼란스러워졌다. 시간초과를 해결하기 위해 가지치기 조건을 더 추가해야했는데, 문제를 살펴봤을때 더 이상 추가할 조건이 없었기 때문이다. visited 배열을 사용해서 방문한 곳은 더 이상 방문하지 않도록 만들어야하나 싶었지만, 문제에서 해당 위치를 지나가더라도 동전을 수집하지 않아도 되며 같은 위치를 2번 이상 지나가는 것 역시 허용라고 쓰여있어 그것도 아닌것

[Java] 대응되는 수와 문자 [내부링크]

문제 n개의 문자열이 주어집니다. 각 문자열은 1부터 n까지 주어진 순서대로 각각 하나의 숫자와 대응됩니다. 이 후, 조사할 m개의 숫자 혹은 문자열이 주어졌을 때, 숫자에 대해서는 대응되는 문자열을, 문자열에 대해서는 대응되는 숫자를 출력하는 프로그램을 작성해보세요. 접근법 위 문제는 어려운 문제는 아니지만, 문제를 풀던 도중 생각의 전환을 배울 수 있었기에 이를 잊지않기 위해 기록한다. 해당 문제를 풀기 위해 첫번째로 사용한 방법은 문자열에 대해 숫자를 저장하는 방식이었다. for(int i=0;i<n;i++){ input = br.readLine(); hashMap.put(input, ""+(i+1)); hashMap.put(""+(i+1), input); } 해쉬는 key에 대한 value는 쉽게 가져올수 있지만, value에 대한 key를 가져오는 것은 한 번 장애물을 넘어야한다. 위와 같은 방법으로 풀었을때 key에 대한 value는 쉽게 가져올 수 있지만, value에

[Java] 돌 잘 치우기 [내부링크]

문제 접근법 최근 많은 알고리즘 문제를 풀고 꽤 실력이 늘었다고 자부했지만 푸는데 시간을 엄청 많이 소모했다. 공부는 모르는 것을 배우는 것이니, 시간 낭비라고 생각하지말고 배움의 시간으로 받아들이자! 이 문제에서 어려운 부분은 어떤 돌을 옮길지 선택이 필요하다는 것이다. 처음 떠오른 방법은 다음과 같았다. 백트래킹(조합 이용) 로직은 다음과 같이 생각했다. 1. 그래프 상의 모든 돌을 리스트에 담는다. 2. 각 돌을 적절히 m개 뽑아 BFS를 돌린다. 3. 최대값을 업데이트 한다. 소스 코드 import java.io.*; import java.util.*; public class Main { static int n, k, m; static int[][] graph; static boolean [][]visited ; static int answer = 0; static int[] dx = {0, 1, 0, -1}; static int[] dy = {1, 0, -1, 0}; sta

[Java] k번째로 작은 쌍의 합 [내부링크]

문제 접근법 이 문제를 처음 봤을때, 풀 수 있는 방법은 쉽게 떠올랐다. 모든 조합을 구해서 pq에 넣는다. pq를 k번만큼 poll하고 결과값을 출력한다. 하지만 중요한 것은 시간 복잡도/공간 복잡도이다. 시간 복잡도 - 모든 조합을 구하여 PQ에 넣는 걸리는 시간: (NM)log(NM) - k번 만큼 poll하는데 걸리는 시간: (KlogNM) 공간 복잡도 - 모든 조합이 우선순위 큐에 들어간다고 가정했을때: O(NM) 문제조건에서 1<=n,m<=100,000으로 주어졌으므로, int형 pq에 모든 조합이 들어간다면 메모리 공간: 10^5 * 10^5 * 4Byte = 40000MB = 40GB 메모리 제한인 80MB를 한참 넘어버린다. 더 공간을 아끼는 방법 다음과 같다. (n)개의 쌍을 pq에 넣어둔다 하나의 쌍을 꺼내어 조건에 맞추어보고, 아니라면 새로 한 쌍을 만들어 pq에 추가한다. 즉, 한번에 N*M개의 쌍을 넣는게 아니라, N개만 넣어두고 메모리 공간을 유지하며 연산

eclipse 이차원 배열 여러줄로 보이게 하기 [내부링크]

eclipse IDE로 알고리즘 문제를 풀어봤는데, 배열이 전부 일렬로 보여서 이차원 배열을 디버깅하는데 어려움이 있었습니다. 자바 어플리케이션을 개발할때, IDE는 인텔리제이를 많이 쓰기때문에 이클립스 디버그 환경이 익숙치 않아서 이를 해결하기 위해 엄청 삽질했습니다. 사실 따로 플러그인을 설치해주어야 한다거나 번거로운 절차는 필요 없었습니다 ㅠㅠ. 거두절미하고 바로 공유 드리도록 하겠습니다! 현상 2차원 배열 graph를 선언했습니다. 해당 배열에 마우스 포인터를 가져다 놓으면 하기와 같이 일렬로 배열이 표시됩니다. 우측에 Expressions도 마찬가지 입니다. 전부 일렬로 보입니다. 해결방법 우측 Expressions에서 여러개의 배열을 Ctrl + 클릭한다 너무 허탈할정도로 쉽죠...? 많은 도움이 되었으면 좋겠습니다. #eclipse #이차원배열 #Java #디버그 #debugging

[북 리뷰] 팀 켈러의 탕부 하나님 [내부링크]

도덕적 순응 VS 자아 발견 행복을 찾아 막다른 두 길을 폭주하는 이 세대, 앞뒤 재지 않고 사랑을 탕진하는 아버지 마음 앞에 멈춰 서다! 오늘, 아버지 집으로 돌아가는 귀향의 시작 팀 켈러의 탕부 하나님 저자 팀 켈러 출판 두란노서원 발매 2016.07.11. 사실 이 책을 읽고 북 리뷰를 쓰려고 하진 않았다. 너무 짧은 분량의 책이기도 하고, 북 리뷰 쓸만큼 삶에 여유가 있진 않기 때문이다. 하지만 감사하게도 책을 읽으면서 와닿았던 부분이 있었고, 이를 기록해두어 나중에라도 다시 보기 위하여 이렇게 글을 쓰게 되었다. '본래 집'을 향한 온 인류의 향수(134p ~ 139p) 예수님은 인류 전체의 이야기를 재현하셨고, 다름 아닌 온 세상의 소망을 약속하셨다. 비유 속의 둘째 아들은 더 나은 삶을 기대하며 먼 나라로 떠나지만 실망한다. 굶주리던 그는 아버지 집에 있는 양식을 떠올리며 점차 향수에 빠진다. '집'은 인간의 삶에 막대한 영향을 미친다. 그러나 막상 기회가 생겨 그리운

2023년 회고록: 임베디드 -> 백엔드 커리어 전환 [내부링크]

0. 2023년 회고를 시작하며... 2023년 12월 16일 토요일 오후 10시 8분, 구상중이던 23년 회고록을 마무리 하기 위해 스터디 카페에 왔습니다. 처음으로 써보는 회고록이라 많이 부족하지만, 올해를 시작으로 앞으로는 꾸준히 작성해볼 예정입니다. 1. 조직 개편으로 인한 업무 변경 올 상반기, 조직 개편으로 인한 업무 변경이 있었습니다. 기존 선행개발 팀에서 양산팀으로 옮겨졌고 AP(Application Processor)를 다루던 저는 마이컴(Micro Processor) 쪽 개발을 담당하게 되었습니다. 새로운 팀에서 두 가지 업무를 진행했습니다. ST사의 칩을 이용해 개발된 기존 제어기 시스템 운영 및 양산 개발 인피니언 사의 TC 칩을 이용하여 제어기 선행 개발 마이컴을 이용해 차량 제어기(ECU)를 운영/양산 및 선행 개발했던 것은 저에게 소중한 경험이 되었습니다. 특히 제어기 양산 직전 기존 제어기 시스템의 TCP 통신 문제가 발생한적이 있었습니다. 이때 이슈 해

[C++] 입국심사 [내부링크]

문제 디버깅 노트 문제를 보고 "이게 어떻게 이진탐색 문제이지?"라는 생각이 들었다. 처음에 풀었던 방식은 시간을 기준으로 각 심사관의 심사시간의 배수만큼의 시간이 흐르면 n--를 해주는 방식으로 풀었다.(마지막 사람이 시간은 오래걸리더라도 현재는 빈 심사관에게 갈지, 조금 기다렸다가 시간이 조금 걸리는 심사관에게 갈지에 대한 로직은 별도 구현) 하지만 예상했던바와 같이 시간초과가 걸렸고 결국 이진탐색으로 풀어야 한다는 것을 깨달았다. 그렇다면 최소 시간을 찾기 위해 어디서부터 어디까지의 범위에 대한 이진 탐색을 수행해야 할까? 최소 범위와 최대 범위를 구해야한다. 문제에서 최소 시간은 0, 최대 시간은 '검사시간이 가장 오래걸리는 심사관' * n(10*6)일 것이다. 그 범위에서 중간값을 계산하고, 그 중간값이 사람들을 얼마나 수용할 수 있는지 본다. 중간값 30이면 7명(30/7+30/10)을 수용할 수 있다. 그 값을 기준으로 이진 탐색을 반복한다. 7명은 n인 6을 초과하니,

함수형 포인터 [내부링크]

함수형 포인터 개념 함수형 포인터는 쉽게 말해 함수를 가리키는 포인터이다. 함수 포인터를 사용하면 함수를 다른 함수의 패러미터로 전달하거나, 함수를 반환 값으로 사용할 수 있다. 목적 함수 포인터를 이용하여 다른 함수에 콜백 함수를 전달할 수 있다. 사용법 // 선언 int (*function_ptr)(int, int); // 초기화 function_ptr = &function; // function_ptr = function; 함수명은 주소값을 반환하므로 &를 생략해도 된다. // 호출 int result = function_ptr(10, 20); 예제 #include <stdio.h> #define SWAP(x,y,t) ((t = x), (x = y), (y = t)) void sort(int arr[], int size, int (*compare)(int,int)){ int tmp; for (int i = 0; i < size - 1; i++) { for (int j = 0;

[C++] 등굣길 [내부링크]

문제 접근법 카테고리는 dp로 되어있었지만, BFS로 풀어도 되지 않을까 싶어서 그 방법으로 먼저 풀어보았다. 하지만 역시 정확성은 다 맞았지만, 효율성에서 실패가 떴다... //BFS 풀이 #include <string> #include <vector> #include <iostream> #include <queue> using namespace std; int dx[2] = {1, 0}; int dy[2] = {0, 1}; int dp[101][101]; int cnt =0; int min_dst = 0; bool flag = true; void BFS(int x,int y, int target_x, int target_y){ queue<pair<int,int>> q; q.push({x,0}); q.push({y,0}); while(!q.empty()){ int cur_level = q.front().second; int cur_x = q.front().first; q.pop()

웹 기초 - 용어 정리 및 설명 [내부링크]

1. 웹의 기본 브라우저와 서버: 브라우저는 웹사이트를 사용자에게 보여주는 도구이며, 서버는 요청된 웹 페이지를 제공하는 컴퓨터. HTTP: HyperText Transfer Protocol의 약자로, 브라우저와 서버가 서로 정보를 교환하는 방식. GET & POST: HTTP의 주요한 메소드 두 가지. GET은 정보를 요청하며, POST는 정보를 서버에 전송. Connection less: HTTP는 연결이 없는(connectionless) 프로토콜. 이는 각 요청과 응답이 독립적이라는 의미. 하나의 요청을 빨리 처리하고, 다음 요청을 많이 받을 수 있다는 장점이 있다. 2. 자바 서버 사이드 프로그래밍 https://newsroom.eclipse.org/eclipse-newsletter/2022/october/jakarta-ee-10-provides-first-jakarta-feature-updates Jakarta EE: 서블릿, JSP 등 서버 사이드 웹 애플리케이션 개발을

[Mac]Unsupported class file major version 64 [내부링크]

Spring boot로 initail한 자바 버전과 현재 Intellij에 설정되어 있는 자바 버전이 일치하지 않을때 발생하는 오류다. 아래 사진 처럼 두 가지 셋팅을 맞춰주면 된다. - Intellij IDEA -> Setting - File -> Project Structure (사진에는 Edit으로 빨간 박스 쳐놨지만... File입니다...)

Java Architecture(with JVM) [내부링크]

자바를 공부하면서 Application을 만드는데만 급급한 나머지 Compile 과정, JVM, GC 등 가볍게 알고 간과하고 넘어간 개념들이 많았습니다. 오늘 주말을 맞이하며 그 개념들을 정리해보고자 합니다. Java Compile 자바 코드를 작성하여 Machine에서 실행하기까지 내부에서 어떤 일이 일어날까요? 크게 다음 과정을 떠올리면 됩니다. .java File(Source Code) --> .class File(Byte Code) --> JRE(JVM) --> Machine(Window, Linux, Mac) 아키텍쳐로 보면 다음과 같습니다. https://devaraj-durairaj.medium.com/java-architecture-and-components-febd83b3adfc 자바의 중요한 컨셉 중 하나는 "Write once, run anywhere". 즉, 자바 코드로 작성한 파일은 어떤 운영체제 에서든 실행할 수 있다는 것입니다. C/C++로 작성된 프로그

JPA expected at least 1 bean which qualifies as autowire candidate [내부링크]

환경 개발언어: 자바 IDE: IntellJ(Community Edition) 프로젝트 SDK: JDK 11 의존성 관리 툴: Maven 오류 메시지 o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@6b53bcc2] to prepare test instance [com.fakeapi.FakeStore.FakeStoreApplicationTests@5cffec7] org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.fakeapi.FakeStore.FakeStoreApplica

스레드와 동시성 [내부링크]

스레드와 동시성 스레드란? 가벼운 프로세스로 CPU 이용의 기본적 단위이다. 한 프로세스 내에서 실행되며, Stack 영역을 제외한 메모리 구조를 공유한다. 각 스레드마다 PC, registers, stack을 각각 할당받는다. 따라서, 한 스레드가 공유 자원(힙 메모리)을 변경하면 다른 스레드에서 그것을 확인할 수 있다. Concurrency Problem 발생 가능 멀티스레드 배경 만약 서버가 싱글스레드로만 동작한다면, 한번에 한 클라이언트에게만 서비스를 제공할 수 있다. 이를 해결하기 위해 유저가 리퀘스트를 요청하면 분리된 스레드를 만들어 리퀘스트를 수행한다. 사실 스레드 개념이 등장하기 전에는 유저가 리퀘스트를 요청했을때, 새로운 프로세스를 생성하는 기법을 사용했다. 하지만 프로세스 생성시 소요되는 intensive한 자원의 문제, 그리고 새로운 프로세스가 기존 프로세스와 같은 일을 할것이라면 굳이 새로운 프로세스를 생성할 필요가 없다고 판단되어 스레드를 사용하게 되었다. 멀

void형 포인터 [내부링크]

void형 포인터 개념 void형 포인터는 쉽게 말해 어떤 자료를 참조할지 정해지지 않은 포인터이다. 메타몽 같은 녀석이다. 따라서, 어떤 자료형이든 참조할 수 있는 포인터이다. 유의할점 void형 포인터를 사용할때, 반드시 캐스트 연산자를 사용하여 포인터 자료형을 명시하여야 한다. 캐스트 연산자를 사용해, 어딴 자료를 참조할지 정해주어야 하기 때문이다. 소스 코드 #include <stdio.h> #include <stdlib.h> int main() { int integer = 99; char character = 'D'; double double_number = 1.3; void *ptr; ptr = &integer; printf("interger: %d\n", *((int*)ptr)); ptr = &character; printf("character: %c\n", *((char*)ptr)); ptr = &double_number; printf("double_number: %f

동기화 [내부링크]

Synchronization 배경지식 프로세스들은 상호간에 논리적 주소를 공유하거나 공유 데이터를 주는 등 협력한다. 하지만 공유 데이터에 대한 동시적인 접근은 데이터 일치를 유지하지 못하게 만들 수 있다. 그러므로 우리는 논리적 주소를 공유하는 협력 프로세스들을 질서있게 실행하고 데이터 일관성을 유지 해야한다. 데이터 일관성 동시적 실행(Concurrency) 프로세스는 명령어 스트림 실행하다가 어떤 부분에서든 interrupt 받아 context switch 처리하는 코어는 다른 프로세스에게 할당될 수 있다. 평행 실행(Parallel) 분리된 프로세스 코어들에서 동시적으로 실행되는 두개 혹은 더 많은 명령어 스트림 Race condition 몇몇 프로세스(혹은 스레드)가 공유 데이터를 동시에 접근할때 생기는 문제. 그 결과는 어떤 프로세스가 접근하는지 순서에 달려있다. 해결방법 이러한 Race condition으로부터 가드하기 위해서 한 프로세스만 공유 자원에 접근 할 수 있도

char sa_data[] socket address (implicit conversion warning 해결) [내부링크]

SMTP 클라이언트 프로토콜을 구현하던 중에 헷갈리던 C언어 문법이 있어, 정리해봅니다. 유닉스 기반 소켓 라이브러리인 <sys/socket.h> 를 사용하면, 다음의 구조체를 이용할 수 있습니다. struct sockaddr { __uint8_t sa_len; sa_family_t sa_family; char sa_data[14]; }; sa_data에서 첫 번째 두 바이트는 포트번호를 위해 할당되어 있고, 그 뒤로는 아이피 주소를 위해 할당되어 있습니다. (IP주소 이후 남는 부분은 0이 들어가는 것으로 알고 있습니다.) 따라서, 소켓 포트번호와 IP주소를 할당하기 위해 다음과 같이 코드를 짰는데, warning이 뜨더라구요. sock_addr.sa_data[0] = htons(25); // htons(),htonl():'host'to'network'short/long \ port: 25 sock_addr.sa_data[2] = htonl(3232235528); // "192.1

[C++] 예외 처리 정리 [내부링크]

오류는 컴파일 시점뿐만 아니라, 런타임 시점에도 발생한다. 예를들어 int A와 B를 선언해놓고, 사용자로부터 값을 입력받아 나눗셈을 한다고 가정해보자. int main() { int num1, num2, result; cin >> num1; cin >> num2; result = num1/num2; } 만약 num2로 0을 입력받는다면, 어떻게 될까? 어떤 메시지 없이 프로그램이 종료될 것이다. 이러한 오류 처리 방법에 대해서 알아보자. 오류 처리 방법 아무것도 하지 않는다. 경고도 없이 프로그램이 종료되므로 최악의 선택이다. 예상할 수 있는 오류를 조건문 등으로 처리한 후, 중단한다. 사용자에게 경고는 줌으로, 1번보다는 낫다. 예상할 수 있는 오류를 조건문 등으로 처리한 후, 중단하지 않고 그 부분만 뛰어넘고 계속 실행한다. 코드 가독성이 떨어진다. 함수 리턴을 사용한다.(오류가 없으면 1, 오류면 0을 리턴) 리턴 값이 두 개이므로 구조적 프로그래밍 원칙에 위배된다. C++의

[Mac] C++ thread 라이브러리 오류 [내부링크]

다음과 같이 Mac M1환경에서 thread 라이브러리를 쓸때 오류가 발생하는 경우가 있습니다. /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/v1/thread:224:5: note: candidate constructor not viable: requires 1 argument, but 2 were provided thread(const thread&); ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/v1/thread:343:9: note: candidate constructor template not viable: requires single argument '__f', but

[C++] 프로그래머스 구슬을 나누는 경우 [내부링크]

문제 소스 코드 #include <string> #include <vector> #define min(a,b) ((a)>(b)?(b):(a)) #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int solution(int balls, int share) { unsigned long long answer = 1; int j = 1; for(int i=min(balls,share)+1;i<=max(balls,share);i++) { if(j > balls-share) answer = answer*i; else { answer = answer*i/j; j++; } } return answer; } 링크 https://school.programmers.co.kr/learn/courses/30/lessons/120840 코딩테스트 연습 - 구슬을 나누는 경우의 수 머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다

[C++] 백준 14889(DFS) [내부링크]

문제 접근법 처음에는 start / link 벡터를 선언하고, 내가 선택한 원소를 벡터에 push해주는 형태로 풀이했다. 하지만, 시간초과가 떠서 선택한 원소를 배열에 담아두는 방식으로 수정했다. 벡터를 사용하는게 너무 익숙해서, 자주 사용하는데 조심해야할 것 같다. 리소스를 많이 잡아먹는 듯... 소스 코드 최초 풀이(시간 초과) #include <iostream> #include <vector> #include <algorithm> #define min(a,b) ((a)>(b)?(b):(a)) #define abs(a) ((a)>(0)?(a):(-a)) using namespace std; int** arr; void solve(int num); int T; int ans = 101; vector<int> combi; void init() { scanf("%d", &T); arr = new int*[T]; for(int i=0;i<T;i++) { arr[i] = new int[T

[C++] 백준 20055 [내부링크]

문제 접근법 유의해야할 점은 다음과 같다. init할때 로봇을 하나 올리면 안된다. 문제와 같이 시작은 컨베이어 벨트가 움직이는 것부터 시작한다. rbt_move 함수에서 for문은 끝에서부터 돌리도록한다. 예를들어 로봇의 위치가 [3,4,7]이고 로봇이 이동가능하다면 앞에서부터 진행하면 [3,5,8]이 될것이고, 뒤에서 부터 진행하면 [4,5,8]이 될것이다. 소스 코드 #include <iostream> #include <queue> #include <vector> #include <algorithm> using namespace std; int N, K; vector<int> q; vector<int> rbt_pos; int ans = 0; void init() { scanf("%d %d", &N, &K); for(int i=0;i<2*N;i++) { int tmp; scanf("%d", &tmp); q.push_back(tmp); } /* if(q[0] != 0) { q[0]

[C++] 백준 21610 [내부링크]

문제 디버깅 노트 빡구현으로 풀면 되는 문제라고 생각했지만, 자꾸 예상하지 못하는 이상한 값이 나왔다. 내가 구현하면서 뭔가를 놓친거라고 생각했지만, 디버깅 결과 원형 배열을 구현하는 과정에서 잘못된 로직을 사용하였다는 것을 알게 되었다. 잘못된 배열 처리 for(int i=0;i<s;i++) { y += dy[d-1]; x += dx[d-1]; if(y >= N) y=0; else if(y < 0) y=N-1; else if(x >= N) x=0; else if(x < 0) x=N-1; } 올바른 배열 처리(원형 배열) for(int i=0;i<s;i++) { y += dy[d-1]; x += dx[d-1]; y = (y + N)%N; x = (x + N)%N; } 어차피 로직은 똑같다고 생각했기 때문에, 굳이 모듈로 연산을 사용하지 않고 첫번째 소스코드처럼 구현했다. 내 실수였다. 전부 if 처리를 했어야 했는데, if-else if를 사용해 x와 y가 독립적으로 처리되지 못하게

[C++] 프로그래머스 최소 직사각형 [내부링크]

문제 소스 코드 #include <string> #include <vector> #include <map> #include <iostream> using namespace std; map<int, int> find_factor(int yellow) { map<int, int> m; if(yellow == 1) { m.insert(make_pair(1,1)); } else { for(int i=1; i<= yellow/2;i++) { if(yellow % i == 0) { m.insert(make_pair(i, yellow/i)); } else continue; } } return m; } vector<int> solution(int brown, int yellow) { vector<int> answer; map<int, int> m; m = find_factor(yellow); for(auto i:m) { if(i.first * 2 + (i.second+2)*2 == brown) {

[C++] 프로그래머스 카펫 [내부링크]

문제 소스 코드 #include <string> #include <vector> #include <map> #include <iostream> using namespace std; map<int, int> find_factor(int yellow) { map<int, int> m; if(yellow == 1) { m.insert(make_pair(1,1)); } else { for(int i=1; i<= yellow/2;i++) { if(yellow % i == 0) { m.insert(make_pair(i, yellow/i)); } else continue; } } return m; } vector<int> solution(int brown, int yellow) { vector<int> answer; map<int, int> m; m = find_factor(yellow); for(auto i:m) { if(i.first * 2 + (i.second+2)*2 == brown) {

[C++] 프로그래머스 소수 찾기 [내부링크]

문제 소스 코드 #include <string> #include <vector> #include <iostream> #include <string> #include <algorithm> #include <cstdlib> #include <set> using namespace std; set<int> ans ; bool isPrime(string num) { int n = stoi(num); if(n == 1 || n == 0) return false; for(int i=2; i<=int(n/2);i++) { if(n%i == 0) { return false; } } return true; } void find_prime(vector<string> v, string cur, int idx) { //cout << "cur: " << cur; if(true == isPrime(cur)) { //cout << cur; int temp = stoi(cur); ans.insert(temp);

[북 리뷰/요약] 오브젝트 [내부링크]

오브젝트 저자 조영호 출판 위키북스 발매 2019.06.17. 역할, 책임, 협력을 향해 객체지향적으로 프로그래밍하라! 오브젝트 들어가며... 이 책은 작년 여름부터 가을까지 스터디를 하며 읽었지만, 미루고 미루다가 드디어 포스팅을 하게되었습니다. 제가 공부한 첫 객체지향 설계 서적이며, 새로운 시각을 열어주었기에 고마운 책입니다. 개인적으로 노션에 책 내용을 요약해두기도 했는데요, 블로그에 모든 내용 공유시 저작권 침해의 우려가 있을것 같아 간추려 포스팅하도록 하겠습니다.. ㅎㅎ!! 객체지향 설계 절차지향? 객체지향? 절차지향 객체지향 데이터와 프로세스 별도의 모듈 동일한 모듈 책임의 이동 한 객체에 책임이 집중 각 객체가 자신을 스스로 책임 설계의 목표 캡슐화를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮춰 변경이 용이한 설계를 만드는 것 설계의 원칙 객체가 어떤 데이터를 가지느냐보다는 객체에 어떤 책임을 할당할 것이냐에 초점. 영화관의 예. TicketSelle

[북 리뷰/요약] 클린코드 [내부링크]

Clean Code(클린 코드) 저자 로버트 C. 마틴 출판 인사이트 발매 2013.12.24. 나쁜 코드도 돌아는 간다. 하지만 코드가 깨끗하지 못하면 개발 조직은 기어간다. 매년 지저분한 코드로 수많은 시간과 상당한 자원이 낭비된다. 그래야 할 이유가 없다. 클린코드 깨끗한 코드 코드란 무엇인가? 코드란 요구 사항을 상세히 표현하는 '수단'이기에, 어느 수준에 이르면 코드의 도움 없이 요구사항을 상세하게 표현하기란 불가능하다. 코드가 사라질 수도 있을까? 우리가 시키는 대로가 아니라 원하는 대로 돌아가는 기계가 나오기를 기대하지말자. 창의력과 직관을 보유한 우리 인간조차도 고객의 막연한 감정만 갖고는 성공적인 시스템을 구현하지 못한다. 깨끗한 코드란 무엇인가? 이 책은 아래와 같이 정의한다. 속도와 CPU 자원을 낭비하지 않는 코드 세세한 사항까지 꼼꼼하게 신경쓴 오류 처리 코드 메모리 누수 경쟁 상태 일관성 없는 명명법 가독성 좋은 코드 다른 사람이 고치기 쉬운 코드 '주의'를

프로그래밍 문제 접근법 [내부링크]

어려운 프로그래밍 문제를 마주했을때, 어떻게 해결해야할지 몰라 갈팡질팡하는 경우가 있습니다. 대부분의 경우 이럴때는 논리적 사고를 통해 문제를 분석하고, 해결해 나가면 되는데요. 무턱대고 제로 베이스에서 논리를 쌓아나가는 것도 좋지만, 다음의 템플릿을 활용하는 것이 더 효율적일것 같아 공유합니다. 문제를 마주했을때 문제를 확실히 이해한다. 간단한 예를 통해 문제를 확실히 이해하고 있는지 파악한다 어떤 알고리즘/자료구조를 사용할지 초점을 맞춘다 위 과정에 시간이 오래 소모되어 코딩을 하고 싶은 유혹이 들어도 참는다. 문제를 풀다가 막혔을때 예를 다시 따져본다. 위에서 시도했던 특정 예를 일반적인 경우로 확장시켜보자. 다른 자료구조를 시도해본다. 연결 리스트, 배열, 해시 테이블 등 다양한 자료구조를 사용해보자. 올바른 자료구조를 사용하는 것만으로 문제 풀이가 수월해지는 일도 흔하다. 문제의 본질을 뽑아내어, 본질은 같되 다른말로 풀어 생각해보자. 언어에서 그리 많이 쓰이지 않는 기능

[C++] 프로그래머스 조이스틱 [내부링크]

문제 접근법 조이스틱을 위 아래로 움직이는건 쉬우니 설명을 생략하도록 하겠습니다. 문제의 핵심은 좌, 우로 몇번 이동하는게 최소값인지 찾는 것입니다. 처음 문제를 봤을때, 아래 두가지 방법을 떠올렸습니다. 1. 정방향 이동 2. 역방향 이동 하지만 반례 "ABBAAAAAAAAAABA" 와 같은 것들을 마주하면 1, 2 알고리즘으로는 해결할 수 없습니다. 따라서 다음두가지 알고리즘을 더 생각했습니다. 3. 정방향 이동 - 한 지점에서 역방향으로 터닝 4. 역방향 이동 - 한 지점에서 정방향으로 터닝 그림으로 추가 설명 하겠습니다. 그렇다면 위 네가지 케이스 중 최소값을 찾으면 되는걸까요? 아뇨. 그럴필요 없습니다. 3번, 4번 케이스 안에 1, 2번 케이스를 녹아 들어가기 때문이에요. 결국 3, 4번 케이스의 최소값을 찾아주면 됩니다! 코드로 어떻게 구현하면 좋을까요?? 우선 첫번째 A가 아닌 인덱스(idx1)를 알고, 그 다음 인덱스(idx2)를 알 수 있으면 범위 (idx1,idx

[C++] 프로그래머스 H-Index [내부링크]

문제 접근법 정렬을 쓰면 쉽게 풀릴것 같지만, 정렬을 하고나서 "이제 뭐해야하지?"하는 문제이다. 우선 논문을 인용횟수가 큰 순으로 정렬하라. 문제 풀이를 위해 네가지 케이스를 생각할 수 있다. 논문 다작, 논문 인용횟수 큼 논문 다작, 논문 인용횟수 작음 논문 과작, 논문 인용횟수 큼 논문 과작, 논문 인용횟수 작음 이때 논문의 인용횟수, 다작인지 과작인지 판별여부는 본인 마음대로 정하면 된다. 1번 케이스 - 논문 다작, 인용횟수 큼 입력값: [15, 14, 13, 12, 11, 10, 9, 9] 출력값: 8 아무리 논문이 인용된 횟수가 많더라도, 총 발표한 논문 수가 8개 밖에 안되므로 H-Index는 8이다. 표로 나타내보자. 인용횟수 15 14 13 12 11 10 9 9 idx 0 1 2 3 4 5 6 7 idx가 논문의 발표수라는 것을 알아챌 수 있을 것이다. 인용 횟수에서 가장 작은 값인 9와 논문 발표수 중 더 작은 값이 H-Index가 된다. 수식: min(cita

[C++] 프로그래머스 게임 맵 최단거리 [내부링크]

문제 소스 코드 #include <vector> #include <queue> #define max(a,b) ((a) > (b) ? (a) : (b)) #define min(a,b) ((a) > (b) ? (b) : (a)) #define pr pair<int,int> #define x first #define y second using namespace std; int n,m; int solution(vector<vector<int> > maps) { queue<pr> q; q.push({0,0}); m = maps.size()-1; n = maps[0].size()-1; int **dp = new int*[m+1]; for(int i=0;i<m+1;i++) dp[i] = new int[n+1]; dp[0][0] = 1; maps[0][0] = 0; while(q.size()>0) { pr pos = q.front(); if(pos.x == m && pos.y == n) retur

[C++] 프로그래머스 단어 변환 [내부링크]

문제 소스 코드 #include <string> #include <vector> #include <queue> #define min(a,b) ((a) >(b) ? (b):(a)) #define pr pair<string,int> using namespace std; int compare(string begin, string word) { int size = min(begin.size(), word.size()); int value = 0; for(int i=0;i<size;i++) { if(begin[i]-word[i] !=0) value++; } if(value > 1) return 0; else return 1; } int solution(string begin, string target, vector<string> words) { int answer =0; queue<pr> q; int level = 0; q.push({begin,level}); while(q.size()>0)

[C++] 프로그래머스 숫자 문자열과 영단어 [내부링크]

문제 소스 코드 #include <string> #include <vector> #include <map> #include <iostream> #define pr string,string using namespace std; map<pr> hash_; void init_hash() { hash_.insert(make_pair("zero", "0")); hash_.insert(make_pair("one", "1")); hash_.insert(make_pair("two", "2")); hash_.insert(make_pair("three", "3")); hash_.insert(make_pair("four", "4")); hash_.insert(make_pair("five", "5")); hash_.insert(make_pair("six", "6")); hash_.insert(make_pair("seven", "7")); hash_.insert(make_pair("eight", "8"))

[C++] 프로그래머스 정수 삼각형 [내부링크]

문제 접근법 처음엔 트리로 생각해서 풀려고 했다. 부모노드 인덱스는 자식노드 인덱스에 2를 나눈 값임을 활용하여, 점화식을 세워 <dp[i] = dp[i/2] + 상수값>으로 풀려고 했다. 하지만, 트리구조와 비슷해도 트리가 아니였다... (너무 당연한 얘기) 문제를 풀때 자식노드의 입장에서, "부모 노드의 인덱스를 어떻게 구하면 좋지? 자식 노드 나누기 2 인가? 아니면, 자식 노드 빼기 level?"이런식으로 사고가 좁혀져서 시간을 소모했다. 답은 간단했다. 부모 노드의 입장에서 생각하면 됐다. 부모 노드는 각각 두 개의 가지를 친다. 이를 활용하여 다음의 식을 생각했다. for i = 0 ~ level dp[level][i] = dp[level][i+1] = 여기서 중복되는 dp 값은 max로 처리해주면 됐다. 소스 코드 #include <string> #include <vector> #include <iostream> #define max(a,b) ((a)>(b)?(a):(b

운영체제와 컴퓨터 [내부링크]

운영체제가 하는 일 운영체제란? 운영체제는 프로그램을 실행할 수 있는 환경을 제공해주는 소프트웨어 OS 서비스 종류 UI 프로그램 실행 입출력 파일시스템 관리 통신 에러 감지 자원 할당 로깅 보안 커널이란? 컴퓨터 위에서 계속 실행하는 프로그램을 커널이라고 부른다. 커널의 두 가지 핵심개념 시스템 프로그램 - OS와 연관된 부분을 포함한다. 어플리케이션 프로그램 - OS와 연관된 부분이 없다. 컴퓨터 시스템 구성요소 인터럽트 하드웨어는 인터럽트를 통해 CPU에게 신호를 보낸다. 인터럽트는 다양한 목적으로 사용되고, OS와 하드웨어가 상호작용하는 키이다. 저장소 구조 CPU는 메모리로부터 명령어를 로드한다. 어떤 프로그램이던간 첫번째로 실행되고 싶다면 메모리 위에 올라가 있어야 한다. 메모리는 메인 메모리를 의미하고, 주로 RAM(Random Access Memory)을 말한다. 램은 재사용 가능한 메모리로, 꺼졌을때 저장한 정보를 모두 잃어버린다. 부트로더와 펌웨어 같은 프로그램은

[C/C++] 백준 13414 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> #include <algorithm> #include <map> #define min(a, b) ((a < b) ? a : b) using namespace std; int cnt =0; map<int, int> hash_; vector<pair<int,int>> ans; bool comp(pair<int,int> n1, pair<int,int> n2) { return n1.second <= n2.second; } int main() { int K,L; scanf("%d %d", &K, &L); for(int i=0;i<L;i++) { int num; scanf("%d", &num); hash_[num] = i; } map<int,int>::iterator iter; for(iter = hash_.begin();iter!=hash_.end();iter++) { ans.push_back(make_pai

[C/C++] 백준 2309 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; int total_sum = 0; vector<int> total; void find_ans() { for(int j=0;j<9;j++) { int temp_sum = total[j]; for(int k=j+1;k<9;k++) { temp_sum += total[k]; if(total_sum - temp_sum == 100) { total[j] = 0; total[k] = 0; return ; } temp_sum = total[j]; } } } int main() { for(int i=0; i<9;i++) { int num; scanf("%d", &num); total.push_back(num); total_sum += total[i]; } find_ans(); sort(total.begin(), total.end()); for(int j=0;j<9;j++) {

[북 리뷰] 이방인 [내부링크]

재판장이 잔기침을 하고나서 낮은 목소리로 할 말은 없느냐고 나에게 물었다. 나는 이야기하고 싶었으므로 일어서서 아랍인을 죽이려는 의도는 없었던 것이라고 대답했다. 아직 나의 변호 내용을 잘 알 수 없으니 변호사의 말을 듣기 전에 내가 그러한 행동을 하게된 동기를 명확히 말해주면 좋겠다고 말했다. 나는 빠른 어조로 말을 이었다. 나는 나 자신이 우습게 보인다는 것을 알면서도 그것은 태양 때문이었다고 말했다. 이방인 이방인 저자 알베르 카뮈 출판 민음사 발매 2019.09.02. 줄거리 프랑스 치하 알제리에서 평범한 직장인으로 살던 프랑스인 뫼르소(Meursault)라는 남자는 양로원에 보낸 어머니가 세상을 떠나 장례식장을 가게 된다. 남자는 슬픔 같은 별다른 감정의 변화를 드러내지 않는다. 장례때 어머니의 시신 주변에서 담배를 피우고 장례를 치른다. 다음 날 마리와 이야기하며 희극 영화를 보며 시간을 보냈다. 다음 날엔 이웃인 살라마노 영감을 만난다. 그 영감은 같은 층에 사는 이웃이

Makefile 매크로 정리 [내부링크]

wildcard 11번째 줄에 있는 매크로, 와일드카드 확장을 위한 목적으로 사용. boot 디렉토리에서 확장자가 S인 파일 이름(boot/Entry.S 등)을 모두 ASM_SRCS 변수에 값으로 넣으라는 의미이다. *와일드카드 문자(*)는 여러 파일을 한꺼번에 호출하기 위한 목적으로 사용되는 문자이다. 와일드카드 확장을 변수 값을 결정하는 곳이나, 함수의 인자 안에서는 사용하기 위해서 쓰는 매크로이다. patsubst 12번째 줄에 있는 매크로, pattern substitute의 축약어이다. 해석하자면 패턴을 대체하는 것인데 boot 디렉토리에서 확장자가 S인 파일 이름을 찾아서 확장자를 o로 바꾼 다음 디렉토리도 build로 바꿔 ASM_OBJS 변수에 값으로 넣으라는 의미이다.

오브젝트 파일 역어셈블(objdump) [내부링크]

오브젝트 파일을 역어셈블하여 어셈블리어 코드를 볼 수 있다. // main.c 파일 #include <stdio.h> int main(){ int *p1[4]; // 포인터 배열 선언 char *p2[4]; // 포인터 배열 선언 int arr1[4] = {10, 11, 12, 13}; char arr2[4][10] = { {"SEOUL"}, {"BUSAN"}, {"PARIS"}, {"LA"} }; printf("==================================================\n"); printf("size of p1: %lu \n", sizeof(p1)); printf("size of p2: %lu \n", sizeof(p2)); printf("==================================================\n"); for(int i =0; i<4;i++){ p1[i] = &arr1[i]; printf("value of p1[%

자주 사용하는 깃 명령어 [내부링크]

[브랜치 관련 명령] 깃 서버로부터 브랜치 가져오기 git checkout -t <origin/브랜치명> 로컬 브랜치 확인 git branch 깃 서버 브랜치 확인 git branch -r 브랜치 삭제 git branch -d <브랜치 이름> 브랜치 이름 변경 git branch -m <이전 파일 이름> <새로운 파일 이름> [커밋 방법] #코드 수정 후 저장 git add . git commit -m "커밋 메시지" git push <저장소 이름> <브랜치 이름> [오류 대응] 1. git push 오류 발생시 sudo git config --system --unset credential.helper 2. 깃 리셋 git reset --hard

[C++] Boost 설치 및 환경구성 [내부링크]

1. Boost 라이브러리란? 전문적으로 설계되고 높이 평가된 C++ 라이브러리 프로젝트 중 하나로서, 자세한 내용은 아래 공식 홈페이지를 참고하세요. https://www.boost.org/ Boost C++ Libraries Get the world's premier collection of high quality, peer reviewed libraries! www.boost.org 2. 설치 및 환경 구성 https://www.boost.org/doc/libs/1_81_0/more/getting_started/unix-variants.html Boost Getting Started on Unix Variants - 1.81.0 Index 1 Get Boost 2 The Boost Distribution 3 Header-Only Libraries 4 Build a Simple Program Using Boost 4.1 Errors and Warnings 5 Prepare to

[C++] Boost.Asio 사용해보기 [내부링크]

Boost.Asio 사용해보기 실제 Boost라이브러리를 사용하기 위해 공식 홈페이지에서 Libraries를 클릭합니다. 위와 같이 사용할 수 있는 라이브러리에 대한 하이퍼링크가 걸려있어서, 타고 들어가면 다음과 같이 간략한 소개가 나옵니다. Boost.Asio는 네트워크, low level I/O 프로그래밍 클로스 플랫폼 라이브러리로, 개발자들에게 일관된 비동기 모델을 제공한다고 쓰여있네요. Examples에 들어가면 다양한 예제들이 나와있습니다. 그중 chat Examples를 소개해보겠습니다. chat_message.hpp // // chat_message.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accomp

[C++] STL 문서 구경해보기 [내부링크]

안녕하세요. C++ string 라이브러리를 보려고 문서를 찾다가, 이것도 포스팅 해놓으면 누군가의 시간을 절약해줄 수 있지 않을까 싶어서 소개해보려고 합니다. 우선 아래의 페이지에 접속하면, 다음과 같은 화면을 볼 수 있습니다. https://cplusplus.com/ home Tutorials C++ Language : Learn this versatile and powerful programming language. Includes detailed explanations of pointers , functions , classes and templates , among others... Reference Description of the most important classes, functions and objects of the Standard Language Library, with des... cplusplus.com 레퍼런스를 들어가 볼까요? 벡터, 스택, 큐, 스트링

[C++] 프로그래머스 타겟 넘버(DFS) [내부링크]

문제 소스 코드 #include <string> #include <vector> #include <algorithm> #include <iostream> using namespace std; int answer = 0; int my_target = 0; void DFS(vector<int> v, int cur) { if(v.size() == 0) { if(cur == my_target) answer += 1; } else { int temp = v[0]; v.erase(v.begin()); DFS(v,cur+temp); DFS(v,cur-temp); } } int solution(vector<int> numbers, int target) { my_target = target; DFS(numbers,0); return answer; } 링크 https://school.programmers.co.kr/learn/courses/30/lessons/43165?language=cpp 코딩테스

[C++] 완주하지 못한 선수 [내부링크]

문제 소스 코드 #include <string> #include <vector> #include <unordered_map> #include <iostream> using namespace std; string solution(vector<string> participant, vector<string> completion) { unordered_map<string,int> m; for(auto part:participant) { if(m.end() == m.find(part)) m.insert(make_pair(part, 1)); else m[part]++; } for(auto com:completion) m[com] -= 1 ; for(auto elem : participant) { if(m[elem] > 0) return elem; } } /* 1. key, value setting 2. update key 3. find key using second value */ 링크 htt

[C++] 백준 14719 (stack/구현) [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; int **matrix; vector<int> stk; int ans = 0; int main() { int H, W; scanf("%d %d", &H, &W); matrix = new int*[H]; // matrix 생성 for(int i=0;i<H;i++) { matrix[i] = new int[W]; } // matrix 채우기 for(int i=0;i<W;i++) { int num; scanf("%d", &num); for(int k=0; k<num;k++) { matrix[k][i] = 1; } } for(int i=0;i<H;i++) { int tmp =0; while(stk.size()>0) stk.pop_back(); for(int j=0;j<W;j++) { if(stk.size()>0) { if(matrix[i][j] == 1) { if(stk[

[C/C++] 백준 1269 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> #define MIN(x,y) x < y ? x : y #define MAX(x,y) x > y ? x : y using namespace std; vector<vector<int> > set1(200001); vector<vector<int> > set2(200001); int cnt = 0; int main() { int n1, n2; scanf("%d %d", &n1, &n2); for(int i=0;i<n1;i++) { int num1; scanf("%d", &num1); set1[num1%200001].push_back(num1); } for(int j=0;j<n2;j++) { int num2; scanf("%d", &num2); set2[num2%200001].push_back(num2); } for(int k=0;k<200001;k++) { if(set1[k].size() > set2[k

[C++] 백준 2504 (stack/구현) [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; char str[31]; vector<int> stk_find_value; vector<char> stk_find_correct; int cursor = 0; int find_idx = 0; void check(char c) { ++cursor; if(c == '\n' || c == '\0') return; if(c == '(') { stk_find_value.push_back('('); stk_find_correct.push_back('('); check(str[cursor]); } else if(c == ')') { stk_find_value.push_back(')'); stk_find_correct.push_back(')'); if(stk_find_value.size()>1 && stk_find_correct.size()>1) { if(stk_find_cor

[C/C++] 백준 11286 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; #define MAX_HEAP_SIZE 100001 #define EMPTY_HEAP(n) (!n) #define FULL_HEAP(n) (n == MAX_HEAP_SIZE - 1) #define abs(n) ((n > 0) ? n : -n) int cursor = 0; int abs_min_heap[MAX_HEAP_SIZE] = {0}; void push(int key) { if(FULL_HEAP(cursor)) return ; int i = ++cursor; while(i != 1 && abs(abs_min_heap[i/2]) >= abs(key)) { if(abs(abs_min_heap[i/2]) == abs(key)) { if(abs_min_heap[i/2] > key) // 부호가 다른 경우 바꿔주고 { abs_min_heap[i] = abs_min_he

[C++] 백준 1697 (DP풀이) [내부링크]

문제 소스 코드 #include <iostream> #include <queue> using namespace std; int visited[100001] = {0}; int level = 1; int ans = 0; int main() { int N, K; queue<int> queue; scanf("%d %d", &N, &K); queue.push(N); while(queue.size() != 0) { int front = queue.front(); visited[front]++; if(front == K) break; queue.pop(); if(front - 1 >= 0 && !visited[front-1]) { visited[front-1] = visited[front]; queue.push(front-1); } if(front + 1 < 100001 && !visited[front+1]) { visited[front+1] = visited[front]; queue.push

[C++] 백준 1697 (BFS풀이) [내부링크]

문제 소스 코드 #include <iostream> #include <queue> #include <vector> using namespace std; int visited[100001] = {0}; int main() { queue<pair<int,int>> q; int N, K; scanf("%d %d", &N, &K); q.push({N,0}); while(q.size() != 0) { int front = q.front().first; int level = q.front().second; visited[front] = 1; if(front == K) break; q.pop(); if(front-1 >= 0 && !visited[front-1]) q.push({front-1, level+1}); if(front+1 < 100001 && !visited[front+1]) q.push({front+1, level+1}); if(front*2 < 100001 && !visited[f

[C++] 백준 2696 (정렬 풀이) [내부링크]

문제 소스 코드 #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; int** min_heap; int cursor = 0; void push(int arr[], int key) { arr[cursor++] = key; return ; } int main() { vector<int> ans; vector<int> q; int T; scanf("%d", &T); min_heap = new int*[T]; for(int i=0;i<T;i++) { int M; scanf("%d", &M); int number = int(M/2) + 1; ans.push_back(number); min_heap[i] = new int[M]; for(int j=1;j<M+1;j++) { int element; scanf("%d", &element); push(min_heap[i],ele

[C++] 프로그래머스 네트워크(DFS) [내부링크]

문제 소스코드 #include <string> #include <vector> using namespace std; int visited[201] = {0}; vector<vector<int>> v1(201); void DFS(int num, int n) { if(!visited[num]) { visited[num] = 1; for(int i=0;i<n;i++) { if(v1[num][i] == 1) DFS(i, n); } } } int solution(int n, vector<vector<int>> computers) { int answer = 0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) v1[i].push_back(computers[i][j]); } for(int i=0;i<n;i++) { if(!visited[i]) { DFS(i, n); answer += 1 ; } } return answer; } 링크 https://school.pro

[C++] 백준 16173 (DFS) [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; vector<vector<int> > v(9); int visited[9] = {0}; int graph[9] = {0}; void DFS(int num) { if(!visited[num]) { if(graph[num] == -1) { graph[num] = 100; return; } visited[num] = 1; for(int i=0;i<v[num].size();i++) DFS(v[num][i]); } } int main() { int N; scanf("%d", &N); for(int i=0;i<N*N;i++) scanf("%d", &graph[i]); for(int i=0;i<N*N;i++) { if(i + graph[i] < (int(i/N)+1)*N ) v[i].push_back(i + graph[i]); // 오른쪽 if(i + graph[i]*N <

[2022 마이 블로그 리포트] 올해 활동 데이터로 알아보는 2022 나의 블로그 리듬 [내부링크]

2022 마이 블로그 리포트 2022년 올해 당신의 블로그 리듬을 알아볼 시간! COME ON! campaign.naver.com

[북 리뷰] 팀켈러의 부활을 입다 [내부링크]

그런즉 믿음, 소망, 사랑, 이 세 가지는 항상 있을 것인데 그 중에 제일은 사랑이라 고린도전서 13장 13절 소망의 하나님이 모든 기쁨과 평강을 믿음 안에서 너희에게 충만하게 하사 성령의 능력으로 소망이 넘치게 하시기를 원하노라 로마서 15장 13절 부활을 입다 저자 팀 켈러 출판 두란노 발매 2021.03.24. 책을 읽게된 계기 기독교인은 무엇에 소망을 두어야 하는가? CCM을 듣거나 성경을 읽다보면 소망에 관한 내용이 참 많다는걸 느낀다. 우리에게 낙심치 말라고 하며 주만 의지하고 예수께 소망을 두라한다. 그럴때마다 궁금했다. "예수님께 소망을 두는게 무엇일까?". 이런 내용의 CCM을 듣다보면 그것이 무엇을 의미하는지도 모른채 흥얼거리기도 했다. "주는 나의 소망이요 ~ 변함없는 반석이라 ~" 단순히 천국을 말하는 것이라 생각했다. 예수님께 소망을 두는것에 대해서 깊게 생각해보진 않았다. 소망을 두는 것에 대해서 "예수님께서는 우리 죄를 사하여 주시고 구원해주셨다. 우리는

QT - 사무엘상 5:1~12 [내부링크]

1. 가끔 “내가 잘 살아가고 있는걸까”, “지금 나 잘하고 있는걸까?” 의문과 함께 불안해질때가 있다. 그럴때는 이성을 사용하여 내가 추구하는 가치들을 생각한다. 그 가치들을 판단 기준으로 삼아 지금 목표를 향하여 잘 나아가고 있다고 스스로를 설득한다. 내가 나를 설득하고, 내가 나에 의해서 설득당하면 불안은 해소된다. 하지만, 드물게 이성을 사용해도 불안을 이기지 못하는 경우가 있다. 불안에 사로잡히면 정말로 아무것도 할 수가 없다. 2. 5장 3절 “아스돗 사람들이 이튿날 일찍이 일어나 본즉 다곤이 여호와의 궤 앞에서 엎드러져 그 얼굴이 땅에 닿았는지라 그들이 다곤을 일으켜 다시 그 자리에 세웠더니”, 5장 4절 “그 이튿날 아침에 그들이 일찍이 일어나 본즉 다곤이 여호와의 궤 앞에서 또다시 엎드러져 얼굴이 땅에 닿았고 그 머리와 두 손목은 끊어져 문지방에 있고 다곤의 몸뚱이만 남았더라” 3. 가끔 나는 돈을 섬겨 맘몬신을 좇을때도 있고, 마귀의 꾀임에 넘어가기도 한다. 이럴때

[종교철학] 존재론적 논증 [내부링크]

https://youtu.be/IUIBXY4mEvk

괴델: 논리적 신존재 증명 [내부링크]

https://www.youtube.com/watch?v=JTCvGK-3J7Y&t=445s

[북 리뷰] 침묵 [내부링크]

주님의 평화. 그리스도의 영광. 세바스티앙 로드리고의 편지 침묵 저자 엔도 슈사쿠 출판 홍성사 발매 2005.07.29. 간략한 요약 17세기 페레이라 신부가 일본 선교 중 고문을 받고 배교를 맹세했다는 소식이 로마 교황청에 들려온다. 다른 사람도 아니고, 주교라는 중요한 직책에 있으면서 사제와 신도들을 통솔해왔던 그가, 불굴의 신념으로 그리스도를 전파하던 그가 교회를 배반했다는 소식에 세 명의 젊은 사제들이 모였다. 그들은 이 소문의 진위를 파악하고, 선교를 하겠다는 목적으로 일본으로 향한다. 우여곡절 끝에 세 명의 신부 중 두 명만 일본에 도착하게 되나, 이곳의 상황은 생각보다 더 열악한데... 감상문 이 땅위를 살아가면서 피할 수 없는 의문이 있다. 우리가 고통받을때 하나님은 어디에 계실까? 우리와 함께 하고 계신걸까? 기적을 바라지는 않아도, 함께 계신다는 것만이라도 알려주셨으면 하는때가 있다. 이 책은 하나님의 침묵에 관한 이야기를 담고있다. 17세기, 많은 일본 신자들은

[자료 구조] HEAP(힙) [내부링크]

HEAP(힙) 구조란? 힙 구조는 우선순위 큐를 구현하기 위해 주로 사용되는 자료구조로 다음의 정의를 따른다. Complete tree 마지막 level을 제외한 모든 level이 다 채워져 있고, 마지막 level은 왼쪽부터 삽입되는 트리 완전 이진 트리(Complete tree) max/min tree 자식 노드의 키 값이 루트 노드보다 크거나(max)/작거나(min) 하지 않은 트리 Max tree Min tree 표현 방식 힙 구조를 표현할때 주로 배열을 사용하도록 한다. 연결리스트를 사용해도 되겠지만 트리구조가 배열구조와 대응 되기 때문에 배열을 사용하며, 만약 배열로 표현 못하는 트리 구조(Complete하지 못한 트리)라면 연결리스트를 사용하여 표현해야 한다. 원소 삽입(Max heap 기준) 힙의 맨 끝에 원소를 추가한다 끝 원소를 그 부모 노드와 비교하여, 부모 노드가 값이 작으면 부모를 자식의 자리에 넣어준다. root에 도달하거나, 부모 노드의 값이 더 크면 br

[C++] 백준 11279 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> #define HEAP_SIZE 100001 #define HEAP_EMPTY(n) (!n) #define HEAP_FULL(n) (n == HEAP_SIZE - 1) using namespace std; int max_heap[100001] = {0}; int cursor = 0; void push(int key) { if(HEAP_FULL(cursor)) return; int i = ++cursor; while(i != 1 && max_heap[i/2] < key) { max_heap[i] = max_heap[i/2]; i /= 2; } max_heap[i] = key; } void pop() { if(HEAP_EMPTY(cursor)) return; int parent = 1; int child = 2; max_heap[1] = max_heap[cursor]; max_heap[cursor--]

[C/C++] 백준 1927 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; #define MAX_HEAPSIZE 100001 #define EMPTY_HEAP(n) (!n) #define FULL_HEAP(n) (n == MAX_HEAPSIZE - 1) int min_heap[MAX_HEAPSIZE] = {0}; int cursor = 0; void push(int key) { if(FULL_HEAP(cursor)) return; int i = ++cursor; while(i != 1 && min_heap[i/2] > key) { min_heap[i] = min_heap[i/2]; i /= 2; } min_heap[i] = key; } void pop() { if(EMPTY_HEAP(cursor)) return; int parent = 1; int child = 2; min_heap[1] = min_heap[cursor]; min_hea

[C++] 백준 10845 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> #include <cstring> using namespace std; int Queue[10000] = {0}; int Front = 0; int Rear = 0; void push(int num) { Queue[Front++] = num; } int pop() { if(Rear == Front) return -1; int tmp = Queue[Rear]; Queue[Rear++] = 0; return tmp; } int size() { return Front-Rear; } int empty() { if(Front == Rear) return 1; else return 0; } int front() { if(Front == Rear) return -1; else return Queue[Rear]; } int back() { if(Front == Rear) return -1; else return Q

[C++] 백준 10866 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> #include <cstring> using namespace std; vector<int> Deque; void push_front(int num) { Deque.insert(Deque.begin(),num); } void push_back(int num) { Deque.push_back(num); } int size() { return Deque.size(); } int pop_front() { if(size() == 0) return -1; int result = Deque[0]; Deque.erase(Deque.begin()); return result; } int pop_back() { if(size() == 0) return -1; int result = Deque[Deque.size()-1]; Deque.pop_back(); return result; } int front() { if(s

[C++] 백준 1158 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; int main() { int N, K; vector<int> ans; scanf("%d %d", &N, &K); int* arr = new int[N]; for(int i=0;i<N;i++) { arr[i] = i+1; } int cursor = K-1; for(int j=0;j<N;j++) { ans.push_back(arr[cursor]); arr[cursor] = 0; int cursor_cnt = K; while(N-(j+1)) // 출력할 원소가 없을때는 다음 cursor가 없어서 무한루프 { if(cursor_cnt ==0) { break; } else { if(arr[(cursor+1)%N]!=0) { cursor_cnt--; } cursor = (cursor + 1)%N; } } } vector<int>::iterator iter; printf("

[C++] 백준 9093 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; int main() { int N; vector<char> ans; scanf("%d", &N); getchar(); for(int i=0;i<N;i++) { char str[1001]; char word[21]; int cursor = 0; fgets(str, sizeof(str),stdin); char *ptr = str; while(1) { if(*ptr == '\n') { while(--cursor + 1) ans.push_back(word[cursor]); ans.push_back(*ptr); break; } else if(*ptr == ' ') { while(--cursor + 1) ans.push_back(word[cursor]); ans.push_back(*ptr); cursor = 0; } else { word[cursor++] = *ptr; }

[C++] 백준 9012 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; int main() { int num; char* str1 = "YES"; char* str2 = "NO"; vector<string> ans; scanf("%d", &num); getchar(); for(int i=0; i<num;i++) { char input[51]; vector<int> stack; scanf("%s", &input); //fgets(input,sizeof(input),stdin); char *ptr = input; while(1) { if(*ptr == '(') { stack.push_back(*ptr); } else if(*ptr ==')') { if(stack.size() == 0) { ans.push_back("NO"); break; } stack.pop_back(); } else if(*ptr == '\0') { if(stack.s

[C++] 백준 1966 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> using namespace std; int find_max(int arr[], int size) { int max = arr[0]; for(int i=1; i<size; i++) { if(max < arr[i]) max = arr[i]; } return max; } void SWAP_POS(int arr[], int size) { int tmp = arr[0]; for(int i=0;i< size -1;i++) { arr[i] = arr[i+1]; } arr[size-1] = tmp; } int main() { int num; vector<int> ans; scanf("%d", &num); getchar(); for(int i=0;i<num;i++) { int cnt = 1; int N, M, input; scanf("%d %d",&N, &M); int *q = new int[N]; int size

[C++] 백준 2606(인접 리스트, DFS) [내부링크]

문제 소스 코드 #include <iostream> using namespace std; typedef struct adjlists { int data; adjlists* LINK; }; int ans = 0; int visited[101] = {0}; adjlists* adj; adjlists* find_last(adjlists* adj) { while(adj->LINK != NULL) { adj = adj->LINK; } return adj; } void LINK_LIST(adjlists* adj, int num1, int num2) { adjlists* tmp1 = new adjlists; tmp1->LINK = NULL; tmp1->data = num1; adjlists* tmp2 = new adjlists; tmp2->LINK = NULL; tmp2->data = num2; find_last(&adj[num1])->LINK = tmp2; find_last(&adj[num2]

[C++] 백준 1991 [내부링크]

문제 소스코드 #include <iostream> using namespace std; typedef struct tree* TreeNode; typedef struct tree { TreeNode LeftChild; char data; TreeNode RightChild; }; void inorder(TreeNode BT) { if(BT) { inorder(BT->LeftChild); cout << BT->data; inorder(BT->RightChild); } } void preorder(TreeNode BT) { if(BT) { cout << BT->data; preorder(BT->LeftChild); preorder(BT->RightChild); } } void postorder(TreeNode BT) { if(BT) { postorder(BT->LeftChild); postorder(BT->RightChild); cout << BT->data; } } int main()

[C++] 백준 11725 (인접리스트 풀이) [내부링크]

문제 소스 코드 #include <iostream> typedef struct adjlists { int data; adjlists* LINK; }; int parent[100001]; adjlists list[100001]; void addNode(adjlists* list1, adjlists* list2) { while(list1->LINK != NULL) { list1 = list1->LINK; } list1->LINK = list2; } void find_parent(int v) { adjlists* w = (list[v].LINK); for(; w != NULL; w = w->LINK ) { if(!parent[w->data]) { parent[w->data] = v; find_parent(w->data); } } } int main() { int num; scanf("%d", &num); for(int i = 0; i < num - 1 ; i++) { int left, r

[C++] 백준 9372 (인접리스트 풀이) [내부링크]

문제 소스 코드 #include <iostream> #include <cstring> using namespace std; typedef struct adjlists { int data; adjlists* LINK; }; int visited[10001]; int ans = -1; int ans_arr[1001]; void dfs(adjlists* lists, int v) { ans +=1 ; adjlists* w = lists[v].LINK; visited[v] = 1; for(;w != NULL;w = w->LINK) { if(!visited[w->data]) dfs(lists, w->data); } } void addNode(adjlists* list1, adjlists* list2) { while(list1->LINK != NULL) { list1 = list1->LINK; } list1->LINK = list2; } int main() { adjlists* lists ; a

[C++] 백준 9934 (levelorder 풀이) [내부링크]

문제 소스 코드 #include <iostream> #include <cmath> #include <queue> using namespace std; typedef struct tree { int data; tree* LLINK; tree* RLINK; }; int *arr; tree* BinTree; void levelorder_print(tree* BT) { if(BT == NULL) return; queue<tree*> q; tree* tmp; int space_cnt = 0; int level = 1; q.push(BT); while(1) { tmp = q.front(); if(tmp == NULL) return; printf("%d",tmp->data); if(space_cnt == 0) { printf("\n"); space_cnt = pow(2,level) - 1; } else { printf(" "); space_cnt -= 1; } q.pop(); if(tmp->LL

[C++] 백준 9934_2번째 도전 (트리구조 풀이) [내부링크]

문제 소스 코드 #include <iostream> #include <cmath> #include <queue> using namespace std; typedef struct tree { tree* LLINK; tree* RLINK; int data; }; int *arr; tree* BinTree; tree* Create() { tree* BinTree = new tree; BinTree->LLINK = NULL; BinTree->RLINK = NULL; BinTree->data = '\0'; return BinTree; } void MakeTree(int left, tree* Tree ,int right) { tree* NewTree1 = Create(); tree* NewTree2 = Create(); NewTree1->data = left; NewTree2->data = right; Tree->LLINK = NewTree1; Tree->RLINK = NewTree2; } i

UML 핵심만 정리하기! [내부링크]

UML이란? Unified Modeling Language의 약자이며, 시각적으로 어떤 소프트웨어의 구조와 행위를 보여주기 위한 방법을 제공한다. (Language라고 해서, 개발언어라고 생각하지 말자!) UML의 구성 요소 어떤 복잡한 시스템을 누군가에게 설명할 자료를 만든다고 생각해보자. 이때 그 시스템을 일목요연하게 보여주기 위해서는 수십 페이지 보고서 보다 한 장의 그림이 더 직관적일 것이다. 그렇다면, 그 그림에 표현되어야 할 것은 어떤게 있을까? 그것은 바로 어떤 클래스가 있는지, 또 그 클래스들의 관계는 어떤지일 것이다. 여기서 어떤 클래스가 있는지를 말하는 용어가 사물, 그 클래스들의 관계를 설명하는 용어가 관계, 마지막으로 좀 더 거시적인 시각에서 사물과 관계를 연결 그래프로 표시한 것을 다이어그램이라고 한다. 사물 관계 다이어 그램 네 가지 관계 의존 관계 연관 관계 집합 관계 합성 관계 일반화 관계 실현 관계 시스템을 표현하는 관점 앞서 우리는 UML을 구성하는

[해시 테이블] 직접 주소 테이블 [내부링크]

등장 배경 해시 테이블은 사전을 구현하는 효율적인 자료구조이다. 우리는 소프트웨어를 만들때 Search, Delete, Insert등의 기능을 자주 필요로 한다. 이때 연결리스트로 이러한 기능을 구현하면, 최악의 경우 O(n)의 수행시간을 가지게 된다. 해시테이블도 이론상 최악의 경우 O(n)의 수행시간의 갖지만, 실제로 성능은 훨씬 좋다고 한다. 합리적인 가정하에서 O(1)의 평균 수행시간을 갖는다고 한다. 직접 주소 테이블 사전을 구현하는 방법 중 하나이다. 해시 테이블은 '키'와 '데이터' 이 두 가지 요소로 이루어져 있는데, '키'를 테이블의 인덱스에 매칭하는 방법이다. 이 같은 방법에서는 기본적인 사전 연산을 구현하기 쉽다. 또한, 이 연산은 빨라 단지 O(1)의 수행시간만 요구한다. 더 나아가 Hash 구조체에 바로 데이터를 넣는 것이 아니라, 다른 객체의 포인터를 넣어둔다면 불필요한 메모리를 아낄 수 있다. 또한, 살펴보면 Table이 자체의 인덱스를 가지고 있어 따로

[C++] 백준 10828 [내부링크]

문제 소스 코드 #include <iostream> #include <vector> #include <cstring> using namespace std; int stack[10000] = {0}; int Top = -1; void push(int num) { stack[++Top] = num; } int size() { return Top+1; } int top() { if(Top == -1) return -1; else return stack[Top]; } int pop() { if(Top == -1) return -1; int tmp = stack[Top]; stack[Top--] = 0; return tmp; } int empty() { if(Top == -1) return 1; else return 0; } int main() { int num; vector<int> ans; char cmd[8] = {0}; scanf("%d", &num); for(int i=0; i<nu

[C++] 백준 5397 연결리스트 풀이 [내부링크]

문제 링크 https://www.acmicpc.net/problem/5397 5397번: 키로거 5397번 제출 맞힌 사람 숏코딩 재채점 결과 채점 현황 질문 검색 키로거 다국어 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 256 MB 42494 11473 7708 25.329% 문제 창영이는 강산이의 비밀번호를 훔치기 위해서 강산이가 사용하는 컴퓨터에 키로거를 설치했다. 며칠을 기다린 끝에 창영이는 강산이가 비밀번호 창에 입력하는 글자를 얻어냈다. 키로거는 사용자가 키보드를 누른 명령을 모두 기록한다. 따라서, 강산이가 비밀번호를 입력할 때, 화살표나 백스페이스를 입력해도 정확한 비밀번호를 알아낼 수 있다.... www.acmicpc.net #include <iostream> #include <string> #include <vector> using namespace std; typedef struct NODE { NODE* LLINK; char data; NOD

[C++] Stack 구현(클래스) [내부링크]

#include <iostream> #include <string> using namespace std; template<typename T> class Stack_template { private: T* arr; int capacity; int top; public: Stack_template(); Stack_template(int size); ~Stack_template(); bool isEmpty(); bool isFull(); T peek(); void push(T num); T pop(); }; template<typename T> Stack_template<T>::Stack_template() :capacity(3) { arr = new T[capacity]; top = -1; } template<typename T> Stack_template<T>::Stack_template(int size) :capacity(size) { arr = new T[capacity]; to

[C++] Queue 구현(클래스) [내부링크]

#include <iostream> #include <string> using namespace std; template<typename T> class Queue_template { private: T *arr; int capacity; int rear; int front; public: Queue_template(); Queue_template(int size); ~Queue_template(); void Enqueue(T num); T Dequeue(); bool IsEmpty(); bool IsFull(); T peek(); }; template<typename T> Queue_template<T>::Queue_template() :capacity(5) { arr = new T[capacity]; front = -1; rear = -1; } template<typename T> Queue_template<T>::Queue_template(int size) :capacity(s

[C++] 트리 구현 [내부링크]

#include <iostream> using namespace std; typedef struct tree* TreeNode; typedef struct tree { TreeNode LeftChild; int data; TreeNode RightChild; }; TreeNode Create() { TreeNode BinTree = new tree; BinTree->LeftChild = NULL; BinTree->RightChild = NULL; BinTree->data = '\0'; return BinTree; } bool IsEmpty(TreeNode BT) { if(BT->LeftChild == NULL && BT->RightChild == NULL) { return true; } else { return false; } } TreeNode MakeBT(TreeNode BT1,int item,TreeNode BT2) { TreeNode NewTree = Create(); New

학과 교수님께 진로상담 받고 왔습니다. [내부링크]

제가 현재 고민중인 회사는 중공업쪽 대기업 P기업과 H기업 입니다. H기업은 채용검진 예약이 잡혔고 P기업도 된 것 같습니다. 직무는 P 기업 ICT 전기설계 직무 <-> H 중공업 계열사 SW개발자(태양광) 제가 물어봤던 질문은 다음과 같습니다. -제가 합격한 회사가 태양광 산업 분야 SW개발자 입니다. 평범한 개발자(웹, 앱)과 길이 많이 다르고 현재 시장이 좁아서 불안합니다. 물경력이 되지는 않을까요?? 오히려 지금 웹, 앱쪽이 레드오션이다. 절대 진출하지 마라. 태양광쪽 길이 좁아보여도, 다른 이직할 수 있는 기업들 많다. 그리고 정 아니다 싶으면 새로 공부해서 다른 분야로 나아가면 된다. 지금 너에게 필요한건 어학점수, 프로젝트, 전공공부가 아니다. 경력사항이다. 1년 정도 다녀보고 결정해라. 1년 정도 투자한다고 해도 절대 너에게 마이너스가 되는 일은 없을 거다. 한 번에 올바른 선택을 할 수 있는 사람 없다. 너가 보기에 잘 선택하는 것 처럼 보여도 사실 그 사람 개인마

[북리뷰] 소설 읽는 신자에게 생기는 일 [내부링크]

도입부만 읽어도 가격이 아깝지 않은 책...! 이 책은 평소 구독중이던 유튜브 <오늘의 신학 공부> 채널에서 추천을 해주어 읽게 되었다. 되게 재밌을 것 같아서 바로 주문했지만, 생각보다 두꺼운 굵기 그리고 학술적인 문체에 지레 겁먹었다. 바로 본론으로 들어가서 책 소개를 해보자면... 이 책의 부제는 <위대한 책들을 통해 좋은 삶을 발견하기>이다. 무심코 넘어가기 쉬운 이 부제가 책에 대한 설명을 다 해주고 있다. 당신에게 좋은 삶이란 어떤 삶인가? 어떻게 사는게 좋은 삶일까? 좋은 삶에 대한 예시가 있을까? 저자는 세계 최고의 문학에 좋은 삶에 대한 비전이 제시된다고 한다. 사실 나는 평소에 철학적인 생각을 좀 많이 하면서 살아왔다.(물론 깊이있게 하지는 않았지만...) 어떤 일을 할때에도 "내가 지금 잘 하고 있는걸까?", 평안한 하루를 보냈어도 "난 이렇게 살아도 되는걸까?", 분주하고 뿌듯한 하루를 보냈어도 "이렇게 사는게 무슨 의미가 있을까?" 등등 삶에 대한 생각을 많이

책 읽을거야 [내부링크]

일상 책 읽을거야 갈대상자 2022. 10. 6. 19:30 이웃추가 본문 기타 기능 다음 주일까지 읽고 리뷰쓰겠읍니다,,, 이렇게 적어놔야 읽지...

[북 리뷰] 신의 언어 [내부링크]

과학과 종교는 양립할 수 없는 것인가? 세계적인 유전학자이자 의사인 프랜시스 S. 콜린스의 이야기를 들어보자. 인류역사상 신 존재 유무에 대한 논쟁은 끊임없이 이어져 내려오고 있다. 더 나아가, 누군가는 21세기에 신 존재를 두고 토론하는 것을 바보 같다고 여길 것이다. 빅뱅이론과 진화론 그리고 갖가지 과학이론을 들고와서 말할 것이다. 이미 무신론이 옳다는게 입증된 것 아니냐고. 그리고 그 주장을 한 사람의 지적 권위가 높으면 높을 수록 사람들은 그를 따르게 되며, 영적인 것을 허무맹랑한 것으로 치부한다. 동료 40퍼센트가 가진 영적 믿음을 말도 안 되는 감상이라며 불신하는 저명한 진화론자 리처드 도킨스를 떠올려보라. 그는 눈이 휘둥그레질 만한 말을 많이도 남겼다. "신앙은 증거를 평가하고 진지하게 고민하기를 회피하는 가장 그럴듯한 도피이자 핑계다. (...) 증거에 기초하지 않은 믿음인 신앙은 어느 종교에서나 주요 악이다. 안타까운 것은 이런 사회적인 분위기가 대부분의 사람들이 진

[북리뷰] 정서적으로 건강한 영성 [내부링크]

영성이란 무슨 의미일까요? 그 단어가 광범위하게 사용되고 있어서 정확히 정의하긴 어렵지만 이 책에서는 ‘하나님과 교제하기 위한 영혼의 상태’를 의미하는 것 같습니다. 앞 부분을 읽을때는 객관적인 근거를 제시하기 보다는 저자의 주관이 많이 들어있다고 생각해서 가볍게 읽었지만, 뒷내용을 읽으면 읽을수록 공감가는 내용이 많았습니다. 저자는 책 제목처럼 감정과 영성의 연관성에 대해 굉장히 묵상을 많이 한것처럼 보였고, 본인의 경험과 지인들의 이야기를 예시로 들어 독자가 책의 내용을 더욱 쉽게 이해할 수 있도록 도와줍니다. 감사하게도 이 책을 읽으며 저의 영성을 점검 해 볼 수 있었습니다. 그 결과 저는 현재 영성이 없다고 봐도 무방한 신앙 생활을 하고 있다는 것을 깨달았습니다. 하나님은 믿지만 더 이상 그분의 임재를 경험하지 못하고 기도할 수 없는 상태이며, 맡은 직분 때문에 단순히 교회에 나가는 무미건조한 신앙 생활을 하고 있습니다. 이런 저에게 이 책은 약간의 위로와 구체적인 방향성을

[북리뷰] 관계를 읽는 시간 [내부링크]

톨스토이는 ‘사람은 무엇으로 사는가’라는 책에서 사람은 사랑으로 산다고 말합니다. 저도 동의합니다. 사람의 존재 목적 자체는 사랑하는 것입니다. 그 대상은 하나님이기도 하고, 사람이기도 합니다. 우리는 사랑하고 사랑받기 위해 태어난 존재입니다. 하지만 사랑이란 무엇인지 배워본적이 없습니다. 복잡한 것은 싫다며 이런 주제를 두고 고민하기를 좋아하지 않는 사람도 있습니다. 관계도 마찬가지입니다. 건강한 사랑은 건강한 관계를 통해 형성해 나갈 수 있지만, 건강한 관계란 무엇인지, 타인과 어떻게 관계 맺고 유지해야하는지 배운적은 없습니다. 그렇기에 감사한 마음으로 이 책을 읽을 수 있었습니다. 이 책을 읽으면서 저 스스로를 점검해보았습니다. 나는 내 안의 결핍이나 삶의 불만을 관계로 채우려고 하지는 않는가? 비대칭적인 기준을 가지고 있어, 상대방이 자신에게는 무엇을 원하는지에 대해 관심이 없지는 않은가? 현재 인간관계를 맺는데 아무런 문제가 없기 때문에 스스로 아무런 문제가 없다고 생각했지

[북리뷰] 오늘이라는 예배 [내부링크]

“오늘 하루를 잘 보내셨나요?” 좋은 하루를 보내셨길 바랍니다. 제 얘기를 해보자면 저는 최근 무의미하게 하루하루를 보내고 있습니다. 특히 최근에는 매일을 살아가며 걱정거리는 늘어갔고 나 스스로는 현재 잘 살아가고 있는지도 모르겠더라구요. 그래서 최근에는 안개 속에서 사는 것처럼 느껴졌습니다. 마음이 행동이 된다고 하는데 정말 그렇더라구요. 요새는 성경도 잘 안 읽히고 기도하기도 쉽지가 않습니다. 때로 내가 힘들 때는 하나님이 정말 계시긴 할까하는 의심도 들었습니다. ‘출애굽기에서는 이스라엘 백성들의 신음까지 들으시는 하나님이신데 나에게 관심은 있으신걸까?’ 하는 생각도 들며 권태에 빠져 있었습니다. 이런 나에게 이 책은 말합니다. 복음의 풍요로움을 들여다 보고 그것을 느끼지 못한다면, 사실 그것은 내가 비어있기 때문일 수도 있다고. 작고 하찮게 느껴지는 하루하루가 중요한 의미를 지니고 있으며 하나님이 우리를 위해 준비하신 풍성한 삶의 일부라고. 왜냐하면 그리스도가 평범하게 보내신

[북리뷰] 내가 구원 받았는지 어떻게 알 수 있는가? [내부링크]

내가 내 몸을 쳐 복종하게 함은 내가 남에게 전파한 후에 자신이 도리어 버림을 당할까 두려워함이로다 (고전 9:27) 구원에 대해 독후감을 쓰려고 생각하던 중 가장 먼저 떠오른 말씀이었습니다. 선교에 죽기까지 힘썼던 사도 바울조차 본인이 복음을 전한 후 버림 받을까 두려워했습니다. 사실 구원은 정말 받기 힘든게 아닐까요? 그리스도인 중 사도 바울만큼 복음에 헌신 할 수 있는 사람이 얼마나 될까요? 그럼 사도 바울만큼 복음에 헌신하지 못한 나는 구원을 받지 못할까요? 정답은 ‘알 수 없다’입니다. 왜냐하면 구원은 오로지 하나님과 어린양께 달려있기 때문입니다. 그럼 우리는 여기서 두 갈림길에 서게 됩니다. 첫 번째는 내가 할 수 있는게 아무 것도 없으니 아무 것도 하지 않는것이고, 두 번째는 그럼에도 불구하고 지구에서 숨쉬는 동안 하나님을 위해 최선을 다해 사는 것입니다. 후자의 경우 그 이유가 어찌 되었든 간에 노력의 목적은 ‘구원’을 얻기 위한 것은 아닐 것입니다. 아마 바울은 후자

배열 포인터 [내부링크]

배열 포인터 개념 배열 포인터란 쉽게 말해 배열을 가리키는 포인터이며, 배열의 시작주소를 저장한다. 코드를 통해 알아보도록 하자. #include <stdio.h> int main(){ int *p1; // 1차원 배열 포인터 int (*p2)[3]; // 2차원 배열 포인터 (열의 크기가 3) int arr1[2] = {10, 11}; int arr2[5][3] = { {20, 30, 40}, {50, 60, 70}, {80, 90, 100}, {110, 120, 130}, {140, 150, 160} }; int row1 = sizeof(arr1) / sizeof(int); p1 = arr1; // 배열은 주소값을 나타내므로 &를 쓸 필요 없다. printf("==================================\n"); printf("size of p1: %lu \n", sizeof(p1)); printf("size of p2: %lu \n", sizeof(p2));

포인터 배열 [내부링크]

포인터 배열 개념 포인터 배열이란 쉽게 말해 포인터들이 모여있는 배열으로 메모리의 연속된 주소들을 모아놓은 배열이라고 보면 된다. 코드를 통해 알아보자. #include <stdio.h> int main(){ int *p1[4]; // 포인터 배열 선언 char *p2[4]; // 포인터 배열 선언 int arr1[4] = {10, 11, 12, 13}; char arr2[4][10] = { {"SEOUL"}, {"BUSAN"}, {"PARIS"}, {"LA"} }; printf("==================================================\n"); printf("size of p1: %lu \n", sizeof(p1)); printf("size of p2: %lu \n", sizeof(p2)); printf("==================================================\n"); for(int i =0; i<4;i++){

[북리뷰] 보다 예배다운 예배를 꿈꾸다 [내부링크]

정확히 언제라고 말할 수는 없지만, 어느 순간 내 삶에서 예배드리러 가는 습관이 자리 잡았다. 시작은 호기심이었던 것 같다. 친구를 따라 교회에 가고, 예배가 끝난 후 같이 교제하고. 그것이 귀찮을 때도 있었지만 즐거웠다. 교회에 가서 찬양 부르고, 설교 말씀 듣고, 기도하는 일련의 순서가 좋았고 이것만으로 난 만족했다. 예배라는 게 무엇인지 몰라도, 예배 순서가 왜 이렇게 짜여있는지 몰라도 즐거웠다. 별로 궁금해하지도 않았다. 왜냐하면 내가 예배드리러 가는 특별한 목적이 있지 않았기 때문이다. 이 책은 예배의 본질과 실제에 대한 통찰을 담고 있다. 저자가 생각하는 예배란 하나님께 응답하는 것이다. ‘아! 하나님은 이런 분이시지, 아! 하나님이 이렇게 하셨지!’ 하면서 하나님이 하신 일을 기억하고 기념하며 선포하는 것이 예배다. 이러한 응답을 표현하는 방법과 형식은 정해진 것이 없다. 시대, 문화, 상황, 회중의 성향에 따라 다양할 수 있지만, 그 본질은 하나님이다. 즉 은혜를 얻기

[북리뷰] 제자도 [내부링크]

이 세상을 살아가다보면 내가 한 명의 그리스도인으로서 잘 살고 있는지 궁금할때가 있다. 그럴때 스스로 던지는 질문은 “이 상황에서 예수님이라면 어떻게 하셨을까?”이다. 질문을 던지고 답을 생각해보지만 아무래도 내 머릿속에서 나온 답이기에 지극히 주관적일 수 밖에 없다. 하지만 답을 찾기위해 성경을 무작정 읽기에는 읽어야 할 양이 너무 많기에 부담스러울 때가 있다. 게다가 성경에서 마음에 드는 구절을 하나 찾아 “이번에는 이 말씀을 나에게 주셨네”하는 것도 올바르게 성경을 읽는 방법이 아닌 것 같다. 나 같은 고민을 했던 사람을 했던 사람에게 이 책은 참 좋은 책인것 같다. 그리스도인이된다는 것의 의미를 알려주며 어떤 삶을 살아가야하는지 챕터별로 성경 말씀을 근거로 알려주기 때문이다. 한편 이 책을 읽으면서 많은 생각이 들었다. 저자는 그리스도와의 만남을 미루지 말라고 강한 어조로 우리에게 말한다. 또한 모든 관계보다 하나님과의 관계를 우선 순위에 두고 순종을 강권한다. 정말 옳은 말

회개에 대하여.. [내부링크]

그리스도인이 죄를 지었을때 흔히 듣는말이 있다. 하나님께서는 너의 모든 죄를 용서해주셔 그 문제를 들고 하나님께 기도해봐. 그들은 진리를 말했다. 하지만 여기서 말하는 회개란 무엇일까? 단순히 앵무새처럼 입술로 나의 죄를 고백하는게 회개일까? 나는 그렇지 않다고 생각한다. 습관적으로 약속을 어기는 'A'라는 나쁜 그리스도인 친구가 있다고 가정해보자. A의 주변인들은 그의 행동때문에 많은 상처를 받아왔다. 하루는 A와 주변 친구들이 주일에 교회 청소를 같이 하기로 약속했지만 막상 주일이되자 A는 어김없이 잠수를 타게된다. 화가난 주변 친구들은 A에게 왜 약속을 지키지 않냐며 따지기 시작한다. 이때 A는 말한다. 지난주에 급한 일이 생겨서 못갔다. 그런데 하나님께 헌신하는건 내 개인의 신앙문제인데 왜 뭐라고 하냐. 과연 신앙은 단순히 나와 하나님과의 관계일까? A가 본인이 했던말을 지키지 않은 본질적인 이유는 하나님과의 관계가 멀어졌기때문이고 그 죄의 열매로 본인이 했던말을 안지켜 다른

누군가의 신앙을 확인하는 가장 좋은 방법은... [내부링크]

그 사람이 이웃을 얼마나 사랑하는지를 보면 되는 것 같다. 비록 예수님이 주신 가장 큰 계명은 하나님을 사랑하는 것이고, 두 번째 계명이 이웃을 사랑하는 것이지만...하나님에 대한 헌신은 삶으로 드러나기 마련이니까. 첫 번째 계명을 잘 지키고 있는 사람은 의식적으로든, 무의식적으로든 두 번째 계명도 잘 지키고 있을것이다. 난 그렇게 생각한다. 물론 중심에 하나님이 없는 헌신은 자기만족일 뿐일 것이다. 중심에 하나님을 두고, 하나님이 우리를 사랑하셨듯이 이웃을 사랑하는 사람이 정말 신앙 좋은 사람이 아닐까 싶다.. 그런 의미에서 나는 가야할 길이 먼 것 같다.

QT - 사사기 6:11 ~ 24 [내부링크]

1. 15-16절 말씀 : 그러나 기드온이 그에게 대답하되 오 주여 내가 무엇으로 이스라엘을 구원하리이까 보소서 나의 집은 므낫세 중에 극히 약하고 나는 내 아버지 집에서 가장 작은 자니이다 하니 여호와께서 그에게 이르시되 내가 반드시 너와 함께 하리니 네가 미디안 사람 치기를 한 사람을 치듯 하리라 하시니라. 2. 기드온은 여호와께 가장 작은 내가 어찌 이스라엘을 구원하겠냐고 대답한다. 아마 이때 기대했던 대답은 “군사 100만을 줄테니 이들과 함께 싸우라” 등의 현실적인 대답이었을 것이다. 그러나 결국 돌아오는 대답은 “내가 반드시 너와 함께 하리니” 이다. 기드온은 본인이 기대했던 답이 나오지 않자, 의구심이 들기 시작한 것 같다. 당신이 정말 하나님이 맞습니까? 17절 말씀 “기드온이 그에게 대답하되 만일 내가 주께 은혜를 얻었사오면 나와 말씀하신 이가 주되시는 표징을 내게 보이소서” 그러자 하나님은 그에게 표징을 보이신다. 하나님을 의심했다는 자책감 때문인지, 본인의 수치스

"내 일생의 목표는 100억을 나눠주는 것이다." [내부링크]

*장응복 장로님 회고 영상(5분) '벌어서 남주자' https://www.youtube.com/watch?v=GlL0TbPwkDI *장응복 장로님 영상(전체) '벌어서 남주자' https://www.youtube.com/watch?v=q2CFG46jXjM *장응복 장로님 영상과 글 모음 https://sarang.handong.edu/news/thanks/?mode=view&id=41745&group=0 한동대 발전기금 장응복 후원자 '벌어서 남주자' 의 가르침을 기억하겠습니다. 작성자: 관리자 | 작성일: 2022.02.17 | 조회: 650 첨부파일 장응복 후원자 '벌어서 남주자' 소책자.pdf 장응복 후원자 '벌어서 남주자' 영상 보기 장응복 후원자 회고영상(5분) '벌어서 남주자' 보기 장응복 후원자 '벌어서 남주자' 소책자 보기 장응복 후원자 온라인 조문글 남기는 곳 '벌어서 남주자' 의 삶을 사신 장응복 후원자를 모든 한동인들이 기억하겠습니다. 우리나라 의료 발전과 국민들

[2021 마이 블로그 리포트] 블로그 빅데이터로 알아보는 '2021 내 블로그 스타일' [내부링크]

2021 마이 블로그 리포트 2021년 당신의 블로그 스타일을 확인하고 네이버페이 GET하세요! campaign.naver.com

할게 많다....!! [내부링크]

블로그 글도 쓰고 싶고, 운동도 해야하고, 전공 공부 복습도 해야하고, 회사에서도 잘하고 싶은데... 카네기 행복론도 빨리 읽고 싶고, 책 읽은 것들 블로그 포스팅도 해야하고, 투자도 공부해야하고, 너무너무너무 할게 많다... 일단 이번주 목표를 세워봐야겠다. 그리고 일주일에 서적을 몇권 읽을 지도.... 또 전공 공부는 어떻게 할지도... 운동은 어떻게 할지도... 가치관은 어떻게 세워나갈지도... 정리를 해보자! 읽어야할 책 list 1. 놀라운 하나님의 은혜 - 필립 얀시 2. 헤아려 본 슬픔 - CS 루이스 3. 카네기 행복론 - 데일 카네기 4. 순전한 기독교 - CS 루이스 5. 하나님, 당신께 실망했습니다 - 필립 얀시 6. 사귐의 기도 - 김영봉 목사님 7. 인생질문 - 팀 켈러 목사님 8. 아멘 다음이 중요하다 - 한 홍 목사님 9. 결혼의 의미 - 팀켈러 목사님 공부해야할 list 1. CANoe 통신 세미나 준비 2. 임베디드 리눅스 시스템 프로그래밍 복습 3.

포인터, 메모리 동적 할당 [내부링크]

포인터 개념 메모리 주소 값을 저장하는 변수이며, 어떤 자료형이 존재하더라도 그것을 가리키는 자료형의 포인터가 있다. 포인터 타입의 실제 값은 메모리 주소값이다. 포인터에서 쓰이는 대표적인 연산자는 다음과 같다. - & the address operator(주소 값 연산자) - * the dereferencing operator(역참조 연산자) 다음과 같은 선언을 한다면, int i, *p; i는 int형 변수 그리고 p는 int를 가리키는 포인터를 의미한다. 다음 코드를 보자. p = &i; &i는 i의 주소값을 반환하고, p의 값에 그것을 할당한다. i에 값을 할당하기 위해서는 다음과 같이 코드를 작성할 수 있다. i = 10; 혹은 *p = 10; 두 가지 케이스 모두 i의 값으로 10이 저장된다. 두 번째 케이스에서는 p앞의 연산자 *를 이용해서 p가 역참조 되도록 한다. 따라서, 포인터 p에 10을 저장했다기 보다는, 10은 포인터 p가 가리키는 위치에 저장되는 것이다. 3

[북리뷰] 내 몸 사용 안내서 [내부링크]

이것뿐만 아니라 우리가 고난 중에서도 기뻐하는 것은 고난은 인내를, 인내는 연단된 인격을, 연단된 인격은 희망을 갖게 한다는 것을 알기 때문입니다. (로마서5:3-4) 이 말씀은 제가 좋아하는 성경 구절 중 하나입니다. 그리스도인은 영원히 사는 존재입니다. 영원한 삶을 하나님과 누리기 위해서는 그리스도를 닮아가는 성화의 과정을 거쳐야만 합니다. 고난을 통해 성화될 수 있는 기회를 받는다는 것을 로마서 말씀을 통해 일깨워 주기에 좋아하게 되었습니다. 이 책은 이런 사고 방식을 갖고 있던 제게 큰 울림을 주었습니다. 영혼의 성장만을 바라보며 살아왔는데, 몸의 성장 또한 강조하고 있기 때문입니다. 정확히 말하자면, 훈련되지 않은 몸이 영적 성장을 더디게 하거나 해칠 수 있다고 합니다. 실제로 대부분의 사람들은 운동을 하면 어떤 방식으로든 본인에게 좋다는 것을 알고 있습니다. 하지만 그것은 영적인 것과는 별개라고 생각하거나, 연관 시키지 못합니다. 반면, 책에서는 그리스도께서 다 해결하신

퀵소트(Quick sort) [내부링크]

https://medium.com/@bill.shantang/8-classical-sorting-algorithms-d048eec3fdab 퀵소트 1. 목록에서 피벗이라는 요소를 선택합니다. 2. 피벗보다 작은 모든 요소가 피벗 앞에 오도록 목록을 재정렬하고 피벗보다 큰 모든 요소가 피벗 뒤에 오도록 합니다(동일한 값도 어느 방향으로든 가능). 이 분할 후 피벗은 최종 위치에 있습니다. 이를 파티션 작업이라고 합니다. 3. 더 작은 요소의 하위 목록과 더 큰 요소의 하위 목록을 재귀적으로 정렬합니다. 재귀의 기본 사례는 크기가 0 또는 1인 목록으로, 항상 정렬됩니다. https://medium.com/@bill.shantang/8-classical-sorting-algorithms-d048eec3fdab Python def Qsort(lt, rt): if lt < rt: pos = lt pivot = arr[rt] for i in range(lt, rt): if arr[i]<=pi

백준 9012 [Python] [내부링크]

N = int(input()) for i in range(N): s = input() flag = True stack = [] for x in s: if x == '(': stack.append(x) elif x == ')': if len(stack) == 0: print("NO") flag = False break elif stack[-1] == '(': stack.pop() if flag == True: if len(stack) == 0: print("YES") else: print("NO")

병합정렬(Merge sort) [내부링크]

https://medium.com/@bill.shantang/8-classical-sorting-algorithms-d048eec3fdab 병합정렬 1. 리스트 길이가 0 또는 1이면 이미 정렬된 것입니다. 그렇지 않으면: 2. 정렬되지 않은 리스트를 약 절반 크기의 두 개의 하위 목록으로 나눕니다. 3. 병합 정렬을 다시 적용하여 각 하위 목록을 재귀적으로 정렬합니다. 4. 두 하위 목록을 다시 하나의 정렬된 목록으로 병합합니다. https://medium.com/@bill.shantang/8-classical-sorting-algorithms-d048eec3fdab Python def Msort(lt,rt): if lt < rt: mid = (lt + rt)//2 Msort(lt, mid) Msort(mid+1, rt) idx1 = lt idx2 = mid + 1 tmp = [] while idx1<=mid and idx2<=rt: if arr[idx1] < arr[idx2]:

소켓 프로그래밍 2(TCP를 이용한 파일전송) [내부링크]

안녕하세요~! 이번에는 컴퓨터 네트워크 수업을 들으며 실습했었던, TCP 파일전송 관련하여 포스팅을 해보려고 합니다!! 시나리오는 다음과 같습니다. 1. 전송할 파일의 이름을 서버에게 알려준다. 2. 파일의 내용을 전송한다. (이때 서버에서는 전송된 파일 이름으로 해당 파일을 저장하여야 한다.) 3. 파일 이름을 전송한 다음, 지연 없이 즉시 파일내용을 전송하여야 한다(ACK사용금지). 4. 서버는 iterative 형태여야 한다. 5. 시간지연 코드를 사용하면 안된다. 6. 파일은 아스키, 바이너리 모두 지원해야한다. client.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #define MAXBUF 1024 void

재미있는 오셀로게임 [내부링크]

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWQmA4uK8ygDFAXj&categoryId=AWQmA4uK8ygDFAXj&categoryType=CODE SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 문제 오셀로라는 게임은 흑돌과 백돌을 가진 사람이 번갈아가며 보드에 돌을 놓아서 최종적으로 보드에 자신의 돌이 많은 사람이 이기는 게임이다. 보드는 4x4, 6x6, 8x8(가로, 세로 길이) 크기를 사용한다. 6x6 보드에서 게임을 할 때, 처음에 플레이어는 다음과 같이 돌을 놓고 시작한다(B : 흑돌, W : 백돌). 4x4, 8x8 보드에서도 동일하게 정가운데에 아래와 같이 배치하고 시작한다. 그리고 흑, 백이 번갈아가며 돌을 놓는다. 처음엔 흑부터 시작하는데 이 때 흑이 돌을 놓을 수 있는

인터럽트(interrupt) 구현 [내부링크]

이전에 블로그에서 인터럽트에 대해서 포스팅 한적이 있었는데요~~ https://blog.naver.com/gkswlcjs2/222437445053 인터럽트에 대해 임베디드 시스템이란 말 그대로 내장형 시스템을 의미합니다! 구체적으로는 반복적인 일들을 수행하면서, ... blog.naver.com 이번에는 OS에서 인터럽트를 구현해보았습니다!! 현재까지 우리는 UART만 사용하고 있는데, UART 하드웨어는 인터럽트를 발생시킵니다. 그러므로 UART 하드웨어와 인터럽트 컨트롤러를 연결합니다. 도식화하면 다음과 같습니다. 인터럽트 구현 전 static void Hw_init(void); static void Printf_test(void); void main(void) { Hw_init(); uint32_t i = 100; while(i--) { Hal_uart_put_char('N'); } Hal_uart_put_char('\n'); putstr("Hello World!\n"); Pr

재귀호출의 단점 [내부링크]

재귀호출이란? 함수를 반복해서 호출하는 것. 매번 호출할 때 마다 시간과 스택 공간에서 오버헤드가 발생하며, 재귀호출은 헷갈리는 사람이 많기 때문에 디버깅 및 유지보수가 어려울 수 있습니다. 코드 1 def DFS(x): 2 if x>0: 3 DFS(x-1) 4 print(x, end=' ') 5 6 if __name__ == "__main__": 7 n = int(input()) 8 DFS(n) 실행결과 재귀호출의 스택구조

소켓 프로그래밍 1(TCP server, client) [내부링크]

안녕하세요~!! 오늘은 컴퓨터 네트워크 수업을 들으며 실습했었던, TCP server 및 client 관련하여 포스팅을 해보려고 합니다!! 시나리오는 다음과 같습니다! 1. Server에서는 단지 client에서 전송한 데이터를 화면에 출력시킨다. 2. client에서는 server와 connection establish를 한 다음, 즉시 10 바이트 데이터 3개를 3번의 send() 함수를 이용하여 server에 전송한다. (예를 들면 0123456789, ABCDEFGHIJ, KLMNOPQRST) 3. 그 후 터미널로부터 입력된 데이터를 server에 전송함. (한 라인의 데이터를 받아서 전송함.) 사용자가 ‘q’를 입력하면 client 프로그램을 종료시킴. 4. Server는 client 와 connection establish를 한 다음, 5초 동안 sleep 한 다음, 최대 buffer 크기가 100 바이트인 버퍼를 이용하여 읽은 다음, 읽은 데이터를 화면에 출력시킴. (r

임베디드 개발자 로드맵 [내부링크]

출처: https://github.com/vazeri/Embedded-Engineering-RoadMap-2018 GitHub - vazeri/Embedded-Engineering-RoadMap-2018: RoadMap to becoming an embedded systems engineer in 2018 RoadMap to becoming an embedded systems engineer in 2018 - GitHub - vazeri/Embedded-Engineering-RoadMap-2018: RoadMap to becoming an embedded systems engineer in 2018 github.com 임베디드 개발자를 꿈꾸시는 분들은 참고하시면 좋을 것 같아요~~!!

DMA 실습(UART TX) [내부링크]

DMA의 동작원리 이해 및 세팅 DMA는 주변기기와 메모리 혹은 메모리와 메모리 사이에 빠른 속도로 데이터 전송을 하기위해 사용되며, 데이터는 CPU개입 없이도 DMA를 통해 빠르게 전송될 수 있다는 특징이 있습니다. STM32f411re에서 DMA는 DMA1 그리고 DMA2 두 개로 구성되어 있으며, 각각은 8개의 stream과 8개의 channel로 구성되어 있다. 각 채널과 스트림이 매핑 된 방식은 다음과 같습니다. 이번 실습에서는 UART TX를 구현하는 것이 목표이므로 DMA1의 stream 6, channel 4를 이용합니다. 또한, DMA에서는 소스(메모리 주소)와 목적지의 주소(USART2->DR)를 Incrementing 혹은 non-incrementing으로 설정할 수 있으며 FIFO 모드와 Direct mode를 제공하고 각 stream은 Circular buffer management를 제공한다. 이번 실험에서는 Direct Mode를 사용했으며 Circular

백준 1727 [c++] [내부링크]

#include <iostream> #include <algorithm> int man[1001], girl[1001], dp[1001][1001]; using namespace std; int abs(int a) { if (a >= 0) return a; else return -a; } int min(int a, int b) { if (a > b) return b; else return a; } int main(void) { int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) cin >> man[i]; for (int j = 1; j <= m; j++) cin >> girl[j]; sort(man + 1, man + n + 1); sort(girl + 1, girl + m + 1); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { dp[i][j] = dp[i - 1][j - 1

백준 2108 [c++] [내부링크]

#include <iostream> #include <algorithm> #include <cmath> using namespace std; int temp = -1, temp1, index = 0 ; int ct = 1, ct2 = 0; int arr[500001]; double first = 0; bool reset = true; int main(void) { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> arr[i]; first = double(arr[i]) + first; } temp1 = n; sort(&arr[0], &arr[0] + n); for (int j = 0; j < temp1 - 1; j++) { while (arr[index] == arr[index + 1]) { index++; ct++; temp1 = temp1 - 1; } if (ct > temp) { temp = ct; ct2 = index; reset

백준 1463 [c++] [내부링크]

#include <iostream> #include <cmath> using namespace std; int arr[1000001]; int main(void) { int number; cin >> number; arr[1] = 0; for (int i = 2; i <= number; i++) { if (i % 3 == 0) { if (i % 2 == 0) { int min; if (arr[i / 3] + 1 > arr[i - 1] + 1) min = arr[i - 1] + 1; else min = arr[i / 3] + 1; if (arr[i / 2] + 1 > min) arr[i] = min; else arr[i] = arr[i / 2] + 1; } else { if (arr[i / 3] + 1 > arr[i - 1] + 1) arr[i] = arr[i - 1] + 1; else arr[i] = arr[i / 3] + 1; } } else if (i % 2 == 0) { if

백준 9095 [c++] [내부링크]

#include <iostream> #include <cmath> using namespace std; int dp[11]; int main(void) { dp[1] = 1; dp[2] = 2; dp[3] = 4; for (int i = 4; i < 11; i++) { dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1]; } int T; cin >> T; for (int i = 0; i < T; i++) { int num; cin >> num; cout << dp[num] << "\n"; } return 0; } dp[1] = 1->1개 dp[2] = 1+1 = 2 ->2개 dp[3] = 1+1+1 = 1+2=2+1=3 ->3개 dp[4] = 1+1+1+1 = 1+1+2 = 1+2+1 = 2+1+1= 1+3 = 3+1 = 2+2 ->7개 dp[5] = 1+1+1+1+1 = 1+1+1+2 = 1+1+2+1= 1+2+1+1 = 2+1+1+1 = 1+1+3 = 1+

[C++] 백준 9461 [내부링크]

#include <iostream> using namespace std; long long dp[101]; long long permu(int a) { if (a == 1) { dp[1] = 1; return 1; } else if (a == 2) { dp[2] = 1; return 1; } else if (a == 3) { dp[3] = 1; return 1; } else if (a == 4) { dp[4] = 2; return 2; } else if (a == 5) { dp[5] = 2; return 2; } else if (dp[a]) { return dp[a]; //dp[a]가 0이 아닌 값이라면 바로 dp[a]의 값을 리턴해줍니다. } else { dp[a] = permu(a - 1) + permu(a - 5); return dp[a]; } } int main(void) { fill_n(dp+1,100, 0); //dp[1]부터 dp[100]까지 0으로 초기화 해줍니다. i

백준 16396 [c++] [내부링크]

#include <iostream> using namespace std; int arr[10001]; int main(void) { fill_n(arr, 10001, 0); int point1min = 99999, point2max = -1, ct = 0; bool smooth = true; int num; cin >> num; for (int i = 0; i < num; i++) { int point1, point2; cin >> point1 >> point2; if (point1 < point1min) point1min = point1; if (point2 > point2max) point2max = point2; for (int j = point1; j < point2; j++) { if (arr[j] == true) continue; arr[j] = true; } } for (int k = point1min; k < point2max; k++) { if (arr[k] == t

백준 2579 [c++] [내부링크]

#include <iostream> using namespace std; int arr[301], dp[301]; int main(void) { int stair, ct,temp; cin >> stair; fill_n(dp + 1, 300, 0); for (int i = 1; i < stair + 1; i++) { int point; cin >> point; arr[i] = point; } dp[1] = arr[1]; dp[2] = arr[1] + arr[2]; for (int i = 3; i < stair + 1; i++) { if (dp[i - 3] + arr[i - 1] + arr[i] > dp[i - 2] + arr[i]) dp[i] = dp[i - 3] + arr[i - 1] + arr[i]; else dp[i] = dp[i - 2] + arr[i]; } cout << dp[stair]; } 문제에서 마지막 계단을 꼭 밟으라고 했다. 게다가 계단을 올라가는 방법은 한칸 올라

백준 1085 [python] [내부링크]

x, y, w, h = input().split() x = int(x) y = int(y) w = int(w) h = int(h) distanceX = w - x distanceY = h - y distancezerotoX = x distancezerotoY = y print(min(distanceX, distanceY, distancezerotoX, distancezerotoY)) 점 (x,y)에서 (x,0), (0, y), (w,0) 그리고 (0, h) 까지의 선분 중에 최소 값을 찾으면 된다.

[C++] 백준 9012 [내부링크]

#include <iostream> #include <string> int arr[51]; using namespace std; int main(void) { int n; string str; cin >> n; for (int i = 0; i < n; i++) { cin >> str; int index = 0, sum = 0; while (index < str.size()) { if (str[index] == '(') { arr[index] = 1; if (index >= 1) arr[index] = arr[index - 1] + 1; } else { arr[index] = -1; if (index >= 1) arr[index] = arr[index - 1] - 1; } sum = arr[index] + sum; index++; } for(int index =0;index<str.size();index++) { if (arr[str.size() - 1] != 0) { cout <<

[Python] 백준 1003 [내부링크]

dp = [[0]*2 for i in range(41)] dp[0][0] = 1 dp[0][1] = 0 dp[1][0] = 0 dp[1][1] = 1 T = input() T = int(T) for i in range(2,41): dp[i][0] = dp[i-2][0] + dp[i-1][0] dp[i][1] = dp[i-2][1] + dp[i-1][1] for i in range(T): val = input() val = int (val) print(str(dp[val][0]) + " " + str(dp[val][1])) dp[2][0],dp[2][1]을 dp[40][0]dp[40][1]까지 차곡차곡 쌓아나가면 된다. 알고리즘은 피보나치와 같다. 예를들어, fibo(3) = fibo(1) + fibo(2) = fibo(1) + fibo(1)+fibo(0) 3까지 쓰인 0의 개수는 1까지 쓰인 0의 개수와 2까지 쓰인 0의 개수의 합이고 dp[3][0]= dp[1][0] + dp[2]

[C++] 백준 1932 [내부링크]

#include <iostream> #include <algorithm> int TRI[501][501]; using namespace std; int main(void) { int N, Max = -1; cin >> N; for (int i = 1; i < N + 1; i++) { for (int j = 1; j < i + 1; j++) { int point; cin >> point; if (j == 1) TRI[i][j] = point + TRI[i - 1][j]; else if (j == i) TRI[i][j] = point + TRI[i - 1][j - 1]; else TRI[i][j] = point + max(TRI[i - 1][j], TRI[i - 1][j - 1]); if (TRI[i][j] > Max) Max = TRI[i][j]; } } cout << Max; } 이 문제는 DP로 쉽게 풀 수 있는 문제이다. 알고리즘은 다음과 같다. 1. 삼각형의 i행 1(j가 첫번

[C++] 백준 11726 [내부링크]

#include <iostream> int dp[1001]; using namespace std; int main(void) { int num; cin >> num; dp[1] = 1; dp[2] = 2; for (int i = 3; i <= num; i++) { dp[i] = (dp[i - 1] + dp[i - 2]) % 10007; } cout << dp[num] ; } 문제의 규칙을 찾기 위해서 타일 2x1~ 2x6 까지 채울수 있는 방법이 몇가지 인지 세어봤다. [2 x 1] = 1 [2 x 2] = 2 [2 x 3] = 3 [2 x 4] = 5 [2 x 5] = 8 [2 x 6] = 13 dp[i] = (dp[i - 1] + dp[i - 2])라는 것을 찾을 수 있었다.

백준 2875 [c++] [내부링크]

#include <iostream> using namespace std; int main(void) { int N, M, K, max1, max2, max; cin >> N >> M >> K; max1 = N / 2; max2 = M; if (max1 < max2) max = max1; else max = max2; if ((N - max * 2) + (M - max) - K >= 0) cout << max; else { if ((K - (N - max * 2) - (M - max)) % 3 == 0) { cout << max - (K - (N - max * 2) - (M - max)) / 3; } else { cout << max - (K - (N - max * 2) - (M - max)) / 3 - 1; } } } 그리디 알고리즘 문제로 만들 수 있는 팀의 최댓값을 출력 해야한다.. 한 팀을 결성할때 여자는 두 명 남자는 한 명 필요하다. 예를들어 여자가 여덟 명 남자가 세 명이

NLP(Natural Language Processing) [내부링크]

이 게시판은 스탠포드 대학에서 무료로 배포하고있는 자연어 처리 강의 CS224N을 공부하면서 내용을 정리하는 게시판입니다. 영상 출처는 다음과 같습니다. https://www.youtube.com/watch?v=8rXD5-xhemo&list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&index=1

Lecture 2 | Word Vector Representations: word2vec [내부링크]

Context. 이산적(discrete)으로 표현된 문장은 뉘앙스가 없어서 본래의 의미와 조금 다르게 해석될 수 있다. -One-hot vector 벡터에 0이 있는 것. -One-hot Vector의 문제점 만약 motel이 [ 0 0 0 0 0 0 0 0 1]이고 hotel이 [0 1 0 0 0 0 0 0 0] 이라면 두 단어는 유사함에도 불구하고 내적 했을때 값이 0이된다. 분배 유사성을 이용해야한다. 즉, 어떤 context의 맥락을 예측하고 싶다면 그 단어가 나타났을 때 그 의미를 이해하면 된다. 그 단어들은 각각 양 옆에 단어가 있을 것이다. 그 유사성을 측정하기 위해서 두 벡터 사이의 내적을 계산할 것이다. 단어를 Vector로 바꿔보자. Word2vec Wt는 초점단어. W – t 는 컨텍스트 안에 있는 모든 단어가 포함됨. -Loss function = cost function = Objective function: 현재 중심 단어에서 어떤 문맥의 확률을 최대화한다.

Lecture 3 | GloVe: Global Vectors for Word Representation [내부링크]

1. SGD(확률경사하강법)실행 SGD를 실행했을 때 매우 큰 메모리가 소모된다. Solution: 특정한 Columns만 업데이트하는 희소 행렬 업데이트 연산을 필요로 하거나, Word 벡터에 대한 hash를 필요로 한다. 이때 value는 벡터이고 key는 word string이다. -> skip-gram모델에 대한 설명. 이때 우리가 이 모델을 계산할 때 위의 식에서 분자 부분은 계산이 간단하나, 분모 부분은 말뭉치가 이만개 있다고 가정한다면 계산을 이만번 해야 한다. 또한 각 윈도우에서 deep learning이나 learning은 zebra와 동시에 등장하지 않고 aardvark와도 동시에 등장하지 않는다. 왜냐하면 대부분의 단어들은 꽤 희소하기 때문이다. -> 진정한 쌍을 찾아서 이진 로지스틱 회귀를 하고싶다. 2. negative sampling *T는 말뭉치를 통과 할때의 윈도우에 해당한다. center word와 outsideword가 동시에 나타난다는 것을 의미한다

Lecture 3 – Neural Networks [내부링크]

Lecture 3 – Neural Networks 목차 è Softmax를 쓰든지 logistic regression을 쓰든지 상관없다. è 슬라이드에서도 나와있지만, 우리의 목표는 correct class y의 확률을 최대화 하거나, negative 로그확률을 최소화 하는 것이다. è Full dataset에서의 Cross entropy loss function è 우리는 d-차원 가중치의 열벡터를 가진다 왜냐하면 wi와 rd의 내적을 할 것이기 때문에. è 그래서 우리는 c 곱하기 d항목과 W 행렬을 가지고 그것들이 우리 모델의 매개변수가 된다. è 우리가 경사 하강법을 이용해 모델을 학습시키고자 한다면 gradiantW를 사용하고 그것을 바탕으로 loss function을 업데이트 해야한다. è 그렇다면 신경망에서는 분류화가 어떻게 다를까? Naïve Bayes models è High bias classfier라면 단지 하나의 선만 그릴 것이기 때문에 정확하지 못하다. è P

Lecture 4 – Backpropagation [내부링크]

목차 강의 내용 ->word vector가 있다. 그러한 vector를 모은 matrix가 있는데 직접적으로 classifier 시스템에 연결하지는 않는다. ->우리가 직접적으로 연결하는것은 위의 window이다. 위에서 window의 5 단어는 전부 다르지만 같은 경우도 있다. ->그럼에도 우리는 계속 경사하강을 하고 word window vector의 기울기로 작업하려고 한다. ->우리는 이 window vector를 5개의 word vector로 쪼개고 업데이트해준뒤 word vector matrix에 적용해준다. ->만약 같은 단어가 2개로 중복되어 있다면, 우리는 말그대로 둘 다의 업데이트 된 것을 적용해준다. -> forward propogation -> 1부터 시작해서 역으로 연산한다. ->단일 노드에서는 backpropagation이 쉽다. ->y 는 여로곳에서 사용되고 사용되는 계산이 다르다. -> 수학적으로는 역전파가 완벽하지만, 원하지 않는 결과를 얻을 수도 있다

Lecture 5 – Dependency Parsing [내부링크]

목차 강의내용 ->문장을 시작할때 시작 유닛은 ex) the, cat, cuddly, by, door 같은 단어이다. ->그러한 단어들이 모여서 구가되고 ex) the cuddly cat, by the door ->구는 더 큰 구로 합쳐진다. ex) the cuddly cat by the door -> 무슨 word가 다른 word를 수정할까? -> 이러한 질문이 문장의 다른 부분들이 어떻게 다른지 이해하게 도와준다. 왜 우리는 문장 구조가 필요할가? -> 언어를 정확하게 번역하고 싶어서 -> 사람들은 복잡한 의미를 전달하기위해 더 큰 개체의 word들로 구성된 idea로 소통한다 -> 위 문장은 경찰이 사람을 칼로 죽였다는 뜻으로 읽을 수 도 있고 -> 경찰이 칼을 들고 있는 사람을 죽였다고 읽을 수도 있다. 위 문장을 보면 알 수 있듯이 인간의 언어와 프로그래밍 언어는 다르다, 인간의 언어는 칼로 사람을 죽였다고 해석하거나 칼을 가진 사람을 죽였다고 해석 할 수 있는 것 처럼 칼

Lecture 6 – Language Models and RNNs [내부링크]

목차 강의내용 language model이란 어떤 단어가 x(t+1)로 올지 예측하는 것. n-gram model n-gram model이란 확률을 추정할때, 전체 단어가 아닌 일부 단어 조합의 출현 빈도만을 계산하는 것. 예제 -> 예측하고자 하는 단어 앞의 세 단어를 제외하고 버린다. -> 하지만 이게 좋은 방식일까? ->확률 추정치를 제대로 구하기는 힘들다 왜냐하면 수 많은 문장을 수집해도 출현 가능한 단어의 조합의 경우의 수는 훨씬 더 클 것이기 때문이다. 단어들의 조합이 조금만 길어져도 코퍼스에서 출현 빈도를 구할 수 없어 분자가 0이 되면서 확률이 0이 되거나, 심지어 분모가 0이 되어 정의 자체가 불가능할 수 있다. ->n을 증가시키는 것이 이러한 희소성 문제를 더 악화시킨다. -> 희소성 문제인데, count가 적어서 발생한다. ->단점은 입력을 처리할 수 있는 신경 구조가 필요하다는 것. ->동일한 가중치W가 적용되지 않는다. ->왼쪽에서 오른쪽으로 가는 것을 tim

Putty[리눅스]이용해서 파이썬 설치 및 실행 [내부링크]

이번에는 Putty를 이용해서 파이썬 설치 및 실행하는 법을 정리해보려고 합니다. 1. 우선 putty에 접속해서 로그인을 해줍니다. 2. 그리고 아나콘다 홈페이지에서 (https://www.anaconda.com/distribution/ Anaconda Python/R Distribution - Free Download Anaconda Distribution is the world's most popular Python data science platform. Download the free version to access over 1500 data science packages and manage libraries and dependencies with Conda. www.anaconda.com ) 다운받고자 하는 버전을 우클릭해 URL을 복사해줍니다.(저는 3.7버전을 다운받았습니다) 3. putty 입력창에 wget URL주소 를 입력합니다. .sh 파일이 설치될 것입니다.

ISA(명령어 집합 구조) [내부링크]

ISA(Instruction Standard Architecture) ISA란 프로그래머가 프로세서를 보는 관점이다. 프로세서와 상호작용하기위해 정보는 필요하지만, 그것이 어떻게 디자인되고 실행되는지에 대한 디테일까지는 필요하지 않다. 기계명령어 기계 명령어는 프로세서의 자연어이며 비트들로 구성되어있고 컴퓨터에게 구체적인 동작을 수행하라고 말한다. 프로그램: 특정한 일을하는 명령어의 sequence. 레지스터 CPU에는 레지스터들이 있다. 레지듯터란 데이터/명령어의 일시적인 저장소인데, 메인 메모리보다 빠르다는 장점이 있지만 비싸다는 단점이 있다. 레지스터의 종류도 다양하다. 계산을 위한 레지스터(R0,R1...) 특정한 목적을 지닌 레지스터(PC, AC, IR) 어떤 레지스터들은 프로그래머가 접근 할 수 없다. 어셈블리어, 기계어 어셈블리어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급언어이다. 따라서 어셈블리 언어는 자기 자신과 대응되는 특정한 형태의 기계어로 번역된다.

Linux 단축기 [내부링크]

기본명령어 vi 파일이름 : 파일 생성 mkdir 디렉토리 이름 : 디렉토리 생성 cd 디렉토리 : 해당 디렉토리로 이동 cd .. : 이전 디렉토리로 이동 ls : 현재 위치의 리스트 확인 ls -a: ls로 보이지 않는 리스트들까지 확인 cat 파일이름 : 파일 내용출력 python python 파일이름.py :파이썬 파일 실행 콘다 명령어 conda install 모듈 : 콘다로 파이썬 모듈 다운하기 conda --version : 콘다 버전 확인 pip 명령어 pip install 모듈 : pip로 파이썬 모듈 다운하기 pip --version : pip 버전 확인 Screen 명령어 screen -S 스크린 이름: 새로운 스크린 생성 screen -r 스크린 이름: 스크린에 다시 retatch(연결) screen -d 스크린 이름: 스크린 detach screen -ls :스크린 표시 screen -X -S 삭제할스크린 kill: 스크린삭제 사용법 새로운 스크린을 생성 이

디지털 이미지, 비디오의 기초 + 컬러비디오 비트계산 [내부링크]

-pixel: 이미지를 구성하는 원소중 가장 작은 단위 -video -frame rate: 초당 이미지의 수. [FPS] 일반적으로 33ms이다. -Intensity level -> L = 2^k , K = 비트의 개수. 쉽게 말하자면 value가 가질 수 있는 범위가 intensity level이다. 일반적으로 L = 256 -> k =8이다. -color 비디오의 비트 총 개수를 구하는 문제를 풀어보자 1. color video 라면 Red값 Blue값 Green값 3가지가 있을 것이다. 2. QHD 화질이라고 생각해보면 2560(column) X 1440(row)개의 픽셀이 있을 것이고 비트는 8개 있을 것이다. 3. fps를 33 이라고 두고 30분 영상이라고 생각해보자. 그렇다면 30분은 1800초이며 총 1800 x 33개의 프레임이 있을 것이다. 최종적으로 계산을 해보면 3 X (2560 X 1440) X 8 X (1800 X 33)으로 계산이 될 것이다.

J, JR, JAL[MIPS] [내부링크]

MIPS에서 세 가지 점프의 용도를 알아보자! 1. Jump J label 위 코드를 실행하면 label이라는 곳으로 조건없이 점프한다. 즉, PC에 TargetAddress가 할당된다. J : [op(6bit)][26 bit address] Jump의 경계는 256MB(2^(26+2))이며 범위는-2^28~ 2^28-1 까지이다. 2. Jump Register JR $ra 위 코드를 실행하면 $ra(return address)로 점프한다. 즉, PC에 $ra를 할당해 주는 것이다. 3. Jump and Link JAL label 위 코드를 실행하면 label이라는 곳으로 점프하는데, 이때 $ra레지스터에 PC 값을 넣어준다. JAL의 경계는 256MB(2^(26+2))이며 범위는-2^28~ 2^28-1 까지이다. Jump는 다른 구간으로 Jump할때 쓴다는 것을 알 수 있지만 JR, JAL 같은 경우는 도대체 왜 만들어 놓은 것일까?? JAL과 JR은 함수를 호출할때 사용된다. m

K-level thinking, 해리, 론은 영화를 몇번 보았을까?(타이타닉) [내부링크]

1. 해리와 론는 영화를 1번 이상씩 봤지만 서로 몇번 봤는지 모른다. 2. 같이 본 적은 없다. 3. 한 사람은 다른 한 사람보다 영화를 한 번 더 보았다. a) 해리->론: 난 너가 나보다 타이타닉을 더 많이 봤는지 모르겠어. b) 론->해리: 나도 잘 모르겠어. c) 해리->론: 너도 모른다구? 나 이제 알겠어! d) 론->해리: 나도! 해리는 영화를 몇번 보았을까? 가능성 1) 해리는 론이 “나도 그래”라고 말한 것을 듣고 론이 영화를 몇번 봤는지 알게 되었다. 어떻게 알 수 있었을까?? 해리는 영화를 두 번 보았다고 생각해보자. 해리는 영화를 두번 보았기 때문에 론이 영화를 한 번 보았을지 세 번 보았을지 알 수 없다. 해리는 론이 “나도 그래”라고 한 것을 들은 순간 이렇게 생각했을 것이다. 만약 론이 영화를 1번 보았다면 내가 영화를 2번 봤다고 대답할 수 있었을 꺼야(영화를 안 본 경우는 없기 때문에). 하지만 그렇게 하지 않은 걸 보니 론은 영화를 1번 보지는 않았어

QTSPIM설치 및 사용법(어셈블리어) [내부링크]

1. 설치 http://sourceforge.net/projects/spimsimulator/files/ spim mips simulator - Browse Files at SourceForge.net qtspim_9.1.20_linux64.deb 2017-08-29 19.8 MB 160 QtSpim_9.1.20_mac.mpkg.zip 2017-08-29 12.4 MB 320 QtSpim_9.1.20_Windows.msi 2017-08-29 13.8 MB 350 QtSpim_9.1.19_Windows.msi 2017-07-29 32.3 MB 995 QtSpim_9.1.19_mac.mpkg.zip 2017-07-25 12.4 MB 8 qtspim_9.1.19_linux64.deb 2017-07-25 19.8 MB 4 QtSpim_9... sourceforge.net 위 링크에서 자신의 운영체제에 맞는 최신 버전을 다운로드 해줍니다. 2. 사용법 설치를 완료한 후 QtSpim을 켜보시면

라즈베리파이(버스터) MQTT설치방법 [내부링크]

라즈베리파이 버전 확인 lsb_release -a 버스터 버전 MQTT 설치방법 sudo wget https://repo.mosquitto.org/debian/mosquitto-repo.gpg.key sudo apt-key add mosquitto-repo.gpg.key cd /etc/apt/sources.list.d/ sudo wget http://repo.mosquitto.org/debian/mosquitto-buster.list sudo apt-get update sudo apt-get install mosquitto mosquitto-clients sudo apt-get install python-pip sudo pip install paho-mqtt MQTT 시작과 중지 sudo /etc/init.d/mosquitto start sudo /etc/init.d/mosquitto stop

특고압 수전설비 구성형태 [내부링크]

수전 설비 결선도에 관한 문제를 풀다가 자꾸 헷갈려서 정리해보려고 한다. 수전 설비 결선도는 CT와 PT의 위치에 따라 3가지 형태로 나뉘어진다. 그 형태는 다음과 같다. 1. CB 1차측에 CT를, 2차측에 PT를 시설 2. CB 1차측에 PT, CT를 시설 3. CB 1차측에 PT를, 2차측에 CT를 시설 알아보기 쉽게 표로 정리해보자. CB 1차측 CT PT, CT PT 2차측 PT X CT

전선단면적 구할때 e는 상전압? 선간전압? [내부링크]

전선단면적[mm^2] 단상 3선식 3상 4선식 A = 17.8LI/1000e 단상 2선식 직류 2선식 A = 15.6LI/1000e 3상 3선식 A = 30.8LI/1000e 전선 단면적을 구하는 문제를 풀때 전압강하에 상전압을 써야할지 선간전압을 써야할지 헷갈릴 때가 있습니다. 3상 3선식은 상전압과 선간전압이 같으므로 둘 다 써도 상관없지만 그 경우가 아니라면 전기 방식이 어떻든 간에 항상 '상전압'을 써주는게 맞습니다.

전기기사 실기 합격! [내부링크]

첨부파일 2019,2018,2017,2014~2008.zip 파일 다운로드 전기기사 최종 합격했습니다!! 공부를 함에 있어서, 이해하는것도 중요하지만 이해만 한다고 그 지식이 온전히 나의 것이 된다고 생각하지 않습니다. 선 이해, 후 암기를 해야 그 지식이 나의 것이 된다고 생각합니다. 저는 암기가 잘 안되는 문장들을 키워드 위주로 빈칸 뚫어서 외웠습니다. 2016, 2015년도는 만들지 않았는데... 혹시나 필요한 분들은 쓰세요!

빌딩에너지관리 시스템 [내부링크]

(백강철 대표의 등촌광장)빌딩에너지관리 시스템 'BEMS' KS 제정과 문제점 산자부는 건물 에너지관리 시스템(BEMS. Building Energy Management System)에 대한 국가표준(KS F 1800-2) 제정안을 확정하여 1월 18일(월) 고시했다. BEMS는 건물설비에 센서를 통해 실시간 에너지사용 데이터를 수집 분석하여 에너지소비 절감과 건물의 쾌적한 실내환경 유지에 활용하는 최첨단 ICT 시스템이다. 2017년 1월부터 연면적 1만m2 이상 공공건물에 BEMS 설치를 의무화로 보급을 추진해왔으며 그동안 공청회, 전문가 의견수렴 및 기술심의회 등을 거쳐 BEMS에 대한 국가표준 제정… www.electimes.com

(박호정 교수의 월요객석) 탄소 라운드의 충격에 대비하자 [내부링크]

(박호정 교수의 월요객석) 탄소 라운드의 충격에 대비하자 EU의 탄소국경조정제도 발표가 임박하였다. 온실가스를 2030년까지 1990년 대비 55% 감축하겠다는 계획을 이미 EU는 발표한 바 있다. 목표달성을 위하여 에너지효율, 건물, 토지이용, 에너지세제, 배출권거래제 등을 포함하는 이른 바 ‘55 패키지’를 강력하게 추진하고 있다. 이러한 조치는 EU 내 산업의 탄소비용 부담을 증대시켜 탄소누출을 야기할 수 있기 때문에, EU로 수출하는 국가와의 탄소비용 차이를 탄소국경조정제도를 통해 해소할 계획이다.탄소국경제도의 구체적인 형태는 6월에… www.electimes.com

[공유] 김순권 [내부링크]

그 외 [공유] 김순권 갈대상자 2021. 5. 19. 22:14 이웃추가 본문 기타 기능 옥수수 박사 김순권 교수님. “남을 위해서 살아가는 것. 자기가 이 세상에 무엇을 하러 왔는가를 한번 생각해보면 좋겠습니다. 희망이 없다고 절망하는 분들이 많습니다. 그것은 어쩌면 나보다 잘사는 사람과 비교하기 때문일 수도 있습니다. 나보다 더 어려운 사람을 생각하고 그것을 극복하려고 노력할 때 거기에서 힘이 생기고, 새로운 아이디어가 생기고, 사랑이 싹틉니다. 사람은 어려움을 겪으면 겪을수록 더 많은 일을 할 수 있습니다. 그러니 절대 실망하지 말고 그것을 극복해야 합니다.” “나를 위해서가 아니라 남을 위해서. 나 보다는 남을 위해서 사는 삶이 더 재미있습니다. 자기 자신만을 위해서 사는 삶은 어느 정도 목표를 이루면 끝입니다. 할 게 없어요.” “자기가 이 세상에 무엇을 하러 왔는가를 한번 생각해보면 좋겠습니다.” 너무 감명깊다. 출처by 인생스토리 | 네이버 지식백과 김순권 “이 세상에

사용후 배터리, ESS 등 활용방안 찾는다 [내부링크]

사용후 배터리, ESS 등 활용방안 찾는다 전기차용으로 사용되고 폐기되는 배터리를 활용해 ESS(에너지저장장치)로 재활용하는 등의 추가 활용방안이 마련된다.산업통상자원부는 앞으로 발생이 증가할 것으로 전망되는 사용후 배터리의 고부가가치 재활용을 위한 기술 및 응용제품 개발을 본격 추진한다고 18일 밝혔다.산업부는 올해부터 2024년까지 국미 130억원을 투입해 EV(전기차) 및 ESS 사용후 배터리 응용제품 기술개발 및 실증사업을 추진한다.사업은 크게 3분야로 이뤄진다. 재사용, 재제조 배터리 팩 성능 및 안전성 시… www.electimes.com

국내 대표 에너지산업 전시회, 코로나 이겨내고 성황 [내부링크]

국내 대표 에너지산업 전시회, 코로나 이겨내고 '성황' - 에너지신문 [에너지신문] 코로나19 장기화로 위축된 전력산업계에 활력을 불어넣을 국내 대표 에너지산업 전시회가 막을 올렸다.7~9일 코엑스에서 열리는 '2021 한국전기산업대전, 발전산업전, 한국스마트그리드엑스... www.energy-news.co.kr

[불합격 수기] SSAFY 6기 [내부링크]

지난 5월 14일 2021년 삼성청년SW아카데미 6기에 지원했는데 불합격했다. 채용 과정은 다음과 같다. 1. 에세이 2. SW적성진단(인적성 15문 / CT 5문제) 3. 인터뷰 SW적성진단은 인적성 11문(?), CT 3문제 좀 넘게 풀었고 오픈 카톡방에서 평균살짝 위(?)정도였다. 그런데 불합격 된 걸 보면 이번 6기에서는 에세이를 많이 본 것 같다(인적성도 별로 못 풀고 CT도 2문제 밖에 못풀고 붙은 사람도 있다고 하니...) 에세이 항목은 다음과 같다. 1. SW에 관심을 갖게 된 계기와 향후 어떤 SW개발자로 성장하고 싶은지, 이유는 무엇인지 SW관련 경험(학습, 취미, 사용경험 등)을 토대로 작성 바랍니다. 2. 취업을 목표로 했던 활동(회사 입사지원 및 면접참석, 인턴 및 직무체험, 취업을 위한 학습 및 자격증 취득 등)중에 가장 기억에 남는 경험을 기술하고, 이를 통해 배우고 느낀 점 등을 작성해 주시길 바랍니다. 에세이를 어떤 컨셉으로 쓸지 고민했고 '간절하고 진

바이든이 앞당기는 美태양광 시대, 韓 기업 공략 박차 [내부링크]

https://www.edaily.co.kr/news/read?newsId=03630966629013496&mediaCodeNo=257 바이든이 앞당기는 美태양광 시대, 韓 기업 공략 박차 조 바이든 미국 대통령이 친환경 에너지 투자를 비롯한 대규모 인프라 투자 계획을 발표하면서 태양광 시장의 성장세가 더욱 빨라질 것이란 관측이 나온다. 미국 주거용·상업용 태양광 시장에서 선전하는 한화큐셀과 LG전자, 미국 진출 채비를 마친 현대에너지솔루션도 미국 태양... www.edaily.co.kr

단계별 스마트팩토리 구축, 하나의 플랫폼에서 가능 [내부링크]

단계별 스마트팩토리 구축, 하나의 플랫폼에서 가능 - 공학저널 [공학저널 김하늬 기자] 제조업의 디지털을 통한 데이터 활용은 전 세계 제조업의 화두로 자리 잡고 있다. 이 가운데 천편일률적인 솔루션을 탈피하고 단계별로 특성을 반영한 스마트팩토리 구축 플랫폼이 등장해... www.engjournal.co.kr

모터의 친구 인버터(Inverter)를 소개합니다 - 한국전력 블로그 굿모닝 KEPCO! [내부링크]

모터의 친구 인버터(Inverter)를 소개합니다 모터의 친구 인버터 아직은 낯선 친구인버터에 관해 알아보자 사진 출처 : 위키미디어commons.wikimedia.org 안녕하세요 여러분! 전기사랑기자단의 홍유란 기자입니다. 지난 글에서는 전기모터에 관해 설.. blog.kepco.co.kr

에너지저장시스템(ESS)의 핵심 전력변환장치(PCS)를 소개합니다! - 한국전력 블로그 굿모닝 KEPCO! [내부링크]

에너지저장시스템(ESS)의 핵심 전력변환장치(PCS)를 소개합니다! 우리는 과일을 산 다음 냉장고에 보관하다가, 먹고 싶을 때 과일을 꺼내 먹죠. 과일처럼 전기를 창고에 보관하다가 우리가 사용하고 싶을 때 사용한다면 정말 편리하지 않을까요? 에너지저장시스템이라고도 불리.. blog.kepco.co.kr

PLC와 SW [내부링크]

https://www.youtube.com/watch?v=soNUNmltfn8

[공유] 라즈베리파이 + aws IoT/S3 + flask + python 사용한 가스밸브확인 서비스 개발 후기 [내부링크]

라즈베리파이/아두이노 [공유] 라즈베리파이 + aws IoT/S3 + flask + python 사용한 가스밸브확인 서비스 개발 후기 갈대상자 2021. 6. 20. 20:31 이웃추가 본문 기타 기능 출처 라즈베리파이 + aws IoT/S3 + flask + python 사용한 가스밸브확인 서비스 개발 후기 by developer Y 라즈베리파이 + aws IoT/S3 + flask + python 사용한 가스밸브확인 서비스 개발 후기 울 와이프님께서 외출시마다 항상 "가스불 확인했어?" 라고 걱정을 하여 가스밸브가 잘 닫혀있는... blog.naver.com 스크랩된 글은 재스크랩이 불가능합니다.

[공유] [계장/통신] 모드버스 프로토콜 (Modbus Protocol) [내부링크]

그 외 [공유] [계장/통신] 모드버스 프로토콜 (Modbus Protocol) 갈대상자 2021. 6. 21. 6:48 이웃추가 본문 기타 기능 출처 [계장/통신] 모드버스 프로토콜 (Modbus Protocol) by 꿍까 계장/통신 모드버스 프로토콜 Modbus Protocol 모드버스 Modbus는 1997년, 지금의 슈나이더 일렉트릭Scheneider Electric의 modicon 모디콘 이라... blog.naver.com 스크랩된 글은 재스크랩이 불가능합니다.

[공유] 전력 계통 [내부링크]

전기, 에너지 [공유] 전력 계통 갈대상자 2021. 6. 21. 23:56 이웃추가 본문 기타 기능 출처 전력 계통 by 취업 사다리 전력 계통 마트의 음식이나 가전제품 등은 생산자로부터 여러 단계를 거쳐 소비자에게 도착합니다. 이처럼 우리가 사... blog.naver.com 스크랩된 글은 재스크랩이 불가능합니다.

[공유] 태양광 인버터 - 최대전력 추종 (MPPT) 원리 [내부링크]

그 외 [공유] 태양광 인버터 - 최대전력 추종 (MPPT) 원리 갈대상자 2021. 7. 6. 6:15 이웃추가 본문 기타 기능 출처 태양광 인버터 - 최대전력 추종 (MPPT) 원리 by 담송 태양광을 이용하여 전력을 발생하는 태양광 인버터에서 중요한 알고리즘 중에 하나가 최대전력 추종( MPPT : Maximum Power Point Tracking) 알고리즘이다. 이러한 알고리즘은 여러가지가 있는데 가장 보편적으로 사용하는 방식은 P&O ( Perturbation & observation )방식이다. 계통연계 인버터는 항상 태양전지의 최대 전력 발생지점( MPPT)을 추적하는 알고리즘을 통해 계통으로 최대 발전전력을 송전한다. 최대전력 추종을 하기 위해서는 태양전지의 특성을 알아야 한다. 태양전지는 아래와 같은 전기적인 특성을 가지고 있다. 가는 선이 전력의 특성을 나타내는 선이고 굵은 선이 전압과 전류의 특성 곡선이다. 이 그래프를 보고서 알아야 하는 것은 최대전력을 나타내

Volatile으로 선언하는 이유 [내부링크]

하드웨어를 제어할 때 Volatile로 선언되지 않은 경우는 프로세스가 실행되면서 코드를 알아서 최적화하기 때문에 우리가 원하는 실행결과가 나오지 않을 수도 있기 때문입니다! 하지만, Volatile을 사용하면 최적화를 하지 않습니다. 예를들어, C언어 컴파일러는 다음과 같은 코드를 자동으로 최적화하여 메모리 주소 0x2000100에 0x00000002를 넣는 코드만 실행 될 것입니다. (*((unsigned int *)(0x2000100))) = 0x00000000; (*((unsigned int *)(0x2000100))) = 0x00000001; (*((unsigned int *)(0x2000100))) = 0x00000002; 반면, 다음과 같이 volatile으로 선언한다면 컴파일러가 코드를 최적화하지 않기때문에 모든 코드가 실행될 것입니다! (*((volatile unsigned int *)(0x2000100))) = 0x00000000; (*((volatile unsig

포트포워딩(외부IP로 내 웹페이지에 접속) [내부링크]

라즈베리파이를 이용하여 프로젝트를 진행하면서, 와이파이 모듈을 많이 이용해보셨을 텐데요. 웹페이지를 구축했지만, 라즈베리파이를 물려놓은 공유기의 WiFi를 이용하지 않으면 그 웹페이지에 접속이 안되었던 경험이 있으실 겁니다!! 이때 간단히 해결할 수 있는 방법이 포트포워딩입니다. 우선 포트포워딩을 하는 방법을 설명하기에 앞서, 공유기에 대한 설명을 잠깐 해보도록 하겠습니다. 공유기란 하나의 IP(공인IP)를 이용하여 여러대의 장치를 인터넷에 연결할 수 있게 해주는 장치인데요, 공유기를 사용하는 이유는 전세계의 수 많은 장치들에 IP주소를 할당해주기에는 IP주소가 부족하기 때문입니다. 집에서 공유기를 사용하면 아마 다음과 같이 여러개의 장치들이 한 공유기에 물려있을 것입니다. (*참고* 여기서 보시면 제 아이피는 192.으로 시작하는데 이건 공인IP가 아닙니다!!) 본격적으로 포트포워딩 설정하는 방법으로 들어가보겠습니다. 1. 명령어 프롬프트 창으로 들어가주세요. 2. ipconfig

Tinker CAD [내부링크]

예전에 프로젝트 하면서 설계했던 수중글라이더입니다. 오랜만에 틴커캐드에 접속해서 파일 좀 백업해 놓으려고 했는데, 너무 오래되서 그런지 사라졌네요 ㅠㅠ 항상 작업한 파일은 백업해놓아야겠습니다 ㅠㅠ!

부스트 컨버터 및 벅 컨버터 [내부링크]

https://www.youtube.com/watch?v=vwJYIorz_Aw

main 함수 파라미터 넘기기(argc, argv) [내부링크]

프로그래밍을 하다보면, 종종 main함수를 이용해 파라미터를 넘겨야 하는 상황이 생깁니다. 예를들자면, 두 프로그램 사이에 통신하여 채팅 프로그램을 만드는 경우가 있겠네요!! #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { for (int i = 0; i < argc; i++) printf("argv[%d] = \"%s\"\n", i, argv[i]); printf("The number of argc %d \n", argc); } 위의 코드를 실행해보시면, 감이 오실겁니다! argc는 main에 전달할 데이터 갯수, argv는 실제로 전달할 데이터라고 보시면 되겠습니다! 윈도우에서 실행하시려면, 위의 c코드를 컴파일러를 이용해 컴파일 및 링크 한 후 .exe 파일로 만들어 줍니다. 그 후, 명령어 프롬프트를 이용해 다음과 같이 실행하시면 되겠습니다!!

IGBT(절연 게이트 양극형 트랜지스터) [내부링크]

https://www.youtube.com/watch?v=OKoimpZhXpw

CAN 통신 (1) [내부링크]

- 하나의 버스에 여러대의 장치가 물려있는 구조. - 버스에 연결된 모든 장치는 내부에 ID필터를 가지고 있어서, 통신시 ID정보를 필터링 하여 선택적 혹은 모든 데이터만 수신 가능(하나의 장치가 여러대의 ID를 사용 가능) - 모든 장치가 마스터로 동작 가능. - 차동신호(CAN_H, CAN_L)로 동작(노이즈에 대해 저항성이 있다) 11bit standard CAN Frame - 11bit base ID - Data는 최대 8byte 까지 전송할 수 있다.

인터럽트에 대해 [내부링크]

임베디드 시스템이란 말 그대로 내장형 시스템을 의미합니다! 구체적으로는 반복적인 일들을 수행하면서, 특정 기능을 수행하는 시스템을 의미해요!! 그 방법으로는 main문을 반복적으로 실행하는 것인데요...!!! 이런 임베디드 시스템은 외부환경의 변화에 대응할 수 있어야 합니다!(예를들어 자판기에 동전을 넣는다던가, NFC태깅을 한다던가하는 경우 등이 있겠네요!) 외부 변화에 대응하는 방식은 크게 두 가지가 있습니다. 1. 폴링 방식 폴링방식이란 주로 if문을 사용하여, SW적으로 외부 변화를 감지하는 방식입니다. 스레드를 반복적으로 돌면서, 변화가 발생했다면 동작을 하는 방식으로 오차가 발생할 수 있습니다.(외부 시그널이 들어와도 내부적으로 코드가 if문을 지나 갔다면 인식하지를 못하겠지요??) 즉, 위와 같은 방식으로 이벤트 발생을 감지하려고 한다면 끊임없이 해당 신호를 읽어서 이벤트 발생 유무를 판단하여야 할 것입니다. 2. 인터럽트 방식 인터럽트 방식이란 HW적으로 외부 변화를

임베디드 OS 개발 프로젝트 [내부링크]

첫 번째 프로젝트로는 임베디드 OS 개발 프로젝트를 진행해보려고 합니다!! 이 프로젝트가 제 커리어에 어떤 도움 을 줄지는 모르겠지만.... 목표는 7월달까지 이 책 정독하고 저만의 OS를 하나 만드는 것입니다!! 후... 화이팅!! -------------------------------------------------------------------------------------------------------------------------------너무 빡세요 ㅠㅜ 8월 첫째 주까지로 기한을 늘리겠습니다. (07/26)

운영체제란 [내부링크]

임베디드 운영체제 한정된 자원을 가지고 있기 때문에 최적화시켜야 한다. 1.1 운영체제 - 하드웨어 관리 - 응용프로그램과 하드웨어 사이에서 인터페이스 역할. - 시스템 동작 제어 1.1.1 프로세스 관리 - 운영체제에서 작동하는 응용프로그램을 관리 - 현재 CPU를 점유해야 할 프로세스를 결정하고 CPU 자원을 프로세스에 할당합니다. 1.1.2 저장장치 관리 - 1차 저장장치인 시스템 메인 메모리와 2차 저장장치인 스토리지 디바이스등을 관리하는 기능 1.1.3 네트워킹 관리 - TCP/IP 기반 인터넷에 연결하거나 다른 특별한 프로토콜 기반 네트워크에 연결할 때 운영체제에서 네트워크 프로토콜을 지원해야함. 1.1.4 사용자 관리 - 한 컴퓨터를 여러 사람이 사용하는 환경을 지원. 각 계정을 관리하는 기능 1.1.5 디바이스 드라이버 - 시스템의 하드웨어를 관리 하기 위해 하드웨어를 추상화하는 계층. - 운영체제는 많은 디바이스 드라이버를 효율적으로 관리하는 기능을 갖고 있어야 함.

Windows10에서 Linux 및 GCC 설치 [내부링크]

안녕하세요~! 오늘은 Windows10에서 Linux를 설치하는 방법에 대해서 포스팅 해보려고 합니다! 바로 본론으로 들어갈께요! Windows10에서 Linux 설치 1. "Windows 기능 켜기/끄기" 창에 들어갑니다. 2. "Windows 기능 켜기/끄기" 창에 들어가면 다음과 같은 창이 나올텐데요!! "Linux용 Windows 하위 시스템"을 체크 해주면 됩니다!! 그러면 잠시 후에 컴퓨터를 재부팅 하라는 메시지가 뜰텐데요! 재부팅 해주시면 됩니다! 3. MS store에 들어가신 후, Linux를 검색하여 Ubuntu를 다운받아줍시다!! GCC(ARM) 컴파일러 설치 명령어는 다음과 같습니다. sudo apt install gcc 혹시 오류가 발생한다면 아래의 명령어를 입력해주신 후 다시 위의 명령어를 입력해주세요! sudo apt-get update

Qmenu와 gdb 연동 [내부링크]

리셋벡터 리셋 벡터란? 메모리주소 0x00000000이다. ARM 코어에 전원이 들어가면 ARM 코어가 가장 먼저 하는 일은? 리셋 벡터에 있는 명령을 실행하는 일!, 즉 우리는 메모리 주소 0x00000000에 명령어를 넣어주어야 한다. 실전연습 mkdir boot 부팅에 관련된 소스가 담길 것입니다! vi Entry.S .text // .end가 나올때까지 모든 코드가 text 섹션 .code 32 // 명령어가 32bit 크기 .global vector_start // .global은 c언어의 extern .global vector_end // vector_start와 vector_end의 주소정보를 외부 파일에서 심벌로 있게 하는 것. vector_start: // vector_start라는 레이블을 선언 MOV R0, R1 // ARM의 레지스터 R0, R1 vector_end: // vector_end라는 레이블을 선언 .space 1024, 0 // 해당위치부터 1024

부팅 및 메모리 설계 [내부링크]

4장 부팅하기 부팅의 정의로는 정해진 것이 없지만, 일반적으로 1. 시스템에 전원이 들어가서 모든 초기화 작업을 마치고 펌웨어가 대기(idle)상태가 될때까지 2. 시스템에 전원이 들어가고 ARM 코어가 리셋 익셉션핸들러를 모두 처리한 다음에 본격적으로 C언어 코드로 넘어가기 직전까지 메모리는 아래와 같이 설계했습니다. text 영역: 코드가 있는 공간, 임의로 변경하면 안된다. - 리눅스 같은 거대한 운영체제를 사용하지 않을 것이므로 RTOS를 사용하는 펌웨어는 많아야 수십 KB 정도면 충분 - 익셉션 벡터 테이블을 text영역에 포함시킬 것이므로 시작 주소는 0x00000000입니다. 크기를 1MB로 설정하면 끝나는 주소는 0x000FFFFF data 영역: 초기화한 전역 변수가 있는 공간. 전역변수를 선언할 때 초기 값을 할당해서 선언하면 해당 전역 변수가 점유하는 공간은 여기에 할당 됨. BSS 영역: 초기화하지 않은 전역 변수가 있는 공간. 초기화하지 않은 전역 변수이므로

UART(Universal Asynchronous Receiver/Transmitter)기능 구현 [내부링크]

UART는 Universal Asynchronous Receiver/Transmitter의 약자로, 범용 비동기화 송수신기라고 한다. 주로 콘솔 입출력용으로 사용합니다. 실습(N을 100번 출력하는 코드) #include "stdint.h" #include "HalUart.h" static void Hw_init(void); void main(void){ Hw_init(); uint32_t i = 100; while(i--){ Hal_uart_put_char('N'); } } static void Hw_init(void){ Hal_uart_init(); } 결과 콘솔에 UART 출력 성공입니다!! 출력뿐만 아니라 입력도 받아봤습니다!

[코테] Python에서 많이 쓰이는 함수들! [내부링크]

안녕하세요~! Python에서 많이 쓰이는 함수들에 대해서 포스팅 해보려고 합니다! 음... 물론 한 번에 다 포스팅하기는 힘들것 같아서... 며칠에 걸쳐 수정하고 수정해서 올리려고 합니다!! 가장 기본적인 것 부터 시작해볼께요~!! 0. 파이썬 연산자(**, //, %) ** : 제곱 // : 몫 % : 나머지 1. 공백을 포함한 Input을 리스트에 넣기 n = list(map(int, input().split())) 실습 2. range(A, B, C): A 부터 C만큼 증가하며 B-1까지 반환한다. n = range(1,10,2) 3. lower(), upper(): 스트링을 소문자 및 대문자로 변환. "ABC".lower() "abc".upper() 4. ord < - >chr: 전자는 유니코드 값을 반환해주는 것. 후자는 유니코드 값을 입력받아 그 코드에 해당하는 문자를 출력. ord('a') chr(ord('a')) 응용하면 다음과 같이 사용할 수 있습니다. ord('a

ADC 실습 [내부링크]

안녕하세요~! 오늘은 mbedos 컴파일러를 사용하여 진행했었던, ADC 실습에 대해서 포스팅 해보려고 합니다! https://ide.mbed.com/compiler/#nav:/; Log in | Mbed Log in New to Mbed? Create an account Email address Only know your username? Get an email reminder. ide.mbed.com 위 사진은 제가 만들었던 프로젝트들 입니다~ ㅎㅎ - ADC Introduction - ADC(Analog-to-Digital Converter) 장치는 아날로그 신호를 디지털 신호로 변환하는 장치이며, 아래의 그림과 같이 다수의 입력 신호를 선택하여 디지털 신호로 변환할 수 있습니다. STM32F411RE MCU는 1개의 12 비트 SAR ADC를 지니고, 최대 16개의 외부 입력 신호와 3개의 내부 입력 신호를 디지털 신호로 변환할 수 있습니다. ADC의 결과 값은 16bit 레