[항해99] 알고리즘 2일차 TIL - 두뇌를 의심하는 문풀의 나날들

LIHA·2023년 1월 28일
0

항해99

목록 보기
27/54
post-thumbnail

코테 문제가 안 풀리는데, 풀 방법도 모르겠다. 그러다 보니 진지하게 '머리가 나쁜가...?'라던지 '잘못 선택했나...?' 에 대해 의심했다.
파고드는 성향이 강하고, 알고리즘에 취약한 사고 회로를 가진 탓인듯 하다. 지엽에 너무 꽂히고 왜? 왜? 왜? 하는게 문제.
이과였지만 과학만 좋아하고 수학을 제일 못했지. 논리? 알고리즘? 그게 뭔가요?
어엉엉ㅇ어엉 난 대체 왜 이런 사고회로를 가진 것인가😂😂😂😂😂 돌머리는 웁니다.

원빈 멘토님 말씀이,

  • 나같이 파고들기 쉬운 성격의 사람은 브레이크를 걸어줘야 하는데 스스로는 안 되니까,
  • 그 브레이크 시점을 확인하고 학습 방향을 묻기 위해 멘토님 / 매니저님을 귀찮게 해야 한다고.

그것이 멘토님 / 매니저님이 계시는 이유라고.

1/28 (토) 원빈 멘토님의 객체지향과 SOLID를 비롯 JAVA, Spring 학습 상담 기록은 이쪽.


왜 나는 배열문제만 나오면 머리가 돌아가질 않는가🤯🤯🤯

        long[] answer = new long[n];
        
        for (int i = 0; i < n; i++) {
            if (x == 0) {
            answer[i] = x;
            }
             answer[i] =  x * ( i + 1 );
        }

이렇게 썼는데, 끝의 두 문제 (13, 14번 TC)에서 계속 틀리는 것이었다.
(이것도 질문답변에서 0인 경우를 고려하라고 해서 이건줄 알고 해봤는데, 알고보니 0이든 아니든 저 식이 틀린건 아니었다.)
와 뭐가 틀렸는지 도저히 모르겠어!! 질문답변을 보았다.

(long)(x * i) 식으로 처리하면 int형으로 계산되고 그 다음에 long으로 변경된 값이 들어가게 됩니다.
(long)x * i 으로 해야합니다.

아! 나는 아예 자료형 변환도 안했는데. long으로 반환하는지 보는거였구나.
아래와 같이 고쳤더니 잘 됐다.

        long[] answer = new long[n];
        
        for (int i = 0; i < n; i++) {
             answer[i] =  (long)x * ( i + 1 );
        }

왜 놀이기구 요금 하나 계산하는게 이렇게 어려운건가요


price += price * i;

처음엔 가격을 이렇게 했더니 몹시 큰 수가 나와서, 결국 놀이기구 요금 총액을 나타내는 변수를 pay로 새로 썼다.

그런데 return값이 계속 0이 나오는게 아닌가.
-> 문제는 for문의 조건부였다! i <= count로 썼어야 했다. 근호님의 예리한 관찰력!

   for (int i = 1; i < count; i++) 
    pay += price * i;
    
     if (pay > money) {
                answer = pay - money;
            } else {
                answer = 0;
            }

이렇게 쓰고 pay를 찍어봤더니, 총합 30원이 나와야 할 pay가 15원밖에 나오지 않았다.
주어진 값이 pay = 15, money = 20이었기 때문에 pay > money가 아니라서 0이 return 되었다.


  public long solution(int price, int money, int count) {
        long answer = 0;
        long pay = 0;
    
        for (int i = 1; i <= count; i++) {
            pay += price * i;
            
            if (pay > money) {
                answer = pay - money;
            } else {
                answer = 0;
            }
        }
        return answer;
    }

이렇게 했더니 무사히 잘 된다. for문의 i <= count; 부분이 문제였다!

코테 챌린지에서 풀다 막힌 문제 - 대문자를 소문자로, 소문자를 대문자로.


class Solution {
    public String solution(String my_string) {
        String answer = "";
        char ch = ' ';
        
        for (int i = 0; i < my_string.length(); i++){
            if (my_string.charAt(i) >= 65 && my_string.charAt(i) <= 90) {
              ch = my_string.charAt(i) - '32';
                answer += ch;
            }
            else {
                ch = my_string.charAt(i) + '32';
               answer += ch;
            }
        }

        return answer;
    }
}

나는 이렇게 하려고 했더니 char와 int를 계산할 수 없다고 나왔는데, 음...뭐가 문젠지 모르겠다.
char형도 산술연산하면 ASCII 코드값으로 계산되지 않나?🤔 좀더 고민해봐야겠다.


승렬님의 코테 관련 팁 & 오늘의 from 코챌 지식

  • charAt(i)는 getter지 setter가 아니라서 값을 얻어올 순 있지만 바꿀 순 없다고.
    그래서 주의해서 써야 한다고.

  • 이중 for문은 바깥 for문은 무조건 행만 찍어주는 애. 별이 찍는건 안에서 도는 for문.
    그렇게 생각하고 for문을 사용하면 특별히 어려울거 없이 안의 별 수만 생각해주면 된다.
    별찍기는 while보다는 이중 for문이 편할것.

  • 더블클릭 하고 따옴표나 큰따옴표, 대괄호 등 누르면 거기에 그 특수문자로 감싸진다.

  • 마크다운 문법에서 별표시를 보고싶으면 \를 앞에 써주면 보인다.


아니 대체 2016년은 뭐가 문제야?

class Solution {
    public String solution(int a, int b) {
       String[] yoil = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
        String answer = "";
        
        for (a = 1; a <= 12; a++) {
            if (a == 1) {
                for (b = 1; b <= 31; b++) {
                    answer = yoil[(b + 4) % 7];
                }
            } //1월

            else if (a == 2){
                for (b = 1; b <= 29; b++) {
                    answer = yoil[b % 7];
                }
            } // 여기까지 일요일

            else if (a == 3 || a == 12) {
                for (b = 1; b <= 31; b++) {
                    answer = yoil[(b + 1) % 7];
                }
            } //여기까지 화요일

            else if (a == 4) {
                for (b = 1; b <= 30; b++) {
                    answer = yoil[(b + 4) % 7];
                }
            } //4월

            else if (a == 7 || a == 10) {
                for (b = 1; b <= 31; b++) {
                    answer = yoil[(b + 3) % 7];
                }
            } //여기까지 목요일

            else if (a == 5 || a == 8) {
                {for (b = 1; b <= 31; b++)
                    answer = yoil[(b - 1) % 7];
            }
        }
            else if (a == 6 || a == 9) {
                for (b = 1; b <= 30; b++) {
                    answer = yoil[(b + 2) % 7];
                }
            } //여기까지 수요일
            else if (a == 11) {
                for (b = 1; b <= 30; b++) {
                    answer = yoil[(b - 1) % 7];
            	    }
         	   } // 여기까지 일요일
            } return answer;
   		 }
    }

이렇게 짰는데, reuturn을 했더니 자꾸 요일이 안 맞는다.
이렇게 했더니 IntelliJ에서는 answer를 찍었을 때 해당 월의 마지막날 요일이 return 되고, 프로그래머스에서는 무슨요일인지 모르겠는데 그냥 안맞는다.
그렇다면... 잠깐, 값을 입력받는다고 했는데. 내가 이걸 여러 if문은 몰라도 이렇게 여러 for문을 써야 할 이유가 있었나? 애초에 이걸 왜 for문을 썼었지?


2016년은 문제가 없고 내가 문제였다 - 달별 일수에 따른 요일계산을 다 틀린게 문제!

class Solution {
    public String solution(int a, int b) {
       String[] yoil = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
        
        String answer = "";
        
            if ((a == 2 && b >= 1 && b <= 29) || (a == 8 && b >= 1 && b <= 31)) {
                answer = yoil[b % 7];
                } // 2월은 월요일부터 시작 -> 8월도 월요일 시작해서 추가함 -> 11월도...

            else if ((a == 3&& b >= 1 && b <= 31) || (a == 11 && b >= 1 && b <= 30)) {
                answer = yoil[(b + 1) % 7];
            } 
            // 3, 12월은 화요일부터 시작 -> 3월은 31일까지야!! -> 12월 수요일 시작이야... 
            // -> 이것도 아냐 12월 목요일 시작이여 멍청아... 11월이 화요일 시작이고... 어휴...

            else if ((a == 6  && b >= 1 && b <= 30) || (a == 12 && b >= 1 && b <= 31)) {
                answer = yoil[(b + 2) % 7];
            } // 6, 9월은 수요일부터 시작 -> 9월 아님 6월만!!! -> 12월 수요일 시작이라 옮김

            else if (a == 9 && b >= 1 && b <= 30) {
                answer = yoil[(b + 3) % 7];
            } // 7, 10월 목요일부터 시작 -> 7월 아님! 9, 10월이 목요일 시작!! 
            //-> 10월 금요일 시작이야!! -> 7월도 금요일 시작이라 옮김!!

            else if (((a == 1 || a == 7) && b >= 1 && b <= 31) || (a == 4 && b >= 1 && b <= 30)) {
                answer = yoil[(b + 4) % 7];
            } // 1, 4월은 금요일부터 시작 -> 7월도 금요일 시작!! 그리고 7월 31일까지야!! 
        
            else if ( a == 10 && b >= 1 && b <= 31) {
                answer = yoil[(b + 5) % 7];
            } // 뭐해... 10월 토요일 시작이잖아...

            else if (a == 5 && b >=1 && b <= 31) {
                answer = yoil[(b + 6) % 7];
            } // 5, 8, 11월은 일요일부터 시작 => 아니야! 8월은 월요일이야 뺐어! 
            //-> 11월 일요일 시작 아니야... 화요일이야...
            
            return answer;
            } 
    }
      

그리고 새벽 5시까지 씨름한 결과 -> 아, 7월 이후로 월 계산을 다 틀려서 그렇구나.
머리가 바보면 좀 적어가면서... 했는데도 왜이러냐. 엉엉. 울고싶다.

2016년 문제 풀이 과정에서의 내 문제점 및 아쉬운 점

  • 어떻게 이거 하나 푸는데 이렇게나 오래 걸린건지
  • 코드는 또 왜이리 긴건지, 좀 간결하게 할 수는 없었는지

시간이 너무 오래걸린 요인:
1. 푸는 방법이 잘못돼서
->(처음에 for문을 돌림 - 얘는 항상 그달의 마지막날의 요일만 return 해줬음)
2. 달별 일수에 따른 요일 계산을 틀려서
->2월 29일이 있다는걸 알면 뭐하나. 산수가 안되는디. 크흡.

저기요? 이러시는 이유가 있을거 아니에요.

만세...!!!!!!!!!!!🤪🤪🤪🤪🤪🤪🥴🥴🥴🥴🥴😵😵😵😵😵
12월의 시작 요일을 목요일로 옮기지 않은 탓이었다. 대체 이거 하나 하겠다고 몇시간을 헤맨건가. 너덜너덜해진 기분.

향상된 for문 한번 쓰기 힘들다...

    public int[] solution(int[] arr, int divisor) {
        
        int[] answer = {};

        for(int i : arr) {
            if(arr[i] % divisor == 0) {
                answer[i] = arr[i];
                Arrays.sort(answer);
            }
            else {
                answer[i] = -1;
             }
        } return answer;

이렇게 썼더니, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 0 예외가 뜬다.

  if(arr[i] % divisor == 0) {
                answer[i] += arr[i];
                Arrays.sort(answer);
            }

그래서 answer[i] += arr[i]; 로 바꿔줬더니, 이젠 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 예외가 뜬다.

어쩌라는 것인가?!!?!?!?! 나 도라버려. 그냥 보통의 for문을 써보자.
-> 아니 보통 for문 썼더니 첫번째 예외가 또 나온다!

profile
갑자기 왜 춤춰?

0개의 댓글