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

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

남건욱 2023. 9. 26. 10:19
반응형
63. 겹치는 선분의 길이

문제

class Solution {
    public int solution(int[][] lines) {
        int answer = 0;
        int[] arr = new int[200];
        
        for(int i=0; i<lines.length; i++){
            for(int j = lines[i][0] + 100; j< lines[i][1] + 100; j++){
              arr[j] ++;
            }
            
        }
        for(int i=0; i<200; i++){
            if(arr[i] > 1) answer++;
        }
        return answer;
    }
}

<작성한 코드>

-100 <= a  < b <=100 이기 때문에 200의 길이를 가진 정수형 배열을 하나 만들었다. 그 후 lines의 길이만큼 반복시켰고, 시작점 [i][0]부터 끝점 [i][1]까지의 거리를 구했다. +100을 해준 이유는 음수가 나올 수도 있기 때문에 해줬다. 그리고 그 값을 미리 만들어둔 arr [j]에 넣어줬다. 이렇게 하면 시작점과 끝값에 해당하는 원소가 1 증가한다. 그다음 두 번째 for문에서는 겹치는 부분의 길이를 구한다. arr의 길이만큼 반복해 주고 arr [i]에 해당하는 원소가 1보다 크게 되면 answer++를 해준다. 간단히 말하자면 1부터 200까지의 포인트에 각 선이 지나간 곳에 +1을 해준다. 그리고 만약 2번 이상 지나가서 +2가 되어있다면 겹치는 부분이기 때문에 이것들의 개수만 더해줬다.

 

 

 

64. 유한소수 판별하기

문제

class Solution {
    public int solution(int a, int b) {
        int answer = 0;
        int gcd = gcd(a,b);
        b /= gcd;
        
        while(b%2 == 0){
            b /= 2;
        }
        
        while(b%5 == 0){
            b /= 5;
        }
        
        if(b == 1) answer = 1;
        else answer = 2;

        return answer;      
    }
    
    public int gcd(int a, int b){
        while(b!=0){
            int temp = a % b;
            a = b;
            b = temp;
        }
        return a;
    }
}

<작성한 코드>

gcd는 원래 최대공약수를 구하는 함수이다. 직접 구현해 봤다. 유클리드? 호제법을 쓰면 a, b의 최대공약수는 b, a%3이다. 원래 b를 넣었던 자리에 0이 들어가게 되면 그 왼쪽에 있는 값이 최대공약수다. 이렇게 gcd 함수를 구현했다. 그리고 변수 gcd에 a, b의 최대공약수를 넣어줬다. 이 상태로 b에는 b / 최대공약수를 해준 뒤 넣어주었다. 그다음 아래 2개의 while문으로 b가 2,5로 나누어 떨어질 때 나눠줘서 b의 값을 1로 설정했다. 만약 1이 아니라면 answer에는 2를 넣어주고 반환했다.

 

 

 

65. 특이한 정렬

문제

import java.util.*;

class Solution {
    public int[] solution(int[] numlist, int n) {
        int[] answer = new int[numlist.length];
        Integer[] result = new Integer[numlist.length];
        
        for(int i=0; i<numlist.length; i++){
            result[i] =  numlist[i] - n;
        }
        
        Arrays.sort(result, new Comparator<Integer>(){
            @Override
            public int compare(Integer a, Integer b){
                int A = Math.abs(a);
                int B = Math.abs(b);
                
                if(A == B){
                    return b - a;
                }
                return A - B;
            }
        });
        
        for(int i=0; i<result.length; i++){
            answer[i] = result[i] + n;
        }
        
        
        return answer;
    }
}

<작성한 코드>

numlist의 길이와 같은 크기를 가진 result배열을 생성했다. 그 후 for문으로 result배열 안에 각원소에서 n을 빼줬다. 그 뒤 Arrays.sort를 사용하여 result을 정렬했다. 그 후 a, b의 절댓값을 A, B에 저장하였다. 만약 절댓값이 같으면 큰 수를 반환하도록 했다. 그 뒤 값을 반환하기 위해 아까 기존값에 n을 더해줬으니 다시 -n을 해주고 배열을 반환하였다.

 

 

 

66. 등수 매기기

문제

import java.util.*;

class Solution {
    public int[] solution(int[][] score) {
        int[] result = new int[score.length];
        int[] answer = new int[score.length];
        
        for(int i=0; i<score.length; i++){
            int sum = 0;
            for(int j=0; j<score[i].length; j++){
                sum += score[i][j];
            }
            result[i] = sum;
        }
        
        for(int i=0; i<result.length; i++){
            int rank = 1;
            for(int j=0; j<result.length; j++){
                if(result[i] < result[j]){
                    rank++;
                }
            }
            answer[i] = rank;
        }
        
        return answer;
    }
}

<작성한 코드>

result배열을 생성해서 각 점수의 합을 넣어줬다. 평균을 구하려면 나눠야하지만 어차피 합으로 순위를 구하나 평균으로 순위를 구하나 예외사항은 없다고 생각돼서 결정했다. 합을 result 배열에 차례로 넣어준 뒤 두 번째 중첩 for문에서 순위를 정해줬다. rank값을 1로 정해두고 자신보다 큰 수가 있으면 1씩 더해줬다. 그 뒤 answer배열에 rank값을 넣어줘서 반환했다.

 

67. 로그인 성공?

문제

class Solution {
    public String solution(String[] id_pw, String[][] db) {
        String answer = "";
        
        for(int i=0; i<db.length; i++){
            if(id_pw[0].equals(db[i][0]) && id_pw[1].equals(db[i][1])){
                return "login";
            }
        }
        
        for(int i=0; i<db.length; i++){
            if(id_pw[0].equals(db[i][0])){
                return "wrong pw";
            }
        }
        
        for(int i=0; i<db.length; i++){
            if(id_pw[1].equals(db[i][1])){
                return "fail";
            }
        }
        
        return answer;
    }
}

<작성한 코드>

id_pw의 [0]번쨰엔 id가 들어있고 [1] 번째에는 비밀번호가 들어있다. 때문에 첫 번째 for문에서는 id_pw배열 안의 id값과 db의 id값이 일치하는지 찾는다. 또한 일치하면서 pw값까지 같다면 login을 반환해 줬다. 두 번째 for문에서는 id_pw의 첫 번째 값만 확인해 줬다. 바로 return을 안 해줬다면 중복돼서 걸렸겠지만 이미 위에서 return 해줬기 때문에 여기서는 아이디, 비밀번호가 둘 다 일치하는 경우가 없다. 따라서 아이디가 일치하는 게 있으면 wrong pw를 반환해 줬다. 세 번째 for문은 사실 생략하고 초기에 answer에 fail을 선언해 줘도 됐었다. 그래도 나는 일단 작성해 봤다. 생각보다 간단했다.

 

 

68. 치킨 쿠폰

문제

class Solution {
    public int solution(int chicken) {
        int answer = 0;
        
        while(chicken >= 10){
            int addChicken = chicken / 10;
            int leftChicken = chicken % 10;
            chicken = addChicken + leftChicken;
            
            answer += addChicken;
        }
        
        return answer;
    }
}

<작성한 코드>

처음에는 for문으로 시도했는데 for문을 무진장 반복해야 끝날 거 같다고 느꼈다. 그래서 빠르게 while문으로 변경했다. 조건은 치킨값이 10마리 이상이면 실행되도록 했다. addchicken에는 초기 서비스 치킨값을 넣어줬다. 그리고 leftChicken에는 10으로 나누고 남은 치킨의 마릿수를 저장했다. 그 뒤 chicken에 서비스 치킨 + 남은 마릿수를 해주고 answer에는 addChicken값만 반복해서 넣어줬다. 풀고 나니 간단해 보이지만 생각하는데 꽤 걸렸다.

반응형
프로필사진

남건욱's 공부기록