장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
-
[프로그래머스][dp] 땅따먹기0626분프로그래머스 알고리즘 강좌가 dp 이해에 도움이 됐다는 글을 보고 '땅따먹기'를 시도했다. 직접 짜보고 dp 코드와 비교하니까 dp의 느낌이 확 와닿는다. dp는 모든 경우의 수를 확인하는데, 각 요소가 있고, 없고에 따라 경우를 만든다. 문제와 함께 보자 문제ㅎ. 하지만 나는 어제 dp를 정리해 놓고도 전혀 떠오르지 않아서 풀리는 대로 풀었다. (이해가 덜 됐다ㅜ)내 풀이 방법1. 현재 index(j)를 이전 max의 index와 비교해 같지 않은 경우에만 들어간다. - if ( i == 0 ) 인 예외를 주는 데 시간이 오래 걸렸다. 다시 생각해 보니 첫 열은 index가 뭐든 관계없으니까 preindex 처음 선언할 때 preindex = -1; 했으면 됐겠다. 2. index가 같지 않은 경우..
-
[백준 1106] DP 동적프로그래밍0625분동적 프로그래밍(Dynamic programming)이란 과거에 사용한 값을 중복해서 사용하는 경우에서 사용할 알고리즘을 말한다. 대표적으로 배낭 문제, 피보나치 수열이 있다. 이전에 구해놓은 값을 재사용하기 때문에 재귀함수를 이용해야 한다. 재귀함수를 naive하게 사용하게 되면 시간, 공간복잡도가 폭발적으로 증가한다.부분 문제에 대한 값을 미리 계산해놓고 한 번에 이용하는 것이 시공간 관점에서 효율적이다. 따라서 Memoization(메모이제이션)을 활용한다.같은 문제의 풀이를 재활용하는 방식인데, 재귀의 방법이 있다. 부분 문제에 대한 경우의 수를 모두 구할 건데, 이 때 재귀를 사용한다. 부분 문제를 넣고(1), 빼고(0) 에 대한 경우의 수를 구하는 것이다.dp의 memoization은 하향식으..
-
2024 Te-KHU Conference 후기0604분2024.06.01 기말고사를 2주 앞둔 주말 낮.. 구체적인 계획은 없으나 진로를 컴퓨터 공학과로 잡은 나에게 좋은 기회가 생겼다. 그것은 바로현직에서 활동 중이신 선배님들의 연사4분이 오셨고, 컴공의 드넓은 분야를 개괄하는 이야기를 들을 수 있었다. 첫 연사는 대학생 때 알았더라면 좋았을 것들이다.엄마가 하지 말라고 하는 것들, 늦게 자지 마라.. 라면 많이 먹지 마라.. 등등 새겨듣고 실행한다면 정말로 도움이 되는 말들이 있다. 우리는 정답을 알고 있다. 단지 당장 가시적인 효과가 나오지 않아서 실행할 의지보다 당장의 욕구가 더 클 뿐이다..꾸준한 영어 공부, 블로그 운영, 다독, 탄탄한 CS 지식의 필요성을 말씀하셨다. 나는 사실상 졸업할 나이이므로.. 매우 공감하며 들었다. 이 중 티스토리를 열..
-
2024 경희대 해커톤 khuthon 스탭 후기0527분2024년 5월 10일 금요일 18:00 ~ 2024년 5월 11일 토요일 12:00 (무박 2일) 간 진행된 khuthon에 스탭으로 참여했다. 주제는 환경과 소프트웨어: 지속가능한 지구와 인간사회를 위한 ESG 관점의 고찰 이번 학기에 컴퓨터 공학과 다전공이 승인이 났기에 아직은 생소한 컴퓨터 개발 문화를 몸소 체험해보고 싶었다. 개발에 직접 뛰어들기는 무리라고 판단해 스탭을 지원했다. 매우 만족한 경험이었다. 전날 6시부터 다음날 9시까지 무박 2일동안 코딩을 한다. 한 강의실에서 결과물을 낼때까지 150명이 모여 코딩을 했다. 대회 뒤에선 14명의 스텝들이 교대로 쪽잠자면서 승무원처럼 밥 나눠주고 치워주고, 간식주고 치워준다. 대회가 끝나면 쓰레기 갖다버리고, 현수막 치우고, 멀티탭을 걷어 동방에..
-
OS_3_Process0527분프로세스의 개별 구성요소를 식별하고 운영체제에서 해당 구성요소가 어떻게 표현되고 스케쥴 되는지 기술한다.운영체제에서 프로세스를 생성하고 종료하는 방법을 설명한다. 이러한 작업을 수행하는 시스템 콜을 이용한 프로그램 개발을 한다.공유 메모리 및 메시지 전달을 사용하는 프로세스 간 통신을 설명하고 대조한다.파이프와 POSIX 공유 메모리를 사용하여 프로세스 간 통신을 수행하는 프로그램을 설계한다.소켓과 원격 프로시저 호출을 사용하여 클라이언트-서버 통신을 설명한다. Linux 운영체제와 상호 작용하는 커널 모듈을 설계한다.
-
2023 ETRI 주관 오픈소스 R&D 생태계 강화1121분1011 ETRI 주관 오픈소스 R&D 생태계 강화에 다녀왔다.지속가능하고 국내 SW 생태계 강화를 위한 전문가의 강연을 들어보는 시간이었다. [국민대교수 이민석]개발자 수입원; 60% unpaid.> 계약을 통한 professional의 비즈니스를 선호한다.Cloud EraAws, Microsoft, google 주도의 규모 있는 생태계 형성> Data쪽으로 확산 open source 철학에 도전 - 철학과 기업의 충돌기업의 오픈 소스 상업적 이용 > 수익 배분의 문제가 license 문제로 번졌다.> SSPL, BUSL, RSAL- SSPL; managing service 소스 공개 요구- BUSL; 상업적 서비스 제한 기간 설정 국내 오픈 소스 인식단순 활용이 많음 > 프로젝트에 대한 리뷰와 수정..
-
유닉스의 탄생, 한빛미디어(2)1116분1편에서는 분리가능한 볼륨을 지원하는 계층적 파일 시스템을 이해했다.이어서 '2. 서로 호환되는 파일, 디바이스, 프로세스 간 입출력'과 '4. 사용자 단위로 선택 가능한 시스템 명령어'를 알아보겠다. 우리는 보통 키보드, 마우스를 통해 데이터를 입력하고 모니터를 통해 출력 정보를 본다. 입출력은 명확하다. 프로그램을 실행하고자 한다면 마우스에서 크롬을 클릭하여 크롬을 실행할 수도 있고, 셸(Shell)을 이용해서 프로그램을 실행할 수도 있다. 셸이란 사용자가 명령어를 실행하도록 해주는 프로그램이자 사용자와 운영체제 간의 주된 인터페이스다. 인터페이스는 매개체? 정도로 이해할 수 있다. 셸은 운영체제에 필수 부분이 아닌 사용자 프로그램이라서 다양한 셸을 이용할 수 있다. 다양한 프로그램이어도 같은 구문..
-
유닉스의 탄생, 한빛미디어(1)1116분유닉스의 탄생(브라이언 커니핸, 한빛미디어) 자연계열학과에서 다전공을 하겠다며 호기롭게 청강한 소프트웨어 강의에서 '리눅스 한 달 살기' 과제를 받았다. 리눅스? 처음 듣는 말이었다. 운영체제라는 말도 낯선 나였다. 리눅스 기반 운영체제를 이용해 일주일에 하나씩 소프트웨어를 설치해 리포트를 쓰는 과제였다. 뭐가 얼마나 복잡하면 프로그램 설치를 리포트로 쓸까..라는 생각이 들었다. 컴퓨터에 대한 배경지식이 없었으므로 어디서부터 시작해야 할 지 감이 오지 않았다. 그러면서 교수님께서 추천해 주신 유닉스의 탄생을 읽게 됐다. 책은 유닉스의 탄생 과정을 옆에서 지켜본 브라이언 커니핸의 구체적인 서술로 이루어진다. 할머니가 옛날 얘기해 주는 듯한 사실적이고 자세한 묘사가 좋았다. 나는 최대한 할 수 있는 ..
프로그래머스 알고리즘 강좌가 dp 이해에 도움이 됐다는 글을 보고 '땅따먹기'를 시도했다. 직접 짜보고 dp 코드와 비교하니까 dp의 느낌이 확 와닿는다. dp는 모든 경우의 수를 확인하는데, 각 요소가 있고, 없고에 따라 경우를 만든다.
문제와 함께 보자
문제
ㅎ. 하지만 나는 어제 dp를 정리해 놓고도 전혀 떠오르지 않아서 풀리는 대로 풀었다. (이해가 덜 됐다ㅜ)
내 풀이 방법
1. 현재 index(j)를 이전 max의 index와 비교해 같지 않은 경우에만 들어간다.
- if ( i == 0 ) 인 예외를 주는 데 시간이 오래 걸렸다. 다시 생각해 보니 첫 열은 index가 뭐든 관계없으니까 preindex 처음 선언할 때 preindex = -1; 했으면 됐겠다.
2. index가 같지 않은 경우에만 max의 값을 업데이트할 기회를 준다.
3. max 값은 answer에 바로 저장하고 검사용 preindex를 업데이트한다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> land = {
{1, 2, 3, 5},
{5, 6, 7, 8},
{4, 3, 2, 1}
};
int answer = 0, preindex, index, max;
for (int i = 0; i < land.size(); i++) {
max = 0, index = 0, preindex = 0;
for (int j = 0; j < 4; j++) {
if (i==0 or j != preindex) {
if (max < land[i][j]) {
max = land[i][j];
index = j;
}
}
}
answer += max;
preindex = index;
}
return answer;
}
테스트 코드만 통과했다. 게다가 비효율적이다. 만약에 land [ 3 ][ j ] 값을 이용한다 치면 이미 했던 계산을 또 해야 하기 때문이다.
해설은 dp를 이용했다. 이제 약간 감이 잡혔다. dp의 memoization은 갔던 모든 경로를 이전에 구한 값을 이용해 만드는 배열이다.
해설 코드
#include<vector>
using namespace std;
int dp[100001][4] = {0};
int solution(vector <vector<int> > land) {
int r = land.size();
for (int i = 0; i < 4; ++i) {
dp[0][i] = land[0][i];
}
for (int i = 0; i < r; ++i) {
for (int j = 0; j < 4; ++j) {
for(int k = 0; k < 4; ++k) {
if (j != k) {
dp[i][j] = max(dp[i][j], land[i][j] + dp[i-1][k]);
//dp에 넣을 값은 현재 land를 넣지 않는 경우와 넣는 경우(0, 1)를 말한다.
}
}
}
}
int ans = 0;
for (int i = 0; i < 4; ++i) {
ans = max(ans, dp[r-1][i]);
}
return ans;
}
위에서부터 아래로 내려가는 방법 ↓ 이랑 아래에서 위로 올라가는 코드 ↑ 가 있고, 아래에서 위로 올라가는 코드도 익숙해져야한다고 했다. 각각 하향식(Memoization)와 상향식 풀이(Tabulation) 를 의미한다. 상향식 풀이의 예는 피보나치에서 f[0] = 0, f[1] = 1 이렇게 요소의 값을 넣어놓고 이를 조합해 f[n]을 구하는 방식을 의미한다.
<어려워>
오늘 계절 미적분학 교수님께서 대학 공부는 원칙대로 차근차근 이해하는 게 아니라 일단 한 번 훑고 나중에 다시 보고 이해하는 거라고 하셨다. 아몰랑 나는 그렇게 해야겠다 (눈귀막귀)
< DP 배낭의 응용이므로 배낭을 이해하기 좋은 영상을 첨부했다. >
https://youtu.be/rhda6lR5kyQ?si=LmfgjoV-pNC0u3Sf
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[JAVA][BOJ 2098] 외판원 순회와 비트 연산 (1) | 2025.05.21 |
---|---|
[JAVA][BOJ 1256] 조합: 사전 찾기 (2) | 2025.05.15 |
[백준 12865][dp] 배낭: knapsack (2) | 2024.06.30 |
[백준 1106] DP 동적프로그래밍 (1) | 2024.06.25 |