TIL_240219

라미·2024년 2월 19일

TIL

목록 보기
18/25
post-thumbnail

알고리즘 테스트

오늘은 항해 알고리즘 테스트 주간의 결과를 시험하는 시험데이였다...그런데 진짜 바보같은 일을...!!!
크하하하크하하하크하하하크하하ㅏ 그냥 세문제 중에 하나를 푸는 건 줄 알았는데!! 세개 다 풀어도 되는 거였다.
문제 푸는 것보다 영상 찍는게 더 오래걸리다니...ㅎ 이미 알아버렸을때는 시험답안 제출을 완료한 상태라 어쩔 방법이 없었다.
그래도 3점짜리 제출했으니...뭐 어쩔 수 없지 바보같은 나를 탓하자.

그럼 오늘 본 시험 문제 리뷰


1. 서현이의 잔돈 계산기

❤️문제

설명) 서현이가 1000원을 가지고 편의점에서 물건을 사려고 한다. 

편의점에는 500원, 100원, 50원, 10원이 충분히 있고, 편의점 직원은 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 

서현이가 편의점에서 물건을 사고 1000원 지폐 한 장을 냈을 때, 받을 잔돈의 개수를 구하는 프로그램을 작성하여라. 
(단, 물건의 가격은 10원 이상 1000원 미만이며, 1원 단위는 고려하지 않는다.) 

📝풀이

public int solution(int num) {

    int change = 1000;
    int count = 0;

    //잔돈 계산
    change = change - num;

    //동전 개수 계산
    int[] coins = {500,100,50,10};
    for(int coin : coins){
        count += change / coin;
        System.out.println(change);

        //배열 돌면서 나머지 계산
        change %= coin;
    }

    return count;
}

👍코드 설명

서현이가 1000원을 냈을때 받을 잔돈의 개수를 구하는 프로그램을 작성하였다.
1. 잔돈 change를 서현이가 내는돈 1000원으로 초기화 했다.
2. 잔돈 계산을 위해 change = change - num(물건가격) 
3. 동전 종류별로 int 배열에 저장한뒤 for 문으로 동전 배열을 순회한다.
4. count += change / coin; 현재 동전으로 몇개의 동전을 사용할 수 있는지 계산하고 count에 추가해준다.
5. change %= coin; 현재 동전으로 사용한만큼 잔돈을 갱신한다.

엄청나게 간단한 문제였다...바보같이 선택해서 풀라는거에 집중해서 그냥 3점짜리 하나만 풀고 제출하기를 홀랑 눌러버리다니 난 멍청이야.


2. 신지의 체크인 페이지

❤️문제

신지는 항해에서 한 주 동안 공부 기록을 남길 알고리즘을 만들어보기로 결심했다.

항해의 체크인 페이지에는 몇가지 조건이 있는데 이를 만족하는 알고리즘을 만들어보자.

- 체크인과 체크아웃은 항상 정시에 진행한 것으로 가정한다.
- 체크아웃을 할 때 익일 시간은 24+a 로 계산한다. 즉 새벽 2시는 24+2 인 26으로 표기한다.
- 체크인 페이지는 체크아웃이 새벽 5시 정각이나 새벽 5시를 넘어가면 체크아웃을 깜빡한 것으로 간주한다.
따라서 새벽 5시가 넘어가 체크아웃을 하게 되면 자동으로 체크아웃을 오후 9시(21시)로 한 것으로 처리한다.

📝풀이

public int solution(int[] arr1, int[] arr2) {
    int answer = 0;
    //24+5
    for(int i=0; i<arr1.length; i++){
        if(arr2[i]>=29){
            arr2[i] = 21;
        }
        answer += arr2[i]-arr1[i];
    }


    return answer;
}

👍코드 설명

1. arr1(체크인) / arr2(체크아웃) 배열의 길이만큼 for문을 순회한다.
2. 제한사하에 새벽 5시가 넘으면 체크아웃을 안한것으로 간주하기 때문에 arr2가 29 이상인 것은 21로 변경해 줬다.
3. answer += arr2[i]-arr1[i]; 한 주의 공부시간을 체크하는 것이기 때문에 arr2[i] - arr1[i](하루의 공부시간) 을 answer에 더해줬다.

1번 문제보다 더 쉬운 문제였던거 같다. 간단한 문제였다.


3. 소수 찾기

❤️문제

설명) 문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. 현지는 s에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하려고 합니다.

예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.

📝풀이

public String solution(String s) {
    int[] numbers = new int[s.split(" ").length];

    int idx = 0;
    //문자열 int 배열로 변환
    for (String number : s.split(" ")) {
        numbers[idx] = Integer.parseInt(number);
        idx++;
    }

    // 최대,최소 초기 설정
    int minNum = Integer.MAX_VALUE;
    int maxPrime = Integer.MIN_VALUE;

    for (int num : numbers) {
        if (isPrime(num)) {
            // 소수 판정, 소수들의 최대값 저장
            maxPrime = Math.max(maxPrime, num);
        } else {
            // 소수가 아닌 수 중 최소값 저장
            minNum = Math.min(minNum, num);
        }
    }
    //int + 문자열 더해줘서 변환
    return  minNum + " " + maxPrime;
}

//소수 확인
private boolean isPrime(int num) {
    if (num < 2) {//num 은 2보다 커야함 소수는 2 이상의 수
        return false;
    }
    for (int i = 2; i <= Math.sqrt(num); i++) {
        if (num % i == 0) {
            return false;
        }

    }
    return true;

}

👍코드 설명

solution(String s)
1. 입력받은 문자열을 int 배열로 분리하여 저장.
2. 최소값을 저장할 변수 정수형의 최대값으로 초기화, 최대값을 저장할 변수 정수형의 최소값으로 초기화.
3. for문을 순회하며 소수판정, 소수의 최대값, 소수가 아닌수의 최소값 저장
4. 최솟값 + 공백문자 + 최댓값 반환 (int + String = String 이라는 성질 이용)

isPrime(int num)
소수의 성질을 이용하여 소수 판정을 진행. 소수이면 true, 아니면 false 를 반환
1. 소수는 '2 이상의 수' 2보다 작은 수라면 false 반환
2. 소수는 2~검사할 수의 제곱근까지의 수로 해당 수를 나누었을때 나누어진다면 소수가 아님 false 반환

뭔가 문제자체가 어려운 것 보다는 영상을 찍는데 설명하는걸 어떻게 해야할지 잘 모르겠어서 그게 더 어려웠다. 소수판정 문제는 시험보기 전에 마침 프로그래머스 문제를 풀어봐서 어렵지 않게 구현할 수 있었던 부분이었지만 생각보다 구혀한 코드를 설명한다는게 말로 뱉으려니 조리있게 나오지 않고...흠 참 그랬다 영상만 한 5번은 찍은것 같다...흠 앞으로 뭔가 코드를 짜고 혼자서 나에게 설명하는 연습을 해 볼 필요성이 있다고 느끼는 시험이었다.


오늘 멘토링이 있었는데 멘토 선생님께서 지난 일주일이 어땠는지 물어보셨다. 알고리즘 푸는게 어떠냐고,..하나의 문제를 푸는데 생각하는 시간이 오래 걸린다고 하니까 일단 비슷한 종류의 문제를 많이 풀어보라고 알려주셨다.

  • 익숙해 질 때까지 같은 패턴의 문제 풀어보기
  • 익숙해 진다면 풀어보지 않고 생각한대로 적어보고 답 비교해보기!

0개의 댓글