항해99/99club1기TIL

[99club/TIL] 1주차 - 목요일 TIL(Today I Learned)

delay100 2024. 3. 28. 23:47
728x90
반응형
SMALL

안녕하세요! delay100입니다. 

1주차 수요일 TIL이 없는 이유는.. 풀던 백준 문제를 해결을 못해서 .. 올리지 않고 그냥 있다가 시간이 훅 지나가버렸습니다.. 해당 문제를 해결하게 되면 블로그에 정리해서 올릴 예정입니다..!

아무튼 오늘은 수요일에 제시된 문제와, 목요일(정기세션)에 제시된 문제를 둘 다 다뤄보려 합니다.


수요일(3일차)에 주어진 미들러의 문제는 아래와 같습니다.

여태껏 미들러 문제들 중 난이도가 크게 어렵지 않은 문제였습니다!

https://school.programmers.co.kr/learn/courses/30/lessons/12939

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

우선 문자열 split 함수를 이용해 공백을 제거하고, String 배열로 변형시킵니다.

String s = "-10 -20 30 40"이라면 String[] c = [-10, -20, 30, 40] 이 됩니다.

다음으로 이 c배열을 순회하면서 String to Int 하는 방식(Integer.parseInt("문자열"))으로 String 배열을 Int 배열로 바꿔줍니다.

그럼 int[] list = [-10, -20, -30, -40]이 됩니다.

그리고 Arrays.sort를 이용해 오름차순 정렬하면 list = [-40, -30, -20, -10]이 됩니다.

list[0] = -40이고, list[list.length-1] = -10 이므로 이 값을 결과값 String에 넣어주면 됩니다.

코드는 아래와 같습니다.

import java.io.*;
import java.util.*;

class Solution {
    public String solution(String s) {
        
        String[] c = s.split(" ");
        int[] list = new int[c.length];
        
        for(int i=0; i<c.length; i++) {
            list[i] = Integer.parseInt(c[i]);
        }
        
        Arrays.sort(list); // 오름차순 정렬
        
        String answer = list[0] + " " + list[list.length-1];
        
        return answer;
    }
}

+ 3일차(수요일) 비기너 문제

정수 제곱근 판별 (https://school.programmers.co.kr/learn/courses/30/lessons/12934)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

+ 3일차(수요일) 챌린저 문제

배달 (https://school.programmers.co.kr/learn/courses/30/lessons/12978)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


또한 오늘도 21시에 진행되는 모각코에 참가했습니다.

99club 모각코 - JAVA 미들러

다음으로 목요일(4일차)에 공식세션에서 주어진 미들러의 문제는 아래와 같습니다.

1번.

https://school.programmers.co.kr/learn/courses/30/lessons/12914

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 실패 코드

class Solution {
    public long solution(int n) {
        long answer = 0;
        int k = 1;
        while(n>(2*k)) {
            answer += (n-k);
            System.out.println("answer= "+answer+" /n= "+ n +"/ k= "+k);
            k++;
        }
        answer += (n % 2 == 0) ? 2 : 1;
        
        answer %= 1234567;
        
        return answer;
    }
}

테스트케이스는 통과하나, 제출 시 테스트 3 이후부터 실패

2. 피보나치로 변경 - 실패 코드

99club의 세션에서 다른 미들러분의 설명을 들었는데, 피보나치라고 하여 아래 피보나치로 변경했으나 실패한 코드입니다.

사실 처음 문제를 파악할 때 잘 못 계산해서 피보나치가 아닌 줄 알고 방향성을 틀었던 것이 혼자 힘으로 해결하지 못한 이유입니다... 처음에 값은 아래처럼 생각을 했었습니다.

[잘못된 계산으로 피보나치가 아니게 된 수열]

n = 1 2 3 4 5 6

f = 1 1 3 5 8 11 

* 아래의 링크에 접속 시 상세한 피보나치 값을 알 수 있습니다.

https://school.programmers.co.kr/questions/37853

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

어쨌거나 dp를 이용해 피보나치로 변경했지만 실패한 코드는 아래와 같습니다. 

class Solution {
    public long solution(int n) {
        long answer = 0;
        
        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;
        
        for(int i=2; i<=n; i++) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        
        answer = dp[n] % 1234567;
        
        return answer;
    }
}

피보나치로 변경했으나 테스트 7이후로는 실패함

 

3. 피보나치로 변경 - 성공 코드

같은 문제가 발생한 게시글을 찾아 답변을 보았습니다.

내용을 보면 n번째 결과가 너무 커져서 안된다는 내용입니다.

그렇다면 어느정도 커지면 안 되는 지에 대한 게시글도 찾아보았습니다.

피보나치가 47이상일 때부터 음수가 나온다는 글을 찾게 되었고, 문제에는 n=2000까지 가능하므로 너무 숫자가 커짐을 확실히 알게 되었습니다.

 

int로 선언 시 피보나치(n=47)이상부터 음수 발생

 

따라서 첫 번째 답변글에서 봤듯이 나머지 연산을 이용해서 계산한 값들을 계속 갱신해주면 됩니다.

 코드는 아래와 같습니다.

class Solution {
    public long solution(int n) {
        long answer = 0;
        
        long[] dp = new long[n+1];
        dp[0] = 1;
        dp[1] = 1;
        
        for(int i=2; i<=n; i++) {
            dp[i] = (dp[i-1] + dp[i-2]) % 1234567;
        }
        
        answer = dp[n];
        
        return answer;
    }
}

3번 피보나치에 나머지 값을 넣으며 저장 - 통과

 


2번.

https://school.programmers.co.kr/learn/courses/30/lessons/161990

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2번 문제 풀이는 내일(금요일 TIL) 첨부할 예정입니다.


+4일차(목요일) 비기너 문제

1번.

https://school.programmers.co.kr/learn/courses/30/lessons/12969

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2번.

https://school.programmers.co.kr/learn/courses/30/lessons/12948

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

+4일차(목요일) 챌린저 문제

1번.

https://school.programmers.co.kr/learn/courses/30/lessons/169198

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2번.

https://school.programmers.co.kr/learn/courses/30/lessons/49189

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


봐주셔서 감사합니다!

728x90
반응형
LIST