안녕하세요! delay100입니다.
1주차 수요일 TIL이 없는 이유는.. 풀던 백준 문제를 해결을 못해서 .. 올리지 않고 그냥 있다가 시간이 훅 지나가버렸습니다.. 해당 문제를 해결하게 되면 블로그에 정리해서 올릴 예정입니다..!
아무튼 오늘은 수요일에 제시된 문제와, 목요일(정기세션)에 제시된 문제를 둘 다 다뤄보려 합니다.
수요일(3일차)에 주어진 미들러의 문제는 아래와 같습니다.
여태껏 미들러 문제들 중 난이도가 크게 어렵지 않은 문제였습니다!
https://school.programmers.co.kr/learn/courses/30/lessons/12939
우선 문자열 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)
+ 3일차(수요일) 챌린저 문제
배달 (https://school.programmers.co.kr/learn/courses/30/lessons/12978)
또한 오늘도 21시에 진행되는 모각코에 참가했습니다.
다음으로 목요일(4일차)에 공식세션에서 주어진 미들러의 문제는 아래와 같습니다.
1번.
https://school.programmers.co.kr/learn/courses/30/lessons/12914
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;
}
}
2. 피보나치로 변경 - 실패 코드
99club의 세션에서 다른 미들러분의 설명을 들었는데, 피보나치라고 하여 아래 피보나치로 변경했으나 실패한 코드입니다.
사실 처음 문제를 파악할 때 잘 못 계산해서 피보나치가 아닌 줄 알고 방향성을 틀었던 것이 혼자 힘으로 해결하지 못한 이유입니다... 처음에 값은 아래처럼 생각을 했었습니다.
[잘못된 계산으로 피보나치가 아니게 된 수열]
n = 1 2 3 4 5 6
f = 1 1 3 5 8 11
* 아래의 링크에 접속 시 상세한 피보나치 값을 알 수 있습니다.
https://school.programmers.co.kr/questions/37853
어쨌거나 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;
}
}
3. 피보나치로 변경 - 성공 코드
같은 문제가 발생한 게시글을 찾아 답변을 보았습니다.
내용을 보면 n번째 결과가 너무 커져서 안된다는 내용입니다.
그렇다면 어느정도 커지면 안 되는 지에 대한 게시글도 찾아보았습니다.
피보나치가 47이상일 때부터 음수가 나온다는 글을 찾게 되었고, 문제에는 n=2000까지 가능하므로 너무 숫자가 커짐을 확실히 알게 되었습니다.
따라서 첫 번째 답변글에서 봤듯이 나머지 연산을 이용해서 계산한 값들을 계속 갱신해주면 됩니다.
코드는 아래와 같습니다.
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;
}
}
2번.
https://school.programmers.co.kr/learn/courses/30/lessons/161990
2번 문제 풀이는 내일(금요일 TIL) 첨부할 예정입니다.
+4일차(목요일) 비기너 문제
1번.
https://school.programmers.co.kr/learn/courses/30/lessons/12969
2번.
https://school.programmers.co.kr/learn/courses/30/lessons/12948
+4일차(목요일) 챌린저 문제
1번.
https://school.programmers.co.kr/learn/courses/30/lessons/169198
2번.
https://school.programmers.co.kr/learn/courses/30/lessons/49189
봐주셔서 감사합니다!
'항해99 > 99club1기TIL' 카테고리의 다른 글
[99club/TIL] 1주차 - 일요일 TIL(Today I Learned) (0) | 2024.03.31 |
---|---|
[99club/TIL] 1주차 - 토요일 TIL(Today I Learned) (0) | 2024.03.30 |
[99club/TIL] 1주차 - 금요일 TIL(Today I Learned) (0) | 2024.03.30 |
[99club/TIL] 1주차 - 화요일 TIL(Today I Learned) (1) | 2024.03.26 |
[99club/TIL] 1주차 - 월요일 TIL(Today I Learned) (1) | 2024.03.25 |