본문 바로가기
Algorithm Study/Programmers

[프로그래머스] 소수찾기 / 의상 (Java)

by HanaV 2023. 6. 26.
728x90

1. 소수찾기

코딩테스트 연습 - 소수 찾기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

makeNumbers 함수 작동 원리

import java.util.*;

class Solution {
    
    HashSet<Integer> madeNumbers = new HashSet<>(); //숫자카드로 만든 숫자조합 담을 HashSet
    int answer = 0;
    
    public int solution(String numbers) {

        //1. 문자열을 하나씩 배열에 넣기
        String[] numbersArrayString = numbers.split("");
                //test
                /*for (int s : numbersArrayString) {
                    System.out.println(s);
                }*/
        int length = numbersArrayString.length; //숫자카드 개수
        boolean[] checked = new boolean[length]; //카드가 사용됐는지 체크용, 기본 false
        
        //2. 문자형 배열을 int형 배열로 변환
        int[] numbersArray = new int[length];
        for (int i = 0; i < length; i++) {
            numbersArray[i] = Integer.parseInt(numbersArrayString[i]);
        }

        //5. 카드를 한장씩 함수에 넣어줌
        for (int i=0; i<length; i++) {
            checked[i] = true; //처음 넣어준 카드를 checked 해주고
            makeNumber(checked, numbersArray[i], numbersArray); //조합기에 돌림
            checked[i] = false; //1을 다 넣고 7을 넣을 때 1의 checked를 다시 풀어줌
        }
        
                //HashSet 출력
                /*Iterator<Integer> iterSet = madeNumbers.iterator();
                while(iterSet.hasNext()) {
                    System.out.println(iterSet.next());
                }
                System.out.println("size:" + madeNumbers.size());*/

        //6. HashSet의 원소 하나하나를 isPrime에 넣어서 확인 -- 근데 1, 0 제외해야함
        Iterator<Integer> checkIsPrime = madeNumbers.iterator();
        while(checkIsPrime.hasNext()) {
            //System.out.println("checkIsPrime.next +1 is " + checkIsPrime.next() + 1);
            int currentNum = checkIsPrime.next();
            if(currentNum > 1) {
                int isItPrimeNum = isPrime(currentNum);
                if (isItPrimeNum == 1) {
                    answer ++;
                }
            }
            currentNum = 0;
        }
        
        //test
        /*Iterator<Integer> iterSet = primeNumbers.iterator();
                while(iterSet.hasNext()) {
                    System.out.println(iterSet.next());
        }*/

        return answer;
    }
    
    //3. 소수판별 함수 만들기
    public int isPrime(int n) {
        //System.out.println("prime func :" + n);
        for (int i = 2; i<=(int)Math.sqrt(n); i++) {
          if (n % i == 0) {
              return 0;
          }
        }
        return 1;
    }
    
    //4. 숫자카드 조합 만드는 함수 만들기
    public void makeNumber(boolean[] checked, int number, int[] numbersArray) { //이전에 조합한 숫자: result
        madeNumbers.add(number); //HashSet에 추가
        for (int i=0; i<numbersArray.length; i++) {
            if(!checked[i]) { //사용되지 않은 숫자카드가 있으면
                checked[i] = true; //그 카드를 맨 뒤에 붙여주고 true로 바꿈
                makeNumber(checked, number*10 + numbersArray[i], numbersArray);
                checked[i] =false; //그 카드를 넣고 다 돌렸으면 다시 checked를 풀어줌
            }
        }
        
    }
    
}

 

 

2. 의상

코딩테스트 연습 - 의상 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        
        /*필요한 정보
        의상종류를 a, b, c ...x 라 두고
        각 종류의 개수를 a1, a2, a3 ... an 총 n개라 두면
        총 가지 수는
        (na+1)(nb+1)(nc+1) ... (nx+1) - 1 
        이때 -1은 전부 다 안입었을 경우
        즉 우리가 필요한 정보는 의상 종류의 수, 각 종류의 개수
        */
        
        //1. 의상의 종류와 개수를 담을 배열 생성 (의상 종류, 의상 개수)
        HashMap<String, Integer> map = new HashMap<>();
        
        //2. map 채워넣기
        for (int i = 0; i < clothes.length; i++) {
            //clothKind[i] = clothes[i][1];
            //처음 넣는 종류면
            if (map.get(clothes[i][1]) == null) {
                map.put(clothes[i][1], 1); //1개 새로 넣어줌
            }
            //이미 있는 종류면
            else if (map.get(clothes[i][1]) != null) {
                int x = map.get(clothes[i][1]);
                map.put(clothes[i][1], x+1); //+1
            }
        }

        //3. 의상 종류만 담은 배열 만들기 (중복 안되게)
        HashSet<String> hash = new HashSet<>();
        for (int i=0; i<clothes.length; i++) {
            hash.add(clothes[i][1]);
        } //중복 없애기 위해서 HashSet에 담아서 없애고 ..
        String[] array = hash.toArray(new String[hash.size()]); //인덱스로 불러오기 위해서 배열로 변환

        //System.out.println(Arrays.toString(array));
        //4.  각 종류의 개수 + 1 씩 곱해줌
        int answer = 1;
        for (int i = 0; i < map.size(); i++) {
            answer *= (map.get(array[i])+1);
        }  
        
        return answer -1 ;
    }
}
728x90

"); wcs_do();