728x90

어? 강의가 되게 재밌어 보이네?

오랜 기간 취업 준비를 하는 도중 프로젝트 없이 공부만 하다보니 개발이 재미 없어지기 시작하였습니다.

물론 오랜 취업 준비 기간으로 힘든 것도 있지만 내가 직접 만드는 서비스가 없다보니 흥미가 떨어진 것 같다고 생각하였습니다. 그렇게 어떤 프로젝트를 할까, 개인으로 할까? 팀으로 할까? 많은 고민을 하던 중 '자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지!' 라는 강의를 알게 되었습니다.

강의 목차를 보니 웹 개발에 필요한 기술부터 네트워크, AWS 등 정말 백엔드로서 필요한 지식을 한 강의에서 제공해주는 것에 매력을 느꼈습니다. 하지만 돈 없는 취준생은 듣고 싶지만 부담이 되었습니다.😭

 

이건 꼭 해야해..!

그렇게 며칠을 고민하던 중 지식 공유자께서 직접 참여를 하고, 다양한 사람들과 의견을 주고 받을 수 있는 스터디가 열린다는 것을 알게 되었습니다. 거기에 대상 강의가 바로..! 제가 구매할지 말아야할지 고민하던 '자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지!' 였습니다.

저는 개발 실력도 중요하지만 네트워킹에 참여하는 것도 중요하다고 생각하였는데 이 기회는 두마리의 토끼를 동시에 잡을 수 있는 매력적인 이벤트였습니다. 강의를 사야할지 말아야할지 고민하던 저는 주저 없이 스터디를 신청하게 되었고, 강의도 바로 구매하였습니다.😁

 

그렇게 시작한 OT(0일차)

16일 금요일 스터디의 시작을 알리는 OT를 하였습니다. 지식공유자이신 최태현님께서 대략적인 스터디 일정을 알려주셨고, 자바의 역사에 대해 알려주셨습니다.

스터디 일정을 보니 정말 타이트하고 힘들 것 같지만 저는 시간 많은 취준생 아니..백수이기 때문에 열심히 스터디 일정에 맞춰서 달려보겠습니다. 이번 기회로 참여하신 다른 러너분들과 많은 이야기와 정보를 주고 받고 싶습니다.

 

오랜 취업준비를 하였지만 그런 것 치고는 큰 실력향상이 있진 않았던 것 같아 이번 기회에 제대로 마음 잡고 공부해보려고 합니다..! 화이팅..! (급 종료)

 

 

강의 링크 👉 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

728x90
728x90

구축하게 된 이유

평소 주변 지인이 서버를 구성하고 운영하는 것이 매우 흥미로워 보였다.

항상 서버를 구축해보고 내 프로젝트를 올려보고 싶었으나, 부담되는 금액과 당장 먼저 해야할 것들이 많아 잠시 미뤄둔 상태였다.

 

그러던 중 6개월 뒤 프리티어의 계정이 만료된다는 것을 알게 되었다. 

개인 프로젝트를 AWS 프리티어를 사용하여 배포해놓았다.

과금이 되지 않는 것을 확인했고, 과금이 되지 않도록 잘 설정하였지만 언제 어떻게 과금될까 불안한 마음이 항상 있었다. 

 

이외에도 만료 되면 다시 배포해야하나?

내 개인 블로그도 개발해서 한번 배포하고 싶은데 방법이 없을까?

백엔드 개발자라면 서버 구축을 해서 웹 사이트 배포해보는 것도 좋지 않을까?  라는 생각이 계속 들어

이것 저것 찾아보던 중 우연히 컴퓨터 3대가 생기게 되었고, 이것으로 서버를 구축해보게 되었다.

 

PC 사양

단순 웹 서비스 배포용 PC는 사양이 크게 중요하지 않는다고 한다.

cpu의 성능 보다도 ram의 성능이 더 우선시 된다. (그렇다고 아예 중요하지 않은 것은 아니다.)

 

CPU: i5-4469

RAM: 16gb

SSD: 500gb

 

운영체제

Proxmox

  • Proxmox란 데비안 리눅스 기반으로, 오픈 소스 플랫폼이기 때문에 많은 기능을 무료로 사용할 수 있다.
  • KVM 가상화와 LXC 컨테이너 기술을 사용하여 가상 머신과 컨테이너를 생성, 관리 및 모니터링할 수 있다. 
  • 사용자는 하나의 물리적 서버에서 여러 개의 가상 머신 및 컨테이너를 실행할 수 있다.
  • 웹 기반 관리 인터페이스를 제공하여 간편하게 리소스를 관리하고 모니터링 할 수 있다.

Linux

  • Ubuntu Server 22.04.3 lts
  • CentOS도 경험해보고 싶었으나 Ubuntu를 더 많이 사용하기 때문에 Ubuntu 먼저 경험해보기로 결정하였다.

정리를 하자면 Proxmox는 Aws와 같은 것이고, 그 위에 리눅스를 설치하고 Vm은 Aws의 ec2같은 것이라고 생각 하면 될 것 같다.

정리

서버를 구축하고 나니 빨리 내 프로젝트를 서버에 올려보고 싶다.

지금까지 개발 공부를 하면서 이렇게 즐겁진 않았는데,

너무 설레고 빨리 공부하고 배포해보고 싶어 아침에 눈도 일찍 더진다.😁

 

아직 네트워크에 관해 많은 지식이 많이 부족하지만 빨리 공부해서

어떻게 하면 서버를 최적화할 것인가 등 다양한 고민을 해볼 수 있었으면 좋겠다.

 

다음 포스팅엔 설치 방법에 관해 포스팅 해보겠다..!

728x90

'서버' 카테고리의 다른 글

개인 홈 서버 - VM 만들기  (1) 2024.02.26
개인 홈 서버 - Proxmox 설치하기  (1) 2024.02.26
728x90

[문제 설명]

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {}  ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

 

[입출력 예]

s result
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

 

[차근 차근 생각해보기]

  1. s를 이어 붙여서 회전한 모습을 만든다.
  2. isCorrect 함수를 만들어 온전한 괄호인지 판별한다.
    • 열린 괄호일 경우 stack에 넣어준다.
    • 닫힌 괄호이고 stack에 들어간 괄호와 짝이 맞을 경우 stack에 있는 괄호는 빼준다.
    • 만약 닫힌 괄호가 열린 괄호보다 먼저 들어갈 경우 return false를 해준다.
  3. isCorrect 함수에서 true일 경우 answer에 1을 더해주고 return 해준다.

 

[코드]

import java.util.*;
class Solution {
    public int solution(String s) {
        int answer = 0;
        
        String newStr = s + s;
        for(int i = 0; i < s.length(); i++){
            if(isCorrect(newStr.substring(i, s.length() + i))){
                answer += 1;
            }
        }
        
        return answer;
    }
    
    boolean isCorrect(String s){
        String[] str = s.split("");
        Stack<String> stack = new Stack<>();
        
        for(int i = 0; i < str.length; i++){
            if(str[i].equals("(") || str[i].equals("[") || str[i].equals("{")){
                stack.push(str[i]);
            }else if(stack.empty()){
                return false;
            }else if(str[i].equals(")") && stack.peek().equals("(")){
                stack.pop();
            }else if(str[i].equals("]") && stack.peek().equals("[")){
                stack.pop();
            }else if(str[i].equals("}") && stack.peek().equals("{")){
                stack.pop();
            }
        }
        
        if(stack.empty()){
            return true;
        }
        
        return false;
    }
}

 

[반성할 점]

괄호 문제는 스택으로 푸는 문제이다.

회전을 위해 문자열 s를 한번 더 더한다는 아이디어가 정말 흥미로웠다.

아이디어를 주신분께선 경험의 차이라는데 과연 경험의 차이가 맞을까 의심된다..

 

아직까지 생각하는 코드를 구현해내는 것이 많이 부족하다.

알고리즘 이외에도 다른 문제를 풀면서 구현력을 기르도록 노력해야겠다.

728x90
728x90

[문제 설명]

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.

섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)

 

Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.

 

[입출력 예]

scoville K return
[1, 2, 3, 9, 10, 12] 7 2

 

[차근 차근 생각해보기]

  1. 스코빌 지수가 K이상이 되어야 하기 때문에 PriorityQueue에 넣어준다.(오름차순 정렬이 됨)
  2. 가장 작은 수에서 두번째로 작은 수 * 2를 더해준다.
  3. 계속 반복하면서 첫번째 원소가 K이상일때 멈춰준다.

 

[코드]

import java.util.*;
class Solution {
    public int solution(int[] scoville, int K) {
        PriorityQueue<Integer> lowList = new PriorityQueue<>();

        for (int i = 0; i < scoville.length; i++) {
            lowList.add(scoville[i]);
        }

        int answer = 0;
        while (lowList.peek() < K) {
            if (lowList.size() < 2) {
                return -1;
            }else{
                answer++;
                lowList.add(lowList.poll() + (lowList.poll() * 2));
            }
        }
        return answer;
    }
}

 

 

[반성할 점]

알고 보면 되게 간단한 문제였는데 우선순위 큐라는 존재를 몰라 복잡하게 풀려다가 못풀었던 문제였다.

이제는 자료구조를 공부할 때이다.

언능 공부해서 그동안 풀었던 문제들도 다시 풀어보고 싶다..!

728x90
728x90

[문제 설명]

숫자나라 기사단의 각 기사에게는 1번부터 number까지 번호가 지정되어 있습니다. 기사들은 무기점에서 무기를 구매하려고 합니다.

 

각 기사는 자신의 기사 번호의 약수 개수에 해당하는 공격력을 가진 무기를 구매하려 합니다. 단, 이웃나라와의 협약에 의해 공격력의 제한수치를 정하고, 제한수치보다 큰 공격력을 가진 무기를 구매해야 하는 기사는 협약기관에서 정한 공격력을 가지는 무기를 구매해야 합니다.

 

예를 들어, 15번으로 지정된 기사단원은 15의 약수가 1, 3, 5, 15로 4개 이므로, 공격력이 4인 무기를 구매합니다. 만약, 이웃나라와의 협약으로 정해진 공격력의 제한수치가 3이고 제한수치를 초과한 기사가 사용할 무기의 공격력이 2라면, 15번으로 지정된 기사단원은 무기점에서 공격력이 2인 무기를 구매합니다. 무기를 만들 때, 무기의 공격력 1당 1kg의 철이 필요합니다. 그래서 무기점에서 무기를 모두 만들기 위해 필요한 철의 무게를 미리 계산하려 합니다.

 

기사단원의 수를 나타내는 정수 number와 이웃나라와 협약으로 정해진 공격력의 제한수치를 나타내는 정수 limit와 제한수치를 초과한 기사가 사용할 무기의 공격력을 나타내는 정수 power가 주어졌을 때, 무기점의 주인이 무기를 모두 만들기 위해 필요한 철의 무게를 return 하는 solution 함수를 완성하시오.

 

[입출력 예]

number limit power
result
5 3 2 10
10 3 2 21

 

[차근 차근 생각해보기]

  1. 1부터 number까지 각각의 약수의 개수를 구하기
    • 1의 약수 1개, 2의 약수 2개, 3의 약수 2개 등등
  2. 약수의 개수가 limit보다 크면 power로 바꿔준다.(제한된 수보다 크면 공격력이 power인 무기를 구매해야하기 때문)
  3. answer에 cnt를 더해주고 return해준다.

 

[코드]

class Solution {
    public int solution(int number, int limit, int power) {
        int answer = 0;
        for (int i = 1; i <= number; i++) {
            int cnt = 0;
            for (int j = 1; j * j <= i; j++) {
                if (j * j == i) {
                    cnt++;
                }else if(i % j == 0){
                    cnt += 2;
                }
            }
            if(cnt > limit){
                cnt = power;
            }
            answer += cnt;
        }
        return answer;
    }
}

 

[반성할 점]

약수의 개수 구하는 방법을 몰라 처음에 많이 헤맸다.

단순히 모든 수를 돌면서 약수를 구해보았는데 시간 초과가 나서 이리저리 찾아보다가

1 ~ n의 제곱근까지 돌면서 약수이면 * 2를 해주고 n의 제곱근인 경우 1개를 더해주는 방법을 찾게 되었다.

그랬더니 시간 초과 없이 잘 풀리게 되었다.

약수 구하는 방법을 조금 더 공부해보고 기록해둬야겠다.

728x90
728x90

올해는 유독 다사다난한 해였다.. 왜 이렇게 취업이 힘든지..

이 힘들었던 기억들로 내 자신이 단단해졌고 다시한번 마음 정리를 해보기 위해 첫 회고를 작성해본다.

 

회사🏢

국비 수료 후 한달도 안돼서 취업했던 첫 회사는 하루만에 그만두었고,

두번째 회사는 프로젝트 마감 당일, 수습 종료 통보를 받았다.

 

왜 나에게 이런 시련이 오는지..솔직히 생각하면 아직도 힘들고 눈물부터난다..😭

취업 시장은 점점 얼어 붙었고, 안좋은 채용 소식들만 들리고 정말 막막하다.

그럼에도 그만두고 싶다는 생각은 들지 않는다. 오히려 더 열심히 해서 꼭 성공하자 라는 생각만 가득하다.

 

조금 더 힘내서 2024년 2월 전엔 꼭 취업해야지..!💪

 

1일 1 알고리즘

퇴사를 당한(?) 후 충격이 너무 커서 공부는 하기 싫은데 뭔가 하긴 해야하고..

그렇게 찾은 것이 하루에 1개씩 알고리즘을 풀는 것이었다.

7월부터 오늘까지 깃 잔디 기록

 

그냥 내가 모든게 다 부족해보여서 당장 프로젝트 하기는 싫고 알고리즘이라도 풀면서

코드라도 만져보자며 자료구조도 모른채 0레벨부터 무작정 풀기 시작하였다.

그리고 이게 지금까지 이어져왔고 이제는 풀지 않으면 하루가 망가진 것만 같은 느낌이 든다..

 

5만등이었던 내 순위

지금까지 닥치는대로 풀었더니 50문제도 안풀려 있었던 문제들을 오늘 기준으로 총 361개를 풀었다.

등수, 점수는 그냥 많이 풀면 올라가기에 중요하진 않지만, 5개월 조금 넘는 시간동안 하루에 한문제는 꼭 풀었다는 것

그리고 문제 푸는 것이 이제는 습관이 되었다는 것이 너무나 기쁘고 뿌듯하다!

 

내년부턴 프로그래머스 외에 릿코드를 병행하며 푸는 문제 수를 늘려보려고 한다!

그리고 1일 1 알고리즘은 내년에도 계속 진행할 것이다. (여행가서도 풀 예정😁)

 

2024년 목표

2024년엔 작은 목표 두가지를 더 추가해보려고 한다.

  • 하루에 2문제씩 알고리즘 문제 풀기
  • 책 2권 이상 읽기(개발 서적 제외하고)
  • 모각코 스터디 만들어서 사람들과 소통하고 공부하기

이렇게 총 3가지의 목표를 실천해보려고 한다.

 

알고리즘으로 무슨 일이 있더라도 매일 코드 치는 습관을 기르고 싶고,

책을 읽는 습관이 되어 있지 않아 최소 2권 이상의 책을 읽고 독서에 흥미를 가져보려고 한다.

 

현재 개발자 지인들과 온라인에서 조금씩 공부를 진행하고 있는데, 이를 통해 공부 습관을 기르고 싶고

2024년엔 오프라인 모임도 진행하여 다양한 사람들과 소통하는 커뮤니티를 만들어보려고 한다.

 

혼자 공부하고 정보를 수집하기 보다는 다른 사람들과 소통하는 것이 나를 성장 시키는데

더 효율적이고 효과적인 방법이라고 생각하기 때문이다.

 

마무리

두루 뭉실했던 나의 목표들이 개발자의 길을 들어오고선 뚜렷한 목표들로 바뀌기 시작했다.

2024년엔 얼마나 더 다양한 목표들이 생기고 새로운 아이디어가 떠오를지 너무 기대되고 설레인다.

올 한해 정말 너무나도 힘들고 슬픈 일이 많았지만 2024년엔 목표한 것들도 꼭 실천하고, 행복한 일만 있었으면 좋겠다!

 

728x90

'주절주절' 카테고리의 다른 글

코끼리를 냉장고에 넣는 방법  (2) 2023.12.29
멘토링 진작 할걸..!!  (0) 2023.12.19
체대생에서 개발자로  (1) 2023.06.07
728x90

'냉장고 문을 연다. 코끼리를 넣는다. 냉장고 문을 닫는다.' 

요즘 천국의 계단을 타면서 유산소 운동을 한다. 운동을 하면서 드라마를 보는데 드라마에서 코끼리를 냉장고에 넣는 방법에 대해 이야기를 하였다. 냉장고 문을 열고 코끼리를 넣고 냉장고 문을 닫으면 된다고 하였다.

처음에 듣고 음? 어떻게 해야하지 싶었는데 생각보다 단순한 대답이 나와서 좀 당황했다..

 

생각해보니 복잡하게 생각할 것 없이 문을 열고 코끼리를 넣고 문을 닫으면 끝이다. 그러다 냉장고와 코끼리의 크기가 비슷하다면 잘 들어갈 것이고, 코끼리가 냉장고에 비해 너무 크면 냉장고는 터질 것이다.

 

너무 단순해서 운동을 하면서 한동안 멍하니 있었다.

 

단순하게 생각하자 단순하게

요즘 주변에서 취업 소식이 들려오면서 많은 생각들이 스쳐 지나갔다.

내가 무엇이 부족한지, 내 이력서가 너무 별로여서 연락이 오지 않는건지, 많은 생각들로 하루를 보내고 있다.

 

그러다 문득 저 대사를 듣고 '아 내가 요즘 너무 복잡하게 생각하고 있구나' 라는 생각이 들었다.

내 전 회사는 나와 맞지 않았기 때문에 냉장고가 터져버린 것이고, 지나간 일은 생각할 이유도 없는데 과거에 얽매여 있었다. 그냥 터져버린 냉장고는 더이상 쓸 수 없으니 버리자.

 

그리고 개발자라는 꿈을 향해 포기하지 않고 다시 일어나 냉장고 문을 열어, 코끼리를 냉장고에 넣으려고 노력하다 보면 언젠간 들어가 냉장고의 문도 잘 닫힐 것이다.

 

취업이 되지 않는다고 너무 복잡하게 생각하지 말자 지금 나는 터진 냉장고는 버렸고, 다시 코끼리를 냉장고에 넣기 위해 문고리를 잡은 상태이다. 지금은 코끼리를 넣는데에만 집중하자..! 

 

무슨 말을 쓴건지 모르겠지만..

그냥 주절주절 써보고 싶었당..  

 

728x90

'주절주절' 카테고리의 다른 글

[회고] 우당탕탕 2023  (3) 2023.12.31
멘토링 진작 할걸..!!  (0) 2023.12.19
체대생에서 개발자로  (1) 2023.06.07
728x90

멘토링을 듣고 나서

 수습 종료 통보를 받은지 6개월이 지났다. 그리고 아직도 취업을 못했다..

혼자 준비하는 것보단 나와 다른 의견을 갖고 있진 않는지 다른 의견도 들어보는게 나을 것 같아 인프런에서 진행하는 멘토링을 신청했다. 결과적으론 왜 진작 신청해보지 않았을까 후회되었고, 내가 생각하는 것에 대해 다시 한번 되돌아 볼 수 있는 시간이었다.

 멘토님과 나눈 이야기를 올리는 것은 도리에 맞지 않는 것 같아 올리진 않겠다. 다만 내가 지금 하는 행동, 생각들이 이상한 길로 가는게 아니라는 것을 느꼈고, 지금 내가 나아가고 있는 방향으로 더 속도를 올려 나아가야겠다고 느꼈다.

 

개발자 너 좀 매력적이야..!

 나는 현재 오랜 취업준비로 자존감이 매우 떨어져있는 상태이다. 국비 동기들은 이제 1년차 개발자가 되어가고 있고 나는 경력 없는 신입이다..뭐가 이렇게 운이 없었는지, 내 실력이 많이 부족한지 아직도 취업 못한 것이 정말 힘들고 슬프다. 그럼에도 그만두고 싶다는 생각은 전혀 들지 않는다. 힘들다가도 문제를 풀고 있으면 정말 재밌고, 뭔가 내가 생각하는 것을 만들 수 있다는 것이 아직도 설레이고 흥미롭다.

 

 개발자라는 직업은 꾸준히 내 할일을 하며 실력을 쌓아가면 다른 직군에 비해 비교적 빠르게 빛을 볼 수 있다는 것이 참 매력적이라고 생각한다. (물론 어디까지나 내 생각이고, 이렇게 생각하지 않을 수도 있다.) 멘토님도 비슷한 이야기를해주셨다. 멘토링을 하고 나서 지금 당장은 내가 느릴지언정 꾸준히 포기만 하지 않는다면 나도 조만간 빛을 볼 수 있다는 생각이 강하게 들었다. 

 

다시 달콤한 꿀을 향해 달려보자

나는 꾸준함 하나로 평생 못할 것 같았던 20kg 감량에 성공했다. 이 성공은 느껴본자만 알 것이다. 정말 달콤하고 말로 표현할 수 없는 행복감과 자신감이 생긴다. 그리고 이 기억으로 다른 일을 하는데 새로운 힘을 얻게 된다. 그동안 정말 절망적이고 힘든 생각에 갇혀 살았지만, 오늘 멘토링 이후로 내가 느껴봤던 성공을 향해 기나긴 여정을 떠나야겠다고 다짐하는 계기가 되었다. 

 

오랜만에 글을 써서 무슨 말을 하는지 글이 잘 이어지는지 잘 모르겠다..

그냥 오늘 멘토링을 하고나서 느꼈던 감정을 이렇게라도 남겨두고 싶어 작성하는 글이다.

 

728x90

'주절주절' 카테고리의 다른 글

[회고] 우당탕탕 2023  (3) 2023.12.31
코끼리를 냉장고에 넣는 방법  (2) 2023.12.29
체대생에서 개발자로  (1) 2023.06.07
728x90

[문제 설명]

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.

 

[입출력 예]

num total result
3 12 [3, 4, 5]
5 15 [1, 2, 3, 4, 5]
4 14 [2, 3, 4, 5]
5 5 [-1, 0, 1, 2, 3]

 

[차근 차근 생각해보기]

  1. total / num을 하여 중앙값을 구해준다.
  2. (num - 1) / 2을 빼주면 첫번째 수를 구할 수 있다.
  3. 또는 등차수열의 공식을 이용한다.

 

[코드]

<수정전>

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        int start = (total / num) - ((num - 1) / 2);
        for (int i = 0; i < num; i++) {
            answer[i] = start;
            start++;
        }
        return answer;
    }
}

 

 

<수정후>

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        for (int i = -100; i <= 100 ; i++) {
            int result = (num * (i + ((i + num) - 1))) / 2;
            if (result == total) {
                for (int j = 0; j < answer.length; j++) {
                    answer[j] = i + j;
                }
            }
        }
        return answer;
    }
}

 

[반성할 점]

처음에 짝수 홀수를 나누어 연속된 수의 합을 구하는 코드를 작성했었는데,

이렇게 하면 음수일때 어떻게 처리해야할지 몰라 결국 다른 사람의 풀이를 보고 풀었다.

 

그러다가 등차수열로 풀어보고 싶어서 다시 구현을 해보았다.

등차수열의 공식  (항수 * (첫째항 + 마지막항)) / 2이다.

 

여기서 항수는 num, 첫째항과 마지막항은 - 100부터 100까지 반복문을 돌면서 구할 수 있도록 하였다.

처음부터 등차수열을 이해하고 풀었으면 좋았을텐데..!

 

이런 수학적 공식도 보고 코드로 옮겨보니까 너무 재미있다!😁

아직 알고리즘적으로 생각하는게 많이 부족하니까 천천히 한단계 나아가보자!   

728x90
728x90

[문제 설명]

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해 주세요.

 

[입출력 예]

phone_book return
["119", "97674223", "1195524421"] false
["123","456","789"] true
["12","123","1235","567","88"] false

 

[차근 차근 생각해보기]

  1. set에 전화번호를 넣어준다.
  2. phone_book 배열을 돌면서 phone_book 원소를 0부터 i번째까지 잘라준다.
  3. 자른 것이 set에 포함 되어 있으면 false를 리턴해준다.    

 

[코드]

<수정전>

import java.util.*;
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        Arrays.sort(phone_book);

        for (int i = 0; i < phone_book.length - 1; i++) {
            String s = phone_book[i];
            if (phone_book[i + 1].startsWith(s)) {
                return false;
            }
        }
        return answer;
    }
}

 

<수정후>

import java.util.*;
class Solution {
    public boolean solution(String[] phone_book) {
        HashSet<String> set = new HashSet();
        for (String phone : phone_book) {
            set.add(phone);
        }
        
        for (String phone : phone_book) {
            for (int i = 0; i < phone.length(); i++) {
                String prefix = phone.substring(0, i);
                
                if (set.contains(prefix)) {
                    return false;
                }
            }
        }
        
        return true;

    }
}

 

[반성할 점]

처음엔 이중 반복문으로 풀려고 했는데 계속 답이 안 맞고, 시간초과가 났다.😭

다음엔 phone_book 배열을 정렬한 뒤 i+1번째 원소가 i번째 원소로 시작하면 false를 리턴해주는 방법으로 풀었었다. 

 

그리고 나는 항상 풀고 나선 개발자 지인에게 항상 코드 수정할 것은 없는지,

효율적인 방법은 없는지, 풀면서 모르는 것들을 물어보는 습관이 있다. 

 

나름 뿌듯하게 풀었다며 코드를 보여주었고, 풀면서 시간초과가 나는 이유에 대해서도 물어보았다.

정렬해서 푸는 방법보다는set을 사용하여 푸는 것이 효율적이라고 이야기해 주었다.

이유는 제한사항에 phone_book 배열의 길이는 1이상 1,000,000이하 이고 이럴 경우 이중 반복문을 돌게 되면 시간 초과가 난다고 하였다.

이를 해결하기 위해선 hash를 사용해야 한다고 했다. 

 

hash는 하나하나 돌면서 그 값을 찾는 게 아닌 일치하는 값이 있으면 바로 이동한다고 하였다.

(잘못된 정보면 지적부탁드립니다. 지적은 언제든지 환영입니다!) 

 

그다음 phone_book 배열 원소 하나를 0번째에서 i번째까지 substring으로 잘라 set에 포함되어 있는지 비교하면 된다고 하였다.

 

아직까지 이렇게 논리적으로 생각하는 게 많이 부족하다ㅠ

그리고 이제는 자료구조를 공부해야 할 때인 것 같다..  

 

 

728x90

+ Recent posts