본문 바로가기
알고리즘

[Algorithm] 5월 25일 알고리즘 연습

by eigen96 2022. 5. 25.
728x90

Lv. 1 모의고사 - 성공(오래걸림)

복습할 내용 : Collections.sort() 오름차순 정렬

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

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

양쪽에 타입 명시하는 습관 ㄲ

import java.util.*;
import java.io.*;

class Solution {
    
    static int[] result;
    static StringBuilder sb = new StringBuilder();
    //first
    static int[] firstPick = {1,2,3,4,5};
    static int[] secondPick = {2,1,2,3,2,4,2,5};
    static int[] thirdPick = {3,3,1,1,2,2,4,4,5,5};
    //점수
    static int firstPoint = 0;
    static int secondPoint = 0;
    static int thirdPoint = 0;
  
    static int point = 0;
    
    static void pro(int[] answer){
        //각각 답의 길이
        int sizeFirst = firstPick.length;
        int sizeSecond = secondPick.length;
        int sizeThird = thirdPick.length;
        //정답 길이
        int sizeAnswer = answer.length;
        
        int index = 0;
        for(int check : answer){
            //첫번째 답 비교=
            Solution.rec_func(check, firstPick[index % 5]);
            //다음 인덱스가 초기화 필요할 때 초기화
            
            index = index+1;
        }
        //설정초기화
        index = 0;
        firstPoint = point;
        point = 0;
        
        for(int check : answer){
            Solution.rec_func(check, secondPick[index % 8]);
            
            index = index+1;
        }
        index = 0;
        secondPoint = point;
        point = 0;
        //세번째 채점.
        for(int check : answer){
            Solution.rec_func(check, thirdPick[index % 10]);
            index = index+1;
        }
        index = 0;
        thirdPoint = point;
       
        
    }
    
    static void rec_func(int answer, int pick){
       if(answer == pick){ //답이 일치한다면 포인트 증가. 단 나중에 초기화 필요
           point++;
       }else{
           return;
       }
        
    }
    
    
    public int[] solution(int[] answers) {
        
        Solution.pro(answers);
        
        
        
        int[] eachPoint = {firstPoint, secondPoint, thirdPoint};
        ArrayList<Integer> ans = new ArrayList<Integer>();
        int best = 0;
        //best 점수 찾기.
        for(int i = 0; i < 3 ; i++){
            if(best <= eachPoint[i]){
                best = eachPoint[i];
            }
        }
        
        //각 점수를 최고점수와 비교
        //최고 점수를 가지고 있다면 등번호를 추가.
        for(int i = 0 ; i < 3; i++){
            if(eachPoint[i] == best){
                ans.add(i+1);
                
            }
        }
        //[0,0,3] 일때
        
        //Collections.sort(ans);
        //오름차
        
        
        int[] gogo = new int[ans.size()];
        int b = 0;
        for(int i = 0; i < ans.size(); i++){
            gogo[i] = ans.get(i);
            b++;
        }
        
        return gogo;
    }
}

 

참고한 풀이

class Solution {
    public static int[] solution(int[] answers) {
        int[] answer;
        
        int[] a = new int[]{1,2,3,4,5};
        int[] b = new int[]{2,1,2,3,2,4,2,5};
        int[] c = new int[]{3,3,1,1,2,2,4,4,5,5};
        
        int[] score = new int[3];

        // score[]에 수포자별 맞힌 갯수
        for(int i=0; i<answers.length; i++){
            if(answers[i] == a[i%5])  score[0]++; 
            if(answers[i] == b[i%8])  score[1]++;
            if(answers[i] == c[i%10]) score[2]++;
        }
        
        // 가장 높은 점수
        int max = 0;
        for(int i=0; i<3; i++){
            if(score[i] > max){ max = score[i]; }
        }
        
        // 가장 높은 점수를 받은 사람 수
        int maxCount = 0;
        for(int i=0; i<3; i++){
            if(score[i] == max){ maxCount++; } 
        }

        answer = new int[maxCount];
        int idx = 0;
        for(int i=0; i<3; i++){
            if(score[i] == max) answer[idx++] = i+1;
        }
        return answer;
    }
}

 

 

Lv. 1 폰켓몬 - 성공

복습할 내용 : contains()

 

import java.io.*;
import java.util.*;

class Solution {
    
    //종류 수 > N/2 인 상황이라면 N/2가 출력
    //종류 수 < N/2 인 상황이라면 종류 수가 출력
    
    public int solution(int[] nums) {
        
        
        //종류의 수를 체크해야함.
        int numberOfMonster = 0;
        ArrayList<Integer> arr = new ArrayList<Integer>();
        
        for(int a : nums){
            
            boolean isContain = arr.contains(a);
            if(!isContain){ //가지고 있지 않다면 추가.
                arr.add(a);
            }
            
        }
        numberOfMonster = arr.size();
        int pocketNumber = (nums.length)/2;
        int answer = 0;
        
        if(numberOfMonster >= pocketNumber){
            answer = pocketNumber;
        }else {
            answer = numberOfMonster;
        }
        
        
        return answer;
        
        
        
        
    }
}

https://jeleedev.tistory.com/30

 

[프로그래머스] [Level1] 모의고사 - Java

💁‍♀️ 링크 programmers.co.kr/learn/courses/30/lessons/42840 📃 문제 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포..

jeleedev.tistory.com

 

Lv. 1 약수의 개수와 덧셈 - 성공

복습할 내용 :약수 찾기 실수 주의 

import java.io.*;
import java.util.*;

//약수가 짝수개 -> 더하기
//약수가 홀수개 -> 빼기

//해당 숫자의 약수개수 구하기 함수 필요.
// 왼쪽과 오른쪽 사이 숫자들을 배열안에 넣기 필요.
class Solution {
    
    static int count = 0;
    
    public int solution(int left, int right) {
        // 왼쪽과 오른쪽 사이 숫자들을 배열안에 넣기
        int[] array = new int[right - left + 1];
        for(int i = 0; i < right - left + 1 ; i++ ){
            array[i] = left + i;
        }
        
        for(int nums : array){
            //해당 숫자의 약수개수 구하기
            count = count + howMuch(nums);
            
        }
        
        int answer = count;
        return answer;
    }
    
    //약수 개수 찾아서 더하던지 말던지
    public static int howMuch(int num){

        int initNumber = num;
        int yacksuCount = 0;
        int i = 1;
        if(num == 1){
            return -initNumber;
        }
        while(num > 1 && num >= i){
            if(num % i == 0){//나누어진다면 약수 개수 추가.
                //num = num/i; 이거 실수.
                
                yacksuCount++;
                
            }
            i++;
        }
        
        
        if(yacksuCount % 2 == 0){ //약수가 짝수라면
            return initNumber;
        }else{
            //홀수라면
            return -initNumber;
        }
        
    }
    
}

Lv. 1 3진법 뒤집기-실패

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

 

코딩테스트 연습 - 3진법 뒤집기

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이하인 자연수

programmers.co.kr

복습할 내용 :

  • 3진법 만들기 복습
  • NumberFormatException : Integer.parseInt(str) 사용시 주의

728x90

댓글