| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
- fcm
- lambda
- rds
- serverless
- kubernetes
- amazonqcli
- 분산시스템
- Validation
- cloudwatch
- aws
- Lamda
- SageMaker
- CAP
- sns
- CHECK
- IaC
- terraform
- 병목
- PACELC
- Today
- Total
잡다한 IT 지식
프로그래머스 - 기지국 설치(Java) 본문
본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
https://github.com/ROUTINE-STUDY/Algorithm
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.
GitHub - ROUTINE-STUDY/Algorithm: 초보 알고리즘 스터디 / 누구나 참여 가능
초보 알고리즘 스터디 / 누구나 참여 가능 :runner:. Contribute to ROUTINE-STUDY/Algorithm development by creating an account on GitHub.
github.com
문의는 댓글 바람.
문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12979?language=java
[문제 설명]
기지국을 최소한으로 설치해서 모두가 인터넷을 할 수 있게 해줘라.
[접근 방법]
문제 언어가 Java밖에 없어서 오랜만에 Java를 사용해서 풀었다.
문제를 봤을 때, 딱 그리디 냄새가 나는 문제.
단, 문제의 조건으로 아파트의 개수가 N: 200,000,000이다.
나는 처음에 O(N)에 방법이 생각나서 이 방법으로 풀었는데 효율성을 통과하지 못했다.
제출하면서도 N이 2억인데 이게 효율성이 되나? 싶었는데 걱정하던대로 효율성을 하나도 통과 못했다.
따라서, 단순하게 길이를 이용하여 푸는 방법을 선택했다.
결국, 기지국이 없는 거리를 측정하고 그 사이에 기지국을 몇 개 세울지만 알면 된다.

[처음 작성한 오답 : 시간초과 ]
class Solution {
    public int solution(int n, int[] stations, int w) {
        int answer = 0;
        boolean[] isConnected = new boolean[n];
        for (int station : stations) {
            checkConnected(isConnected, station - 1, w);
        }
        int cntOfUnconnectedCity = 0;
        for (int i = 0; i < n; i++) {
            if (!isConnected[i]) {
                cntOfUnconnectedCity++;
            } else {
                if (cntOfUnconnectedCity != 0) {
                    answer += getBaseStationCntNeeded(cntOfUnconnectedCity, w);
                }
                cntOfUnconnectedCity = 0;
            }
        }
        if (cntOfUnconnectedCity != 0) {
            answer += getBaseStationCntNeeded(cntOfUnconnectedCity, w);
        }
        return answer;
    }
    private void checkConnected(boolean[] isConnected, int station, int w) {
        for (int i = station - w; i <= station + w; i++) {
            if (i < 0) {
                continue;
            } else if (isConnected.length <= i) {
                break;
            }
            isConnected[i] = true;
        }
    }
    private int getBaseStationCntNeeded(int cntOfUnconnectedCity, int w) {
        int cnt = 0;
        cnt += cntOfUnconnectedCity / (w * 2 + 1);
        if (cntOfUnconnectedCity % (w * 2 + 1) != 0) {
            cnt++;
        }
        return cnt;
    }
}[수정 코드]
class Solution {
    public int solution(int n, int[] stations, int w) {
        int answer = 0;
        int start = 0;
        int end = 0;
        
        for (int station : stations) {
            int stationPosition = station - 1;
            end = stationPosition - w - 1;
            if (end < start) {
                end = start;
            } else {
                answer += getBaseStationCntNeeded(start, end, w);
            }
            start = stationPosition + w + 1;
            if (start >= n) {
                break;
            }
        }
        if (start <= n - 1) {
            answer += getBaseStationCntNeeded(start, n - 1, w);
        }
        return answer;
    }
    private int getBaseStationCntNeeded(int start, int end, int w) {
        int cnt = 0;
        int cntOfUnconnectedCity = end - start + 1;
        cnt += cntOfUnconnectedCity / (w * 2 + 1);
        if (cntOfUnconnectedCity % (w * 2 + 1) != 0) {
            cnt++;
        }
        return cnt;
    }
}
[느낀 점]
현실에서 코딩을 할 때, 매 번 생각하는 게 '이 코드보다 효율적인 코드가 있을까?'다.
알고리즘을 풀 때는, 보통 자료의 개수의 한계를 정해주고 시간제한을 주므로 단순하게 시간복잡도만 계산해서 문제를 풀고는 한다.
이번 문제는 이러한 시간 제한을 안줘서 더 효율적인 방법이 있는데도 이를 생각하지 못하고, 쉬운 방법을 택했다.
쉬운 방법이 있더라도 늘 더 효율적인 코드를 작성하도록 노력하자.
'알고리즘 문제 풀이 > 그리디' 카테고리의 다른 글
| 1946번: 신입 사원(Kotlin) (2) | 2023.12.13 | 
|---|---|
| 백준 - 주유소(Kotlin) (0) | 2022.09.19 | 
| 백준 - 팰린드롬 만들기(Kotlin) (0) | 2022.08.01 | 
| 백준 - 동전 0 (0) | 2022.05.24 | 
| 17509 And the Winner Is... Ourselves! (0) | 2021.10.29 | 
 
          