우선순위 
  1. “6시 기상” 11시 취침 습관
    1. 8시 출근이라 기상시간은 잘 지켜지는데. 취침 시간이 들쭉날쭉 한 것을 일정하게 만들고 싶다 
  2. 필라테스 주 2회 
    1. 바른자세 절대지켜 
  3. 공부: 최소 주 12시간 투자 
  4. 용돈 내에서 소비하고 낭비 안하기 
  5. 바닐라라떼 횟수 주2회로 줄이기  
    1. 만성 염증 줄이기 위함

 
728x90

'일상 > 회고' 카테고리의 다른 글

주니어 개발자 2022년 회고  (0) 2023.01.31

2022년에는 성취한 것 2가지와 힐링여행 2번이 기억에 남는다.

필라테스를 하면서 근육량을 1kg 늘렸고, 재취업도 성공했다.

제주도 여행을 2번 갔는데.

역시 제주도는 내입맛에 맞는 맛있는 음식이 많고 푸름푸름 초록초록해서 해외보다 좋은 여행지다. 

 

좋은 습관 2개를 만들었다. 

  • 매일 아침 물 500ml 마시기 
  • 칭찬일기를 비롯한 감사일기 3줄 쓰기 -> 우울함을 날릴 수 있다. 

연초에 가족들이 모두 코로나에 걸렸는데, 나만 안걸렸다. 

 

  • 성취한 것 
    • 근육량 1kg 증가 
    • 재취업 성공 
  • 좋은 습관
    • 물 500ml 
    • 필라테스 주2회 꾸준히 하기. 코어 탄탄하게 키우기. 
  • 수습 3개월 
    • 업무
      • keycloak 기술 리서치 및 적용 
      • 모바일 애플리케이션 보안 요건 준수 심의 
      • 기능 QA 
      • NestJS Typescript TypeORM 스택으로 서비스 기본 기능구현 
        • SpringBoot, JPA를 써본 경험 덕에 기한 내 요구사항 구현 가능했다
    • 느낀 점 
      • 팀 적응 빡세네.. 그래도 무리하진 말자. 밸런스를 잡아야 한다. 화이팅. 
  • 서비스 개발 3개월 
    • 느낀점
      • JIRA, Confluence, Slack 을 더 효과적으로 사용하기 위한 방법이 필요하다
      • ERD, UML 은... 제발. 반드시 필요하다 
      • 결정사항에 대한 공유를 어떻게 할지에 관해 구성원들 합의가 필요하다. 전달이 안되는 경우가 있다. 
  • 이벤트 
    • 친구의 결혼! 우와. 친척들의 결혼 (친척동생, 친척오빠)
    • 싸이 흠뻑쇼 존잼 
    • 반가운 독일사는 친구 
  • 즐거운 추억
    • 제주도 힐링여행
    • 방탈출 존잼 - 강남 2번, 홍대 2번
    • 클라이밍 체험 - 승부욕을 자극하는 취미생활이 생겼다. 회사 동호회까지 가입해버림 
  • 공부
    • GraphQL 얘를 어떡할까 
    • Keycloak - 오히려 유튜브 레퍼런스가 실질적인 도움을 줬다 
    • NestJS, Typescript - 레퍼런스 왜이렇게 적은겨
    • TypeORM
  • 성장 방법에 대한 고민
    • 마음의 양식 
      • 됬고. 뭐가 되든 간에, 먼저 "사람"이 되자
    • 기술역량
      • 주간 This week I Learned 작성 
      • 워너비를 따라하자 
        • 조직 내 차장님. 과장님. 
        • 온라인에서 접할 수 있는 인싸 개발자분들 
    • 경제적 자유를 달성하는 그날까지  
      • 저축: 월 X만원 따박따박 적금. 올해는 투자 일시중지.
    • 나의 '역할'
      • 누군가에게 친구. 연인. 가족. 그리고 온전히 나. 
  • 2023년 다짐 
    • 건가앙 절대지켜! 
    • 살아남을 기술력을 키우자
      • 타입스크립트 언어에 대한 이해 넓히기 
      • 인증 인가 프레임워크 활용을 위한 공부 꾸준히하기
      • kubenetes 도 자유롭게 잘 쓰고 싶다..
      • AWS asso 자격증 따면서 AWS에 익숙해질 계획이다
      • 로깅: argo cd, 프로메테우스 그라파나 로키 
      • 카프카 기본 개념 이해하기
    • 다정함을 키우자. 주변에게도 나 자신에게도.

나 자신 2022년 수고했다. 올해도 소소한 행복 만끽하며 잘 살자. 

 

728x90

'일상 > 회고' 카테고리의 다른 글

2023년 새해계획  (0) 2023.01.31

기타레슨 문제 링크

 

리뷰 

강의 전부가 M장 블루레이에 담겨야 한다. 따라서 블루레이 크기가 최소 몇분이 되야 하는지 찾는 문제다. 

 

이분탐색의 타겟은 블루레이의 크기다. 

블루레이의 크기는 최소 1분, 최대 모든 강의의 크기 중에서 탐색할 수 있다.

주의할 점은 블루레이의 크기보다 강의 하나의 크기가 큰 경우도 있을 수 있다는 점이다. 

 

main 함수 while문에서 이분탐색을 한다.

if문의 b_search() 함수는 블루레이가 mid크기의 강의를 담을 수 있다고 했을 때, M장의 블루레이만으로 모든 강의를 담을 수 있는지 확인하는 bool 함수다. 

 

이분탐색 문제는 무엇을 주제로 이분탐색 할 지를 잘 생각하고 시작해야되니까 연습이 좀 필요한 것 같다. 

 

"맞았습니다" 코드 

#include <bits/stdc++.h>
using namespace std;

int N, M, answer, front, mid, back;
int blue[100001]; // 강의 길이 목록

bool b_search(int mid){ // mid 크기의 M장 블루레이에 모두 담기는지 확인.

  int sum_time = 0, cnt = 1; // sum_time 은 mid 이하여야 한다. 블루레이 개수 cnt.

  for(int i = N-1; i>=0; i--){

    if(blue[i] > mid){
      return false; // 블루레이 1장에 강의 1개도 못들어가는 경우.
    }

    sum_time += blue[i];
    if(sum_time > mid){
      cnt++;
      sum_time = blue[i];
    }
  }
  return M >= cnt; // 블루레이 개수가 M이하라면 만족.
}

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> N >> M;
  for(int i = 0; i < N; i++) {
    cin >> blue[i];
    back += blue[i]; // 모든 강의 길이를 더해서 back에 저장 
  }
  front = 1; // 1분

  while(front <= back){

    mid = (front + back) / 2; // 블루레이 1장의 크기 mid

    if(b_search(mid)){ // mid크기의 블루레이로 M장 이하에 담을 수 있는지?
      answer = mid;
      back = mid-1;
    }else{
      front = mid+1;
    }
  }
  cout << answer;
  return 0;
}
728x90

'알고리즘 > 백준' 카테고리의 다른 글

수열 백준 2559번 c++  (0) 2022.05.24
수들의 합2 백준 2003번 c++  (0) 2022.05.24
AC 백준 5430번 c++  (0) 2022.03.05
뱀과 사다리 게임 백준 16928번 c++  (0) 2022.03.02
조합 백준 2407번 c++  (0) 2022.03.02

줄 서는 방법 문제 링크 

 

리뷰 

줄 서는 k번째 방법을 출력해야한다. 

k는 n!이하의 숫자라고 하니깐 뭔가 규칙성이 있을 것 같았다. 

단순하게 next_permutation()으로 구현하니깐 정확성은 다 맞지만, 효율성에서 시간초과나서 틀렸다. 

 

n = 2 라면, 2가지 방법이 있다. 

[ 1, 2 ] 

[ 2, 1 ] 

 

n = 3개라면, 3! == 3 * 2 * 1 == 6가지 방법이 있다. 

[ 1 2 3] 

[ 1 3 2]

---------- 1번째, 2번째 방법은 앞자리가 1이다. 

[ 2 1 3]

[ 2 3 1]

--------- 3번째, 4번째 방법은 앞자리가 2다. 

[ 3 1 2]

[ 3 2 1]

--------  5번째, 6번째 방법은 앞자리가 3이다. 

 

일단 [ 1 2 3 ] 숫자가 들어있는 벡터 num_v를 만든다. 

 

k번째 방법을 (n-1)! 으로 나누면 idx번째 숫자가 들어갈 자리를 알아낼 수 있다. 

 

 

효율성에서 "시간 초과" 난 코드.

#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(int n, long long k) {
  vector<int> answer;

  vector<int> permu_v;
  for(int i = 1; i <= n; i++) permu_v.push_back(i);

  do{
    k--;
    if(0 != k) continue;
    else{
      for(int i = 0; i < n; i++){
        answer.push_back(permu_v[i]);
      }
      break;
    }
  }while(next_permutation(permu_v.begin(), permu_v.end()));

  return answer;
}

 

 

"맞았습니다"코드

#include <vector>
#include <algorithm>
#define ll long long
using namespace std;

ll factorial(int n){
  if(n == 1) return 1;
  else return n * factorial(n-1);
}
vector<int> solution(int n, long long k) {
  vector<int> answer;

  long long idx, target_num;
  vector<int> num_v;
  for(int i = 1; i <= n; i++) num_v.push_back(i);

  while(0 < n){
    idx = factorial(n) / n;
    target_num = int((k-1) / idx); // answer에 넣을 숫자
    answer.push_back(num_v[target_num]);
    num_v.erase(num_v.begin() + target_num);
    n--;
    k %= idx;
    if(k == 0) k = idx;
  }

  return answer;
}
728x90

피로도 문제 링크 

 

리뷰 

어떤 순서로 던전을 방문해야 가장 많이 방문할 수 있는지 순서를 섞어봐야한다. 

던전이 3개라면, 벡터에 0, 1, 2를 넣고 모든 경우에 방문한 던전개수를 세보며 순열을 돌려서 풀 수 있었다. 

 

"맞았습니다" 코드 

#include <vector>
#include <algorithm>
using namespace std;

int solution(int k, vector<vector<int>> dungeons) {
  int answer = -1;
  int dungeons_cnt = dungeons.size();
  vector<int> permu_v;

  for(int i = 0; i < dungeons_cnt; i++) permu_v.push_back(i);

  do{
    int temp_k = k, cnt = 0;

    for(int i = 0; i < dungeons_cnt ; i++){
      int turn = permu_v[i];
      if(temp_k < dungeons[turn][0]) {

        break;
      }else{
        temp_k -= dungeons[turn][1];
        cnt++;
      }
    }
    answer = max(answer, cnt);
  }while(next_permutation(permu_v.begin(), permu_v.end()));

  return answer;
}
728x90

문제 링크 

 

 

리뷰 

n이 1일때, n이 2일때 부터 n이 5일때 몇 가지 경우의 수가 있는지 그려보면 규칙성이 보인다. 

공간의 세로 길이는 항상 2다. 

모든 막대는 1 X 2크기다. 

n == 1 이라면,  공간은 2 X 1  막대 1개를 세우는 것 만 가능하다. 1가지 가능 
n == 2 공간은 2 X 2  막대 2개를 세우거나, 둘 다 눞이면 된다.  2가지 가능 
n == 3 공간은 2 X 3 막대 3개를 세우거나, 두개는 눞인다.  3가지 가능 

아래는 n == 5 인 경우, 가능한 배열을 그린것이다. 

막대 5개를 세운다. 

막대 3개는 세우고, 2개는 눞인다. 

막대 1개는 세우고, 4개는 눞인다. 

맞았습니다 코드 

#include <string>
#include <vector>
#define MOD 1000000007
using namespace std;

int D[60001];
int solution(int n) {

  D[1] = 1, D[2] = 2; 
  
  for(int i = 3; i <= n; i++){
    D[i] = (D[i-1] + D[i-2] ) % MOD;
  }
  return D[n];
}
728x90

괄호 회전하기 문제 링크 

 

리뷰 

입력 예시 -> "[ ] ( ) { } "  (길이 6 문자열) 

주어진 문자열을 1만큼 회전하면, 인덱스 0 번째 문자가 문자열의 제일 뒤로 간다. -> " ] ( ) { } [ "

 

입력 문자열을 연이어 붙이면 "[ ] ( ) { } [ ] ( ) { } " 가 된다.   (길이 12 문자열) 

크기 x 는 0부터 '문자열의 길이 -1' 까지다. 

크기 0  [ ] ( ) { } 
크기 1  ] ( ) { } [ 
크기 2 ( ) { } [ ]
크기 3  ) { } [ ] (
크기 4 { } [ ] ( )
크기 5 } [ ] ( ) {

 

 "[ ] ( ) { } [ ] ( ) { } "에서 0부터 6개를 잘라내서 올바른 괄호인지 검색한다. 

1부터 6개 잘라내서 검사한다. 2부터 6개 잘라내서 검사한다.

이렇게 하면 괄호를 n만큼 회전한 문자를 구할 수 있다. 

 

"맞았습니다" 코드 

#include <string>
#include <vector>
#include <stack>
using namespace std;

int answer, ssize;

bool check(string s){ // 문자열이 올바른 괄호인지 확인하여 T/F 리턴 
  bool res = true;
  stack<char> st;

  for(int i = 0; i < ssize; i++){
    if(s[i] == '{' || s[i] == '(' || s[i] == '['){
      st.push(s[i]);
    }else if(!st.empty()){
      if( (st.top() - s[i] == -1) || (st.top() - s[i] == -2)){
        st.pop();
      }else{
        res = false; break;
      }
    }else if(st.empty()){
      if(s[i] == '}' || s[i] == ')' || s[i] == ']')
        res = false; break;
    }
  }
  if(!st.empty()) res = false; // 검사 후 스택이 비어있어야 올바른 괄호 
  return res;
}

int solution(string s) { // 괄호를 회전하면 괄호가 반복되니까 s를 이어붙임. 
  ssize = s.size();      // "[](){}" -> "[](){}[](){}"
  s += s;

  for(int i = 0; i < ssize; i++){ // 0부터 6개, 1부터 6개, 2부터 6개 ... 
    string target = s.substr(i, ssize);
    bool result = check(target);
    if(result) answer++;
  }
  return answer;
}

 

 

728x90

+ Recent posts