[항해99] 알고리즘 1일차 TIL - 갑자기 문제가 안풀려요

LIHA·2023년 1월 27일
1

항해99

목록 보기
26/54
post-thumbnail
post-custom-banner

개미 개체 수 구하는게 이렇게 어려울 줄이야 - 연립방정식이 기억나지 않아요

나는 그냥 개미의 개체 수를 구하고 싶을 뿐인데 테스트 문제를 통과하지 못하고 있다. 엉엉

public int solution(int hp) {
        int gen;
        int sold;
        int work;
        
        int answer = 0;
        for (gen = 1; gen < hp ; gen++){
            for (sold = 0; sold < gen ; sold++){
                for (work = 0; work < sold ; work++) {
                if(hp / (5*gen + 3*sold + work) == 1) {
            answer = gen + sold + work;
                }
            }
        }
   
        }
        return answer;
    }

테스트를 해봤더니, 2와 3은 통과하는데 테스트 1이 자꾸 틀린다.
아무리 생각해도 원인을 모르겠어서 챌린지 분들께 여쭤보았더니 for문의 위치가 문제라고.
-> for문은 안쪽에서부터 돌기 때문에, 가장 먼저 증가시키고 싶은 애를 안쪽 for문에 놓는게 좋다.
-> 그런데 이거 for문의 위치를 바꾸니 아예 돌아가지 않는다.

그리고 무엇보다 이 방법은 사실 시간복잡도가 너무 높아 권장하지 않는다.
다른 분들은 보통 hp%5를 다시 hp에 넣고, 그 hp로 hp%3 연산을 수행하여 다시 hp에 넣어서 answer에 += 하는 식으로 답을 내셨다.

다른 분들의 깔끔한 풀이.

정규식에서 꺽쇠는 어디에 써야 하나 -> 대괄호 '^안쪽'!!

        String my_string = "asd4b37o1bo7bk4";
        my_string = my_string.replaceAll("^[0-9]", "");
        System.out.println(my_string);

이거 숫자 아닌게 아무리 해도 안 지워져요!!
-> ^[0-9] 아니고 [^0-9] 으로 써야된다. 대체 뭘 한거냐.

자바는 지수를 표현할때 꺽쇠를 쓸수 없다!

-> Math.pow(int 밑이 될 수, int 거듭제곱 수); 를 사용하거나, 밑이 될 수 n *= 2 하는 식으로 푸는게 일반적이다.

비트연산자로 2^n을 표현할 수 있다니. 세상엔 천재가 많다.

 public int solution(int n, int t) {
        int answer = 0;

        answer = n << t;

        return answer;
    }

세균번식 문제를 이렇게 푼 사람들이 있었다. 나는 이름밖에 기억 안 나는데. 천잰가?
비트 연산자를 이용한 2^n 표시에 대한 글

n << i 라는 말은, n 숫자의 비트를 좌측으로 i 만큼 이동시킨다.
여기서 좌측으로 한번씩 이동 할 때마다 비트 특성 상 2의 i 승씩 만큼 증가 한다.
즉, n << i 의 좌측 쉬프트 연산은 산술적으로 n * 2^( i ) 과 같다.

profile
갑자기 왜 춤춰?
post-custom-banner

0개의 댓글