문제 풀이 (JAVA)

import java.util.*;
class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        int n=nums.length/2; // 최대로 고를수 있는 숫자
        Set<Integer> set= new HashSet<Integer>(); // 중복을 허용하지 않는 HashSet 변수 설정     
        for(int i=0; i<nums.length; i++){
            set.add(nums[i]); // 중복되지 않는 숫자를 Set 변수에 저장
        }
        if(set.size()>n){ // 저장된 숫자가 최대로 고를수 있는 숫자 n보다 크다면
            answer=n; // 최대 숫자 n을 리턴
        }else{ // 저장된 숫자가 최대 숫자 n보다 작다면 
            answer=set.size(); // Set에 저장된 숫자 리턴
        }
        return answer;
    }
}

주요 핵심 포인트

1. n은 최대로 고를수 있는 종류 변수이다.

2. Set은 중복을 허용하지 않기 때문에 중복된 숫자를 제거하여 저장하기 위하여 변수를 생성하였다.

3. Set에 저장된 숫자의 종류가 최대로 고를수 있는 숫자 n보다 크다면 최대로 고를수 있는 숫자는 n개이다.

4. Set에 저장된 숫자가 n보다 작다면 set에 저장된 숫자만큼을 최대 종류로 고를수 있다.

'프로그래머스(JAVA)' 카테고리의 다른 글

완주하지 못한 선수  (0) 2022.05.21
모의고사  (0) 2022.05.21
실패율  (0) 2022.05.21
약수의 개수와 덧셈  (0) 2022.05.21
3진법 뒤집기  (0) 2022.05.21

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

문제 풀이 (JAVA)

import java.util.*;
class Solution {
    public int[] solution(int N, int[] stages) {
        int [] nums = new int[N];
        
        for(int i=0; i<stages.length; i++){
            for(int j=1; j<=N; j++){
                if(j==stages[i]){
                    nums[j-1]++; // 스테이지별 도달한 사용자 수
                }
            }
        }
        HashMap<Integer,Double> falseRate= new HashMap<>(); // 실패율 저장 해시 변수
        int stage= stages.length; // 스테이지 이용 유저 변수 저장.
        for(int i=0; i<nums.length; i++){
            if(stage==0){
                falseRate.put(i,0d);
                continue;
            }
            falseRate.put(i, (double)nums[i]/stage); // 스테이지별 실패율 저장.
            stage=stage-nums[i]; // 스테이지 변수 재정의
        }
        int [] answer=new int[N]; // 결과 출력 변수 선언
        
        for(int i=0; i<N; i++){
            double max=-1;
            int maxKey=0;
            for(int key: falseRate.keySet()){
                if(max<falseRate.get(key)){
                    max=falseRate.get(key); // 해시맵의 최대값을 가져온다.
                    maxKey=key; // 최대값을 가진 key값을 저장.
                }
            }
            answer[i]=maxKey+1; // 최대값을 가진 key 숫자를 출력변수에 저장 +1은 0부터 시작하기 때문
            falseRate.remove(maxKey); // 최대값을 가진 key 변수를 찾아 제거한다.
            // 위 과정을 반복하여 실패율순으로 결과값을 출력한다.
        }
        
        return answer;
    }
}

주요 핵심 포인트

1. 스테이지별 도달한 사용자를 배열로 저장한다.

2. 해시맵 변수를 생성하여 스테이지별 실패율을 계산하여 저장한다.

3. keySet() 함수를 이용하여 키에 해당하는 변수를 가져와 실패율의 최대값과 최대값키를 계산하여 저장 후 해당 키값을 해시맵에서 제거한다.

4. 3번 과정을 반복하여 실패율순으로 출력한다.

리뷰

위 문제는 2019년도 카카오 블라인드 코딩 테스트이다. 필자는 이 문제를 풀지 못하여 다른 사람이 푼 방법을 참고하여 카피코딩하였다. List를 이용해 문제만 풀다보니, HashMap을 사용하여 문제를 푸는것이 익숙하지가 않은 것 같다.

HashMap을 사용하여 푸는 문제를 자주 접해봐야 되겠다는 생각을 하였다.

HashMap의 주요 함수인 put , get , remove 에 조금이나마 익숙하게 되었고, keySet을 사용하여 for문으로 value를 접근하는 것을 또한 공부하게 되었다. 

'프로그래머스(JAVA)' 카테고리의 다른 글

모의고사  (0) 2022.05.21
폰켓몬  (0) 2022.05.21
약수의 개수와 덧셈  (0) 2022.05.21
3진법 뒤집기  (0) 2022.05.21
예산  (0) 2022.05.21

문제 풀이 (JAVA)

class Solution {
    public int solution(int left, int right) {
        int answer = 0; // 결과 출력 변수
        for(int i=left; i<=right; i++){
            int cnt=0; // 약수 카운트 초기화
            for(int j=1; j<=i; j++){ // 1부터 left~right 까지 약수 계산문
                if(i%j==0){ // 임의의 숫자 j로 나눴을때 0이면 약수
                    cnt++; // 약수 카운트 증가
                }
            }
            if(cnt%2==0){ // 약수가 짝수이면
                answer+=i; // 출력값에 더한다.
            }else{ // 약수가 홀수이면
                answer-=i; // 출력값에 뺀다.
            }
        }
        return answer;
    }
}

주요 핵심 포인트

1. left부터 right 숫자 사이 모든 약수를 구하기 위하여 이중 for문을 돌렸다.

2. 나머지 ==0인 숫자는 약수이므로 해당 숫자의 약수카운트를 증가시켰다.

3. 약수카운트가 짝수이면 더하고, 약수카운트가 홀수이면 뺀다.

'프로그래머스(JAVA)' 카테고리의 다른 글

폰켓몬  (0) 2022.05.21
실패율  (0) 2022.05.21
3진법 뒤집기  (0) 2022.05.21
예산  (0) 2022.05.21
두 개 뽑아서 더하기  (0) 2022.05.21

문제 풀이 (JAVA)

class Solution {
    public int solution(int n) {
        int Inum = 0;
        int answer =0;
        String Snum="";
        while(n>0){ // 앞뒤 반전 3진법으로 저장하는 반복문
            Inum=n%3;
            Snum+=Integer.toString(Inum); // 계산된 3진법 나머지 숫자를 문자열로 변환
            n=n/3; // 다음 나눌 숫자를 3으로 나눠 저장한다.
        }
        int j=Snum.length()-1; // 3진법 첫번째 숫자의 제곱을 계산하기 위한 변수 선언.
        for(int i=0;i<Snum.length(); i++){
            // 앞뒤반전 (숫자 3의 n승 * 숫자) 식을 사용하여 10진수로 저장.
            answer+=(int)Math.pow(3,j--)*Character.getNumericValue(Snum.charAt(i));
        }

        return answer;
    }
}

주요 핵심 포인트

1. while문을 사용하여 앞뒤 반전 3진법 수를 문자열로 저장하였다.

2. 3진법 첫번째 숫자의 제곱은 문자열의 길이 - 1 의 규칙을 사용하여 3진법 숫자를 차례대로 10진법 수로 바꾸어 10진법으로 저장하였다.

'프로그래머스(JAVA)' 카테고리의 다른 글

실패율  (0) 2022.05.21
약수의 개수와 덧셈  (0) 2022.05.21
예산  (0) 2022.05.21
두 개 뽑아서 더하기  (0) 2022.05.21
2016년  (0) 2022.05.21

+ Recent posts