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

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

남건욱 2023. 11. 6. 11:28
반응형
46. 신규 아이디 추천

문제

class Solution {
    public String solution(String new_id) {
        String answer = "";
        
        // 1단계
        String step1 = new_id.toLowerCase();
        
        // 2단계
        String step2 = "";
        for(int i=0; i<step1.length(); i++){
            char ch = step1.charAt(i);
            if(ch == '-' || ch == '_' || ch == '.' || (ch >= '0' && ch <= '9') || 
              (ch >= 'a' && ch <= 'z')){
                step2 += ch;
            }
        }
        
        // 3단계
        String step3 = "";
        for(int i=0; i<step2.length(); i++){
            char ch = step2.charAt(i);
            
            if(ch == '.' && !step3.isEmpty() && step3.charAt(step3.length() -1) == '.'){
                continue;
            }
            
            step3 += ch;
        }
        
        // 4단계
        String step4 = step3;
        if(step4.startsWith(".")){
            step4 = step4.substring(1);
        }
        
        if(step4.endsWith(".")){
            step4 = step4.substring(0, step4.length() - 1);
        }
        
        // 5단계
        String step5 = "";
        if(step4.isEmpty()){
            step5 += "a";
        } else{
            step5 = step4;
        }
        
        // 6단계
        String step6 = "";
        if(step5.length() >= 16){
            step6 = step5.substring(0, 15);
        } else{
            step6 = step5;
        }
        
        if(step6.endsWith(".")){
            step6 = step6.substring(0, step6.length() - 1);
        }
        
        // 7단계
        String step7 = step6;
        while(step7.length() <= 2){
            char ch = step7.charAt(step7.length() - 1);
            step7 += ch;
        }
        
        answer = step7;
        
        
        return answer;
    }
}

<작성한 코드>

1단계는 모든 대문자를 소문자로 치환하면 된다. 그래서 toLowerCase()를 사용해서 대문자들을 소문자로 변경해 줬다.

 

2단계는 알파벳 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자를 제거해야 한다. 따라서 for문으로 모든 원소를 비교하였고 if를 사용해서 위의 범위 안에 포함될 때만 step2에 각 문자를 넣어줬다.

 

3단계는 마침표가 2번 이상 연속되면 하나의 마침표로 치환하면 된다. for문을 사용해서 step2의 길이만큼 반복해 줬고 각각 문자를 ch에 저장했다. 만약 ch가.이고 step3이 비어있지 않으며 step3의 마지막 원소가. 이면 step3에 ch를 더해주지 않고 continue를 해줘서 반복문을 다시 실행시킨다. 만약 여기에 걸리지 않는다면 step3에 ch를 더해준다.

 

4단계는 마침표가 처음이나 끝에 위치하면 제거해 주면 됐다. startsWith(), endsWith()를 사용해서 시작과 끝에 마침표가 들어가는지 체크해 줬다. 만약 처음에 들어간다면 substring을 사용해서 1번째 문자부터 끝까지 step4에 저장해 줬고, 끝에 들어간다면 마지막 문자열을 제외시키기 위해 substring을 사용해서 0번째 문자부터 마지막 이전문자까지 step4에 저장해 줬다.

 

5단계는 new_id가 빈 문자열이라면 new_id에 a를 대입하는 것이다. 간단했다. isEmpty()를 사용해서 빈 문자열인지 체크하고 빈 문자열이라면 a를 더해줬고 아니라면 step4를 step5에 대입해 줬다.

 

6단계는 new_id의 길이가 16자 이상이라면 15자까지만 저장하고 마침표가 마지막에 온다면 마지막 마침표를 제거하는 것이다. if문을 사용해서 step5의 길이가 16 이상이라면 step5를 substring을 사용해서 15글자만 step6에 넣어줬다. 만약 아니라면 step6에는 step5를 그대로 넣어줬다. 그 아래 if에서는 step6의 마지막 문자가 마침표이면 substring을 사용해서 마지막 문자를 잘라줬다.

 

7단계는 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해 주면 됐다. while문을 사용해서 step7의 길이가 2 이하라면 반복하게 했다. char형 변수 ch에 step7의 마지막 원소를 넣어주고, step7에 ch를 계속 더해줬다. 

 

이후 answer에 step7을 넣고 반환해 줬다.

 

 

 

 

47. 음양 더하기

문제

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        
        for(int i=0; i<absolutes.length; i++){
            if(signs[i]){
                answer += absolutes[i];
            } else if(!signs[i]){
                answer -= absolutes[i];
            }
        }
        
        return answer;
    }
}

<작성한 코드>

간단한 문제였다. absolutes의 길이만큼 반복해 주고, 그 순서에 맞는 signs가 참이면 answer에 그 수를 더해주고, 거짓이라면 answer에 그 수를 빼줬다. 그 뒤 answer를 반환하였다.

 

 

 

48. 로또의 최고 순위와 최저 순위

문제

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        int equals = 0;
        
        // 최저
        for(int i=0; i<lottos.length; i++){
            for(int j=0; j<win_nums.length; j++){
                if(lottos[i] == win_nums[j]){
                    equals++;
                    break;
                }
            }
        }
        if(equals == 0){
            answer[1] = 6;
        } else{
            answer[1] = 7 - equals;
        }
        
        
        // 최고
        for(int i=0; i<lottos.length; i++){
            if(lottos[i] == 0){
                equals++;
            }
        }
        
        if(equals == 0){
            answer[0] = 6;
        } else{
            answer[0] = 7 - equals; 
        }
        
        return answer;
    }
}

<작성한 코드>

생각보다 간단한 문제였다. 먼저 최저를 구했다. lottos의 값과 win_nums의 값이 일치하는 게 있다면 정수형 변수 equals에 1을 더해주고 반복문을 종료하였다. 이렇게 하면 로또 번호가 일치하는 개수가 나온다. 7에서 맞춘 개수를 뺴주면 된다. 하지만 6등까지만 존재하니 0개를 맞췄을 때는 6등을 넣어준다. 0개가 아닐 때는 7에서 equals의 개수를 빼주고 answer [1]에 넣어줬다. 다음 최고를 구하는 방법은 기존 equals에 lottos의 수가 0인만큼 더해줬다. 그렇게 되면 0이 들어간 번호도 다 로또번호와 일치한다고 가정이 되며 최고의 경우가 나올 것이다. 이도 마찬가지로 equals이 0이라면 6등을 넣어주고, 아니라면 7에서 equals을 빼고 answer [0]에 넣어줬다. 그 뒤 answer을 반환하였다.

 

 

 

49. 약수의 개수와 덧셈

문제

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        
        for(int i=left; i<=right; i++){
            int num = numsCnt(i);
            if(num%2 == 0){
                answer += i;
            } else{
                answer -= i;
            }     
        }
        
        return answer;
    }
    
    
    
    public int numsCnt(int num){
        int result = 0;
        
        for(int i=1; i<=num; i++){
            if(num%i == 0){
                result++;
            }
        }
        
        return result;
    }
    
}

<작성한 코드>

간단한 문제였다. 먼저 약수를 구하는 numsCnt를 하나 만들어주고 반복문을 시작했다. 반복문에서는 left부터 right까지 반복하였으며 num에 약수의 개수를 담아줬다. 그 뒤 약수의 개수가 짝수이면 answer에 i를 더해주고, 홀수이면 answer에 i를 빼줬다. 그 뒤 answer를 반환하였다.

 

 

 

50. 숫자 문자열과 영단어

문제

class Solution {
    public int solution(String s) {
        int answer = 0;
        String[] words = {"zero", "one", "two", "three", "four", "five", "six", "seven"
                          ,"eight", "nine"};
        
        for(int i=0; i<words.length; i++){
            s = s.replaceAll(words[i], String.valueOf(i));
        }
        
        answer = Integer.parseInt(s);
        
        return answer;
    }
}

<작성한 코드>

간단한 문제였다. zero부터 nine까지 문자열 배열을 만들어준 뒤 words의 길이만큼 반복했다. replaceAll을 사용해서 words에 포함된 단어를 만날 때마다 i를 string형태로 변환시켜서 s 내부의 값을 바꾸고 저장시켰다. i는 0부터 시작하므로 순서와 일치하게 만들어서 2차원 배열로 사용하지 않고 1차원으로 해결되었다. 그 뒤 answer에 s를 정수형으로 변환시켜 값을 대입하고 반환하였다.

 

 

 

51. 부족한 금액 계산하기

문제

class Solution {
    public long solution(int price, int money, int count) {
        long answer = 0;
        long total = 0;
        
        for(int i=1; i<=count; i++){
            total +=  price*i;
        }

        if(total > money){
            answer = total - money;
        } else{
            answer = 0;
        }

        return answer;
    }
}

<작성한 코드>

간단한 문제였다. total에 price*횟수만큼 반복해서 넣어주면 총기구를 count번 탈 때의 가격이 나온다. 그 뒤 if문을 사용해서 total가격이 가지고 있는 money보다 크다면 answer에 total-money를 넣어주고, 충분하다면 answer에 0을 넣어주고 answer을 반환했다.

 

 

 

52. 없는 숫자 더하기

문제

class Solution {
    public int solution(int[] numbers) {
        int answer = 45;
        
        for(int i=0; i<numbers.length; i++){
            answer -= numbers[i];
        }
        
        return answer;
    }
}

<작성한 코드>

간단한 문제였다. 0~9까지는 한 번만 나오고 중복수는 없다고 했다. 따라서 총 0~9의 합을 구해줬다. 그 뒤 answer에 45를 저장하고 numbers를 반복문으로 돌리면서 값들을 45에서 빼주고 남은 answer의 값을 반환하였다.

반응형
프로필사진

남건욱's 공부기록