- 진행
| 일자 | 완료 번호 | 
| 24.07.16 | 1~20 | 
| 24.07.17 | 21~35 | 
| 24.07.18 | 36~42 | 
| 24.07.19 | 43~47 | 
| 24.07.22 | 48~50 | 
| 24.07.23 | 51~55 | 
| 24.07.24 | 56~57 | 
| 24.07.25 | 58 | 
| 24.07.26 | 59~60 | 
- 회고
59. 덧칠하기 : https://school.programmers.co.kr/learn/courses/30/lessons/161989
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 풀이과정
class Solution {
    public int solution(int n, int m, int[] section) {
        int u = 1;
        int answer = 1;
        
        if(m == 1){
            return section.length;
        }else{
            for(int i = 1; i < section.length; i++){
                int p = section[i] - section[i - 1];
                if(p <= (m - u)){
                    u += p;
                }else{
                    u = 1;
                    answer++;
                }
            }
        }
        return answer;
    }
}- 페인트를 사용한 범위 변수 u를 선언하고 1로 초기화
- 정답 변수 answer을 선언하고 1로 초기화
- 만약 롤러의 길이가 1이라면 칠해야하는 벽 section의 길이를 정답으로 return
- 아니라면 칠해야하는 벽 section을 순회하며 칠해야 하는 벽과 벽사이의 거리 변수 p를 선언
- 벽과 벽사이의거리 p가 (롤러의길이 - 사용한 범위) 보다 작거나 같으면 롤러를 한번 더 사용하고
 사용한 범위 증가
- 벽과 벽사이의거리 p가 (롤러의길이 - 사용한 범위) 보다 크다면 롤러를 리셋하고 정답 +1
60. 기사단원의 무기 : https://school.programmers.co.kr/learn/courses/30/lessons/136798
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 풀이과정
Time: 107.72 ms, Memory: 73.6 MB
class Solution {
    public int solution(int number, int limit, int power) {
        int[] factors = new int[number];
        factors[0] = 1;
        int answer = 0;
        for(int i = 2; i <= number; i++){
            int m = 0;
            int sqrt = (int) Math.sqrt(i);
            for(int j = 2; j <= sqrt; j++){
                if(i % j == 0){
                    m++;
                }
            }
            if(sqrt * sqrt == i){
                m = m * 2 + 1;
            }else{
                m = m * 2 + 2;
            }
            if(m <= limit){
                factors[i - 1] = m;
            }else{
                factors[i - 1] = power;
            }
        }
        for(int a : factors){
            answer += a;
        }
        return answer;
    }
}- 약수를 구할 때 완전제곱수인경우 제곱근까지의 약수 * 2 + 1 아닐경우 * 2를 하면 갯수가 나온다.
- 위 식의 경우 1 즉 factors[0]의 경우 무조건 1이기 때문에 대입해준다.
- 1과 자기 자신의 경우 무조건 포함이기 때문에 루프를 2부터 돌리고 마지막에 2를 더해준다.
- limit에 따라 factors에 대입해준다.
 ※ 몇몇 케이스에서 시간이 오래걸리는 경우가 발생
 효율적인방법을 찾아보니 에라토스테네스의 체라는 알고리즘이 있다는걸 확인했다.
- 개선 코드(속도 개선 107.72 → 9.87)
Time: 9.87 ms, Memory: 78.9 MB
class Solution {
    public int solution(int number, int limit, int power) {
        int[] factors = new int[number + 1];
        int answer = 0;
        // 에라토스테네스의 체 변형을 사용하여 약수의 개수 계산
        for (int i = 1; i <= number; i++) {
            for (int j = i; j <= number; j += i) {
                factors[j]++;
            }
        }
        // 제한 및 파워 적용
        for (int i = 1; i <= number; i++) {
            if (factors[i] > limit) {
                factors[i] = power;
            }
            answer += factors[i];
        }
        return answer;
    }
}
'Java & Spring > 코딩테스트' 카테고리의 다른 글
| 12일차 - 알고리즘 코드카타(실패) (0) | 2024.07.31 | 
|---|---|
| 11일차 - 알고리즘 코드카타 (1) | 2024.07.29 | 
| 9일차 - 알고리즘 코드카타 (0) | 2024.07.25 | 
| 8일차 - 알고리즘 코드카타 (1) | 2024.07.24 | 
| 7일차 - 알고리즘 코드카타 (0) | 2024.07.23 |