프로그래머스 문제풀이/알고리즘 (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 공부기록