미뤄왔던 인프런
과 유데미
강의의 진도를 빼고, 이를 깃헙
과 이 블로그에 기록하려 한다!
적어놓고 보니 해야하는 항목과 하고싶은 항목이 너무 많아서 이걸 SSAFY
일정을 소화하며 이룰 수 있을까 라는 의문이 들었음..
하지만 멈추기보단 나아가야하느니
라는 생각으로 가능한 밤을 새며 다 해보려고 한다!
아자아자!!
오늘 선정해주신 문제와 풀고 싶은 문제를 골라서 해보려고 한다.
📌 오늘의 선정 문제
문제를 보고 상당히 당황했음;;
이게 미들러 문제..?
하지만 PS에 오랜만에 자신감을 붙여준 문제라 이런 문제도 풀어볼만 하다고 느꼈음!
그렇지만 이 문제로 하루를 보내기엔 아쉽기 때문에
머리가 지끈거리는 문제도 한번 풀어보고 싶었다
솔직히 첫인상은 어렵지 않았다
왜냐하면 바로 무슨 유형이다 라는 걸 직감할 수 있는 문제였기 때문..
도식화된 그림부터
노드
와간선
그리고가중치
로 구분됨
구하는 값은최단거리
=> 결국 최단경로 알고리즘 중 음의 가중치가 없어도 풀 수 있는다익스트라 알고리즘
을 택해야 함
근데 유형알면 뭐하나
다익스트라를 바로 구현할 수 있을 정도로의 지식이 없었지
분명 기억하는 다익스트라는 이런 표에 밑에 노드가 추가될 때 마다 가중치가 변해야했는데 도대체 이 형태에 어떻게 그걸 추가해야하지?? 라는 생각만 들었고 결국 그 형태가 어떤 식인지 기억하지 못했다..
지금 생각해보면 이미 내 생각 속에 답은 있었지
그렇지만 그걸 표로 나타내지 못했다는 걸 깨닫곤 구현력이 이렇게까지 약해졌나 싶었다..
그래서 예전에 정리해두었던 다익스트라 Notion
을 펼쳐보았는데..
핵심 키워드와 그림은 적절한 자료로 잘 기록해두었지만, Snippet
이나 무슨 자료구조가 좋은지 조차 써두지 않았음 😥
그러면 이제
다시 그리고 정리해야지 뭐 ㅎㅎ
다익스트라의 핵심 3가지
=>
특정 출발지
+최단 거리
+모든 가중치는 음수가 아님
다익스트라의 Snippet
출발지를 제외한 모든 노드에 대해 최단거리 1차원 정수 배열 dist[], 1차원 방문 배열 vis[] 선언 작은 비용의 노드를 먼저 꺼낼 수 있는 자료형 pq로 선언한다. pq에 출발지를 저장 /*반복구간 start*/ pq에서 가장 작은 비용의 노드 A를 꺼낸다 A에서 갈 수 있는 노드들 중에 dist 배열에 들어간 값보다 더 작은 비용으로 갈 수 있다면 dist 배열에 더 작은 값을 저장한다 그리고 pq에 해당 노드의 값을 새롭게 저장한다 /*반복구간 end*/
이걸 종이에 간략하게 그렸고, 이해한 뒤에 풀었음
최근 코테에 solve를 거의 못본 이유가 생각한 바를 구현으로 옮기는 게 많이 약해진 것임을 다시 한번 깨닫게 된 계기가 되었다.
그전엔 구현
알고리즘만 약한 줄 알았는데, 생각을 풀이로 옮기는 것 자체가 약해진 거라니..
씁쓸하지만 이제부터라도 다시 연습해야지 응응!
결국 한문제 더 건드렸다..
내가 구현이 약하다는데 이걸 그냥 체념하고 다른 할일 하기엔 아직 멈춰있는 기분이었기 때문 ㅎㅎ
조금이라도 더 헤매면서 느낌을 다시 되살리고 싶었다
근데 이 문제에 1시간 반을 써버림 ㅎㅎㅎ 오늘 잠 못자겠다 와우
문제 자체는 갈 수 있는 노드에 대해 인접행렬을 출력하면 되는 방식이다.
그런데 중간 노드들까지도 갈 수 있는지를 파악해야 했음
그래서 고민 끝에 나온 코드가 아래와 같다 (한 60%쯤 틀렸지)
import java.util.*;
import java.io.*;
public class Main {
static int N;
static boolean[][] adjMatrix, ans;
static int[] vis;
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
adjMatrix = new boolean[N+1][N+1];
for(int i=1; i<N+1; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=1; j<N+1; j++) {
adjMatrix[i][j] = st.nextToken().equals("1")?true:false;
}
}

ans = new boolean[N+1][N+1];
for(int std=1; std<N+1; std++) {
Queue<Integer> q = new LinkedList<>();
q.add(std);
// System.out.print("std : "+std+" / ");
vis = new int[N+1];
while(!q.isEmpty()) {
int cur = q.poll();
for(int i=1; i<N+1; i++) {
// System.out.println(cur+" "+i+" ");
if(adjMatrix[cur][i]) {
vis[cur] += 1;
vis[i] += 1;
ans[cur][i] = true;
// System.out.println(cur+" "+i+", ");
if(3< vis[i])
continue;
q.add(i);
}
}
}
// System.out.println();
// System.out.println("확인 : "+vis[std]);
vis[std] = vis[std]>2?vis[std]:0;
for(int i=1; i<N+1; i++) {
if(0<vis[i]) {
ans[std][i] = true;
// System.out.print(i+" ");
}
}
// System.out.println();
}
StringBuilder sb = new StringBuilder();
for(int i=1; i<N+1; i++) {
for(int j=1; j<N+1; j++) {
sb.append(ans[i][j]?1:0).append(" ");
}
sb.append("\n");
}
System.out.print(sb.toString());
}
}
보이는 것 처럼 수많은 sysout
으로 출력을 찍어봤음 ㅎㅎ
vis
를 2차원으로 했다가~
1차원 정수형으로 바꿨다가~
1차원 불린형으로 바꾸고~
다시 1차원 정수형으로 임의 값을 줘서 풀었음
내 논리에 확신을 가질 때 코드로 옮겼어야 하는데, 늘 마지막 검증과정을 skip
하는데 익숙해진 듯 싶다..
그리고 당연하게도 로직 오류는 분명 있을 것이라 생각했다.
방문 배열을 임의의 값으로 1씩 더한다면, 어떤 엣지 케이스에선 내가 생각치 못한 값을 가질 확률이 상당히 높기 때문
그래서 결국 답 코드를 봤다
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int[][] arr;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N][N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int k = 0; k < N; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (arr[i][k] == 1 && arr[k][j] == 1) {
arr[i][j] = 1;
}
}
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
sb.append(arr[i][j] + " ");
}
sb.append("\n");
}
System.out.println(sb.toString());
}
}
...너무 허무하다
이 흔하디 흔한 플로이드 와샬 알고리즘
으로 풀리는 문제였다니..
이 알고리즘은 너무 간단해서 이걸 어떻게 잊나 싶은 생각으로 간단하게 기록하고 지나갔었는데
아.. 정말 다시 제대로 해야겠다는 생각이 들었음
그래도 플로이드 와샬
은 개념 보기 전에 스니펫이 기억나서 생각나는대로 타이핑해서 맞았습니다
를 얻었다!
늘 내 랭크는 물플레다 했는데 찐이 되어부려써~~
그래도 이렇게 다시 익숙해져가는 거겠지
..라는 마인드로 다시 해야지!
일단 오늘 PS 3문제로 만족해야 다른 task를 할 수 있으니. 오늘 문제는 여기까지 하려고 한다
진짜... 잘 수 있을까.. 벌써 17시라니😂
일단 집가서 마무리하고, 제출은 미리 해둬야지!
분명.. SSAFY
오후 6시에 퇴실찍고 집 7시쯤 오고..
저녁 떡국 끓인 뒤 먹고.. 샤워하고.. 1시간 산책했는데 왜 10시지..??
일단 잠 못자는 거 확정이고 ㅎㅎㅎ
흐아 상상이 현실이 되어버렸어..
하지만 이왕 마음먹은거 꼭 끝내보자!
난 할수있어!!
그 전에 유튜브에 들어가서 오늘 내 공부를 책임져줄 노래를 선택했다
내 상황과도 정말 잘 맞는 노래지..
들어본적 없다면 원곡보다도 아래 cover곡으로 듣는 것을 추천한다!
한명 한명이 신나는 표정으로 아주 몰입하여 노래를 연주하고 부르는데.. 정말 보고만 좋은 기운을 주는 멋진 영상이니 꼭 봤으면 함
18p쯤 읽고있을 때 동생 잘 시간이라 불을 껐는데
노트북 불빛으로도 읽을 수 없는 깜깜한 어둠이 찾아왔다..
스탠드 좀 사둘껄 하하..
어쩔 수 없이 내일 읽어야할 분량이 되어버렸다..!
이때 부터 슬슬 허리가 아파와서 누워서 봐야할 것 같았다.
강의를 빠르게 한번 완강하고 그 뒤에 하나하나 되새기며 정리하려 했는데
극심한 잠이 몰려왔음
모든 강의를 결국 다 보긴했지만.. 이미 다 아는 내용이 많았고 그걸 다시 듣고 있으려니 생각보다 지루했고 누워있던 터라 잠이 솔솔 왔음 ㅎㅎㅎㅎ
결국 하루를 마무리 하게 되었다..
나머지는 내일 끝내야지 총총..
생각해보니 운동 투두는 작성하지 않아서 추가했음
체크 전 | 체크 후 |
---|---|
![]() | ![]() |
흠.. 집가서 공부할 생각만 있다면 충분히 할 수 있을 양이라 생각했었는데, 하루만에 나를 뒤집기엔 쉽지 않았던 것 같다..
하지만, 꾸준하게 할 수 있을 것이라는 확신은 들었다!
SSAFY
를 다니기 전에는 나의 이 안타까운 피부 상태와 체력으로 9to6 일정을 소화하며 그 이후 공부까지 할 수 있을까 라는 생각이 들었었다.
실제로 초반에는 피부 진물때문에 잠도 설치고 늘 옷에 묻은 게 티가나지 않도록 애써야했지..
한번 정말 상태가 심해져서 아무리 씻어도 진한 진물냄새가 퍼지는게 느껴질 때가 있었다
매일 두꺼운 후드를 입고 퍼지지 않게 애썼는데 목을 타고 냄새가 압축되어서 올라왔다
옆에 있는 사람은 무슨 죄랴..
쉬는 시간마다 일부로 밖에 나가있었고 밥먹을 때 입맛 떨어질까봐 누구 옆에 앉는걸 꺼려했다
어렸을 때 아토피가 있었고 한번 완치라 생각될 정도로 돌아왔었는데 갑자기 심해질 줄이야
매일 암울한 생각만 했고 움직이는게 너무 힘들어서 지각도 꽤 여러번 했다
SSAFY
에서는 한달에 지각, 조퇴 등이 3번 합쳐지면 1회 결석으로 처리되는데, 3회 이상 결석이면 수료를 못한다
그렇게 벌써부터 수료를 출결 때문에 못할 듯 싶어
이 과정이 끝나면 나는 어떻게 취준을 이어나가야 하지? 라는 생각이 들었고
이제 정말 내 좋은 날들은 다 지나갔다고 생각했었다
그렇게 매일 힘든 출결을 어떻게든 참아가며 제 시간내에 하려고 애썼고 싸밥을 골고루 먹으면서 부족한 영양소가 있어서 내가 이런거라면 이런 걸로 채워졌으면 하는 마음으로 가득 먹었다.
대학병원에서 처방받은 약을 하루 3번 먹었고
유산균과 오메가 3, 6를 추가적으로 먹었다.
하루에 약만 평균 30알 정도 먹었는데, 약이 쎄서 속이 나날이 쓰렸음
그리고 약도 비싸서 한달 최소 18만원이 깨졌다.
그렇지만 그 약을 믿어야했고 나와의 싸움에서 이겨야 했다
좀더 나은 삶의 내가 되어야 했으니까
그렇게 아주 미세하게 조금씩 몸이 돌아오는게 느껴졌다
달마다 거즈 3박스, 압박붕대 2박스씩 샀었는데 조금씩 덜 사도 한달을 보낼 수 있었고
스치면 아파서 피부가 서로 만나지 않도록 하기위해 유지하려했던 불편한 자세도 조금씩 풀 수 있었다.
무엇보다.. 가장 최근에 손목까지 올라왔던 아토피가 내려가는게 보였다!
붉디붉던 피부가 원래 피부보단 약간 짙은 연갈색으로 새살이 올라온게 보였고 점점 나아지는걸 보며 내 떨어졌던 자존감도 다시 채울 수 있었다.
그 짙어진 피부조차도 얼마나 감격스러웠던지..
그날부터 피부를 위한 시간을 줄일 수 있었고, 그 공백이 드디어 정말 나를 위한 자유시간이 되었다!
못했던 공부를 할 수 있었는데
문제는 그동안 운동을 하지못해 떨어질 대로 떨어진 체력이었다.
집에 돌아와서 조금만 앉아서 해보는 것 조차 버거웠고 뭘 할 수 있는 상태가 아니었기 때문에, 나의 일상에서 운동을 끼워넣기로 했다.
출퇴근 시간에 걸어갔고, 싸밥을 먹으러 갈 때면 20층까지 계단으로 열심히 올라갔다.
이게 맞나 싶을정도로 너무 힘들었지만
조금씩 몸의 체력이 돌아오는게 느껴졌고 이제는 좀 더 공부다운 공부가 가능해졌다!
꽤 긴 에피소드였지만.. 나에겐 오늘 이 변화가 큰 바람을 불러일으킬 것임을 확신할 수 있다.
굴러온 기회를 놓치지 않던 과거의 내가 다시 되어야지!