오늘은 어제와 같은 실수를 반복하지 않으리
소금라떼와 함께 하루를 시작한다!
오늘도 선정해주신 문제와 풀고 싶은 문제를 골라서 해보려고 했는데
아직 오늘의 문제가 올라오지 않았다 🤨
씁.. 어쩔 수 없지
25일
문제라도 풀어볼까~~
📌 25일 선정 문제
- 비기너
- 수박수박수박수박수박수? (https://school.programmers.co.kr/learn/courses/30/lessons/12922)
- 서울에서 김서방 찾기 (https://school.programmers.co.kr/learn/courses/30/lessons/12919)
- 미들러
- 성격 유형 검사하기(https://school.programmers.co.kr/learn/courses/30/lessons/118666)
- 귤 고르기(https://school.programmers.co.kr/learn/courses/30/lessons/138476)
- 챌린저
링크를 눌러보니 비기너 2개는 간단한 문제고, 미들러 2개는 내가 예전에 푼 문제, 챌린저는 푼적 없는 문제였다.
그러면 보통 비기너 2개 + 미들러 2개 + 챌린저 1개를 잡고 싶긴 한데.. 내 실력이 상당히 하향된 점을 감안하여 일단 풀어보고 정하기로 했다~
어제는 타이머를 늦게 켰었는데 오늘은 모든 문제 제대로 시험친다 생각하고 풀어봐야겠음!
역시 쉽다.
우선 수박
이라는 문자열이 반복되는데 이게 홀수냐 짝수냐에 따라 뒤에 수
문자 하나가 추가되는지 안되는지를 나눠주면 되는 문제였다.
정수형에서 나누기 2를 하면 소숫점 이하는 버려지므로, 홀수라면 '수' 글자를 추가해서 이를 맞춰주면 된다고 생각했고 그렇게 풀었다
5분 만에 풀어서 괜히 뿌듯하다
문제를 보자마자
문자열 비교는 ==
이 아닌 .equals()
메소드를 써야함을 알고 있는지를 물어보는 문제라고 생각했다.
그것 말고는 단순 반복문이므로
다시 한번 짚고 가보면, ==은 바로 값을 비교할 때 쓰는 건데 String
자료형 같은 경우에는 참조값을 가지므로 같은 걸 참조해서 값이 같을 수 있지만 다른 주소에서 참조해도 막상 값 자체가 같으면 같아야하기 때문에 주소 비교가 아닌 값을 비교해야 하므로 ==
을 쓰지 못한다!
음음 이렇게 리마인드 하고 지나가야지~~
이 문제는 2분 10초만에 풀어서 행복하다!
하하 올게왔다.
이 익숙한 문제이름.. 그리고 기억나지 않는 풀이 ㅎㅎ
이건 절대 빠르게 풀 순 없겠지?
다시 풀어보자!!
어라? 내가 너무 편견속에 있었나
내가 생각했던 문제가 아니었음
그렇지만 맞왜틀
속에서 잠시 빠져나오지 못했는데.. 그 이유는 문제를 제대로 읽지 않았기 때문이었다!
1~7
값이 들어오고 각각 매우 비동의 ~ 매우 동의
를 나타내는데 그에 대한 분기를 적절하게 처리해주지 못했음
그래서 시간이 좀 더 소요되었지만 약 20분만에 풀 수 있었다!
오예 7분 30초~~
생각보다 귤 배열의 길이와 원소 크기가 커서 좀 고민해야하는 문제인가 싶었지만, 오히려 간단했다
서로 다른 종류의 수를 최소화할 때 몇개가 다른지를 출력하는 문제인데, 이를 바꿔말하면 서로 같은 종류의 귤이 많다면 무조건 고른다 라고 할 수 있을 것이라 생각했음
그래서 카운트를 담은 배열을 정렬하면 무조건 종류가 같은 귤의 가장 많은 개수부터 가져올 수 있으므로 배열로 풀었다
그런데 만약 무슨 귤인지도 가져와야 한다면
이 솔루션은 못쓸텐데
음.. Map을 정렬하는 방법으로 밖에 안되려나..?
이건 좀 더 고민해봐야겠음!
아니 그런데 이게 되네.. 챌린저 문제까지 풀 시간이 남다니..!!
그렇지만 챌린저 문제에 너무 많은 시간을 할애할 순 없으니 최대한 시험처럼 빨리 풀어보자!
보고 벡트래킹이라 생각했고 충분히 빨리 끝날 수 있을 거라 생각했지만
이 로직 왜 시간초과지..
import java.util.*;
import java.io.*;
class Solution {
static final int N = 100000000;
static int[] vis;
public int solution(int storey) {
Queue<Integer> q = new LinkedList<>();
q.add(storey);
vis = new int[N+1];
Arrays.fill(vis, Integer.MAX_VALUE);
vis[storey] = 0;
vis[0] = storey;
while(!q.isEmpty()){
int curFloor = q.poll();
// 0층을 갈 수 있는 현재 비용보다 같거나 비싸다면 볼 필요 없다.
if(vis[0] <= vis[curFloor])
continue;
for(int i=0; ; i++){
boolean isPossi = false;
int moveAbs = (int) Math.pow(10, i);
if((0 <= curFloor + moveAbs && curFloor + moveAbs <= N) || (0 <= curFloor - moveAbs && curFloor - moveAbs <= N)){
if(0 <= curFloor + moveAbs && curFloor + moveAbs <= N && vis[curFloor]+1 < vis[curFloor + moveAbs]){
vis[curFloor + moveAbs] = vis[curFloor]+1;
q.add(curFloor + moveAbs);
}
if(0 <= curFloor - moveAbs && curFloor - moveAbs <= N && vis[curFloor]+1 < vis[curFloor - moveAbs]){
vis[curFloor - moveAbs] = vis[curFloor]+1;
q.add(curFloor - moveAbs);
}
}else break;
}
}
return vis[0];
}
}
1시간 26분째...
완탐이 아닌 입력 변수의 특징을 분석해서 풀어보기로 전략 변경
/*
1 2 3 4, 5 => 감소 이득
6,7,8,9 => 증가 이득
=> 10을 여러번 곱해도 같음
storey를 10으로 나누면서 끝자리를 가져오고
그게 위 조건에 맞게 처리함
근데 만약에 증가 이득이면 다음 수에 +1 해야함
*/
import java.util.*;
import java.io.*;
class Solution {
static int lastNum, carry, ans;
public int solution(int storey) {
carry = 0;
ans = 0;
while(true){
lastNum = storey % 10 + carry;
if(10 <= lastNum){
carry = 1;
lastNum%=10;
}else{
carry = 0;
}
if(6 <= lastNum){
ans += 10-lastNum;
carry = 1;
}else{
ans += lastNum;
}
if(storey < 10)
break;
storey/=10;
}
if(carry == 1)
ans+=1;
return ans;
}
}
맞왜틀 반복중. . .
입력이 5
라면 carrier
값을 줄이기 위해 감소시키는 것이 좋은데, 95
라면 100
으로 만들어 한번에 0
을 만들 수 있으니 증가하면 좋다... 이걸 어떻게 코드로 녹이지..
코드 삭제하고 추가하고 위치 바꿔보는중
2시간 경과...
아무리 생각해도 엣지케이스가 너무 많아서 결국 답 코드를 봤음
import java.util.*;
import java.io.*;
class Solution {
static int lastNum, ans;
public int solution(int storey) {
ans = 0;
while(0 < storey){
lastNum = storey%10;
storey/=10;
if(lastNum==5){
if(5 <= storey%10){
ans += 10-lastNum;
storey++;
}else{
ans+=lastNum;
}
}else if(6<=lastNum){
ans += 10-lastNum;
storey++;
}else{
ans+=lastNum;
}
}
return ans;
}
}
아 그렇네.. 5일 때 변수가 많으니까 저것도 분기를 나눠주면 풀리는 문제였구나..
시간복잡도를 계산해보고 넘어갔어야 했는데 처음 완탐에서 시간쓴게 너무 아깝다
게다가.. 엣지케이스를 묶어서 특징을 잡고 그걸로 필터링을 해야했는데, 못푸는 문제
라고 결정내린게 상당히 아쉬웠다 😂
오늘 그래도 처음에 목표했던 5문제나 풀었으니 이제 다른 목표를 진행해야지.. 총총
집가면 어제처럼 어두워져서 읽지 못할 것 같아, 두번째 목표로 정했음!
그리고 잊을 수도 있으니 지금 공개로 바꾸고 블로그 올린 뒤 인증 폼 작성해야지~~
오늘 공부 시작 | 오늘 공부 끝 |
---|---|
![]() | ![]() |
51p 정도 읽으니 슬슬 지친다..
정말 너무 오랜만에 개념책을 곱씹으며 읽어봤음
그런데 이정도 읽었다고 벌써 5시면.. 흠
내일부턴 일찍 도착해서 모닝 PS를 풀고 이후 책을 읽는게 좋을 것 같다
이래가지곤 진도가 너무 느릴 것 같음..
오늘 정리까지 끝내려 했는데 수업 때 공부했던 교재보다 좀더 어려워서 추가적인 용어 정리까지 해야 마무리 할 수 있을 것 같다..
주말에 곱씹으며 달려볼까~~
그런데 다음 공부하려니 다 강의여서, 어제 가볍게 들었던 인프런 HTTP 강의 자료를 다시 볼 생각이다
아직 퇴근하지 않아서 강의 소리를 들을 수가 없으니..
생각보다 페이지 수가 좀 되니까 빠르게 봐야겠다
하하하하하하
집만 가면 의욕이 자꾸 사라진다...
이틀 연속 이런 흐름이라니
체크 전 | 체크 후 |
---|---|
이제 알았다
난 집을 가지 않으면 일과를 할 수 있다는 것을!!
내일부턴 집을 늦게 들어가야겠다