프로그래머스 문제풀이/알고리즘 (JAVA)

[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 1 (64~68번 문제풀이) / Level 0 (224/224)

남건욱 2023. 11. 13. 10:52

목차

    반응형
    64. 기사단원의 무기

    문제

    class Solution {
        public int solution(int number, int limit, int power) {
            int answer = 0;
            
            for(int i=1; i<=number; i++){
                int cnt = 0;
                for(int j=1; j*j<=i; j++){
                    if(j*j == i) cnt++;
                    else if(i%j == 0) cnt+=2;
                }
                
                if(cnt > limit) cnt = power;
                answer += cnt;
            }
            
            return answer;
        }
    }

    <작성한 코드>

    간단한 문제였지만 약수 구하는 부분에서 시간복잡도를 생각해야 되는 문제였다. 반복문을 사용해서 i의 약수를 구하기 위해 약수 개수를 저장할 정수형 변수 cnt를 선언했다. 그 뒤 for문을 사용해서 j는 1부터 j의 제곱근이 i보다 크지 않을 때까지 반복시켰다. 그 뒤 if문을 사용해서 제곱근이 i와 같으면 cnt를 1 증가시키고, i% j의 나머지가 0이라면 cnt에는 2를 증가시켰다. 2를 증가시킨 이유는 한쌍이기 때문이다. j와 num/j가 약수로 추가된다.

     

     

     

    65. 명예의 전당(1)

    문제

    import java.util.*;
    
    class Solution {
        public int[] solution(int k, int[] score) {
            int[] answer = new int[score.length];
            List<Integer> list = new ArrayList<>();
            
            for(int i=0; i<score.length; i++){
                list.add(score[i]);
                Collections.sort(list, Collections.reverseOrder());
                
                if(i < k-1){
                    answer[i] = list.get(list.size()-1);
                } else{
                    answer[i] = list.get(k-1);
                }
            }
            
            return answer;
        }
    }

    <작성한 코드>

    간단한 문제였다. answer의 길이는 score의 길이와 동일하게 선언해 주고 반복문을 score의 길이만큼 돌렸다. list에 score의 값을 차례대로 넣은 뒤 Collections.sort를 사용해서 오름차순으로 정렬 후 Collections.reverseOrder()를 사용해서 역순으로 정렬해 줬다. 내림차순으로 정렬된 list를 가지고 if문을 사용해서 조건을 걸었다. 만약 i가 명예의 전당이 꽉 차기 전이라면 list에서 제일 작은 수인 마지막숫자를 가져와서 answer에 더한다. 만약 명예의 전당이 꽉 찼다면 k-1번째가 명예의 전당의 수중 제일 작은 수일테니 list.get(k-1) 값을 answer [i]에 넣어줬다. 그 뒤 answer을 반환하였다.

     

     

     

    66. 문자열 나누기

    문제

    class Solution {
        public int solution(String s) {
            int answer = 1;
            
            char ch = s.charAt(0);
            int cnt = 1;
            
            for(int i=1; i<s.length(); i++){
                if(cnt == 0){
                    answer++;
                    ch = s.charAt(i);
                }
                
                if(ch == s.charAt(i)){
                    cnt++;
                } else{
                    cnt--;
                }
            }
            
            return answer;
        }
    }

    <작성한 코드>

    answer을 1로 잡고 시작하였다. 이유는 첫 글자가 시작할때부터 이미 1개의 문자열로 생각하려 했기 때문이다. 그 뒤 ch에 s의 첫 글자를 넣어주고 cnt에는 1로 초기화를 해줬다. 그 뒤 for문으로 s의 길이만큼 반복해 줬다. for문 내의 if문중 두 번째 if문부터 설명하자면 기존에 선언해 둔 ch가 i번째 문자와 같으면 cnt를 더하고, 같지 않다면 cnt를 빼준다. 이렇게 해서 cnt가 0이 된다면 answer에 1을 더해주고 ch를 새로운 i번째 문자로 초기화해 줬다. 그 뒤 answer의 값을 반환해 줬다.

     

     

     

    67. 가장 가까운 같은 글자

    문제

    import java.util.*;
    
    class Solution {
        public int[] solution(String s) {
            int[] answer = new int[s.length()];
            Map<Character, Integer> map = new HashMap<>();
            
            for(int i=0; i<s.length(); i++){
                char ch = s.charAt(i);
                if(!map.containsKey(ch)){
                    answer[i] = -1;
                    map.put(ch, i);
                } else{
                    answer[i] = i - map.get(ch);
                    map.put(ch, i);
                }
            }
            
            return answer;
        }
    }

    <작성한 코드>

    간단한 문제였다. 우선 HashMap을 하나 만들어줬다. key값은 문자, 벨류값은 정수형으로 선언해 줬고 그 뒤 for문을 사용해서 s의 길이만큼 반복해 줬다. char형 변수 ch에 s의 i번째 글자를 초기화해준 뒤, 만약 map안에 ch를 키로 갖는 값이 없으면 answer에는 -1을 넣고 ch를 키값으로 인덱스값인 i를 넣어줬다. 만약 map에 ch를 키로 갖는 값이 있다면 answer에는 현재 인덱스인 i값에서 map에 들어있는 값을 빼줌값을 넣어줬고 키값인 ch에 현재 인덱스값인 i를 넣어줬다. 그 뒤 answer을 반환하였다.

     

     

     

    68. 크기가 작은 부분 문자열

    문제

    class Solution {
        public int solution(String t, String p) {
            int answer = 0;
            int num = p.length();
            
            for(int i=0; i<=t.length()-num; i++){
                String result = t.substring(i, i+num);
                
                if(Long.parseLong(p) >= Long.parseLong(result)){
                    answer++;
                }
            }
            
            return answer;
        }
    }

    <작성한 코드>

    간단한 문제였다. 정수형 변수 num에 p의 길이를 초기화해 줬다. 그 뒤 for문을 사용해서 t의 길이에서 num을 뺀 값까지 반복시켰고 문자열 변수 result에는 문자열 t에서 i번째부터 i+num번째의 문자까지 잘라서 저장해 줬다. 그리고 Long.parseLong()을 사용해서 long형으로 p와 result를 변환시킨 뒤 p의 값이 result보다 크거나 같으면 answer에 1을 더해줬다. 그 뒤 answer을 반환하였다.

    반응형
    프로필사진

    남건욱's 공부기록