알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

코딩테스트 연습 - 나누어 떨어지는 숫자 배열

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하

programmers.co.kr


Think🤔

나눠서 오름차순 후 정답 구하는 문제


Solution✍
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        ArrayList<Integer> tmp = new ArrayList(); // ArrayList로 만들고 옮기기
        
        for(int i=0; i<arr.length; i++){
            if(arr[i] % divisor == 0){
                tmp.add(arr[i]);
            }
        }
        
        int answer[] = new int[tmp.size()];
        
        if(tmp.size() == 0){
            return new int[]{-1};
        }else{
            Collections.sort(tmp);
            for(int i=0; i<tmp.size(); i++){
                answer[i] = tmp.get(i);
            }
        }
        
        return answer;
    }
}

ArrayList를 사용하지 않는다면 int 타입 배열의 크기를 잘 설정해야됨..

return new int[]{-1}; 을 이용해서 바로 배열을 리턴할 수 있음


Review🤩

한 줄 코드 스트림 참조

import java.util.Arrays;
import java.util.Collections;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = Arrays.stream(arr).sorted().filter(factor -> factor % divisor == 0).toArray();
        if(answer.length == 0){
        	answer = new int[] {-1};
        }else{
        	return answer;
        }
    }
}

전 정답은 정렬이 안되어 있어서 정렬 부분을 추가시켜줬다.

stream() 메서드 뒤에 sorted() 메서드를 추가 시킨 후 람다를 사용하면 된다.

.count()가 스트림의 사이즈나 길이를 재주는건데 중간에 삽입해봤는데 에러떠서 length를 비교하는 방법 사용


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr


Think🤔

문제 이해

마라톤 선수 1 ~ 100,000명

마라톤 선수 참여 이름 participant 

완주한 이름 배열        completion

동명이인 ok , 참가자 이름 1~20 소문자

 

참여자에 있고 , 완주자 명단에 없으면 return 

 

문제가 해시니깐 해시로 풀어본다.

 

Map에는 iterator가 없다.

Map의 iterator를 가져오려면 keySet() , entrySet() , values()를 호출해서 가져와야 한다.

 

엔트리는 <키,밸류>를 쌍으로 묶는 것

한 쌍을 엔트리라고 한다.

 

고로 이터레이터를 이용해서 컬렉션을 읽어야 하는데 , Map은 컬렉션프레임워크가 아니여서

엔트리 셋으로 키랑 밸류를 가져와서 iterator를 만들어주고

순서대로 넣은 iter의 다음값을 entry 변수를 만들어줘서, 엔트리의 밸류값이 0이라면

그 값의 키 값을 answer에 담아서 break(찾았으니깐 더 볼 것 없이 종료) 해서 return을 해주면 된다.


Solution✍
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
         
        HashMap<String, Integer> hs = new HashMap<String,Integer>();
        
        for(String pars : participant){
            hs.put(pars,hs.getOrDefault(pars,0)+1);
        }
        
        for(String comps : completion){
            hs.put(comps,hs.get(comps)-1);
        }
        
        Iterator<Map.Entry<String,Integer>> iter = hs.entrySet().iterator();
        while(iter.hasNext()){
            Map.Entry<String,Integer> entry = iter.next();
            if(entry.getValue() != 0){
                answer = entry.getKey();
                break;
            }
        }
        
        return answer;
    }
}

Review🤩

참조 영상 https://www.youtube.com/watch?v=7qV5nJ39Lqw 


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

코딩테스트 연습 - 나머지가 1이 되는 수 찾기

자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다. 제한사항 입

programmers.co.kr

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

 

코딩테스트 연습 - 같은 숫자는 싫어

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은

programmers.co.kr


Think🤔

1. 나눈 수가 1이 되는 데 제일 작은 것

2. 같은 숫자 나오면 하나만 저장 되게하는 문제

ArrayList 없이 처음에 배열을 생성하려니깐 배열의 크기 값을 모르기 때문에

먼저, 중복된 값이 없는 tmpArr 을 만들고 , 그것을 배열로 옮겨 담아서 리턴해준다.


Solution✍
class Solution {
    public int solution(int n) {
        int answer = n;
        
        for(int i=1; i<=n; i++){
            if(n % i == 1){
                answer = Math.min(answer, i);
            }
        }
        
        return answer;
    }
}
import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        ArrayList<Integer> tmpArr = new ArrayList();
        
        int saveNum = Integer.MIN_VALUE;
        for(int i=0; i<arr.length; i++){
            if(arr[i] != saveNum){
                saveNum = arr[i];
                tmpArr.add(arr[i]);
            }
        }
        
        int[] answer = new int[tmpArr.size()];
        
        for(int i=0; i<answer.length; i++){
            answer[i] = tmpArr.get(i);
        }
        
        return answer;
    }
}

Review🤩

호오잇!


 

'Algorithm' 카테고리의 다른 글

[프로그래머스] 나누어 떨어지는 숫자 배열  (0) 2022.05.06
[프로그래머스] 완주하지 못한 선수  (0) 2022.03.16
[백준] 추월  (0) 2022.03.08
[백준] 연속부분최대곱  (0) 2022.03.01
[백준] 설탕 배달  (0) 2022.02.28
알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://www.acmicpc.net/problem/2002

 

2002번: 추월

입력은 총 2N+1개의 줄로 이루어져 있다. 첫 줄에는 차의 대수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 대근이가 적은 차량 번호 목록이 주어지고, N+2째 줄부터 N개의 줄에는 영식이

www.acmicpc.net


Think🤔

실버 1

첫 번째 줄에 차가 몇 대인지 주어진다.

먼저, 소문난 명콤비의 대근이는 차가 들어가는 순서대로

       소문난 명콤비의 2인자 영식이는 차가 나오는 순서대로 적었다.

 

터널을 나왔을 때, 몇개의 차가 추월했는지 계산하는 문제이다.

 

차번호는 영어 대문자 , 숫자로 주어지고 6~8글자 이내이다.

 

규칙을 찾아보자..

 

ZG50 1

PU30 2

RI60  3

ZG20 4

ZG23 5

 

PU30 1

ZG23 2

ZG20 3

ZG50 4

RI60  5

 

들어간 대근이가 적은 차 번호의 값이 더 컸을 때, 추월한 차량을 구할 수 있다.

반복문을 돌리고 맨 마지막 차량 번호에 들어간 인덱스 값을 넣는다.

 

해쉬값으로 번호를 줘도 된다.

그리고 같은 value값을 비교해서 대근이의 key가 높으면 반환시키면 된다.

package back22y03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

public class overTake {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int carCnt = Integer.parseInt(bf.readLine());
		
		HashMap<String, Integer> inputCar = new HashMap();
		HashMap<String, Integer> outputCar = new HashMap();
		
		//대근이와 영식이 값 넣어주기
		for(int i=0; i<carCnt; i++) {
			String carNum = bf.readLine();
			inputCar.put(carNum, i+1);
		}
		for(int i=0; i<carCnt; i++) {
			String carNum = bf.readLine();
			outputCar.put(carNum, i+1);
		}
		
		int answer = 0; // 정답
		
		for(Entry<String, Integer> entry : inputCar.entrySet()) {
			entry.getValue();
			System.out.println(entry.getValue());
		}
		
	}

}

코드를 다 작성하지 못했지만, 2중 for문으로 entry set해서 받으면 받을 수 있다..

 


Solution✍
package back22y03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;

public class overTake {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int carCnt = Integer.parseInt(bf.readLine());
		int answer = 0; // 정답
		HashMap<String, Integer> map = new HashMap();
		
		for(int i=0; i<carCnt; i++) {
			String inputCar = bf.readLine();
			map.put(inputCar, i);
		}
		
		int[] outputCar = new int[carCnt];
		
		for(int i=0; i<carCnt; i++) {
			String input = bf.readLine();
			outputCar[i] = map.get(input); //들어갔던 차, 몇번째 들어갔는지 outputCar에 담아준다
		}
		System.out.println(map);
		System.out.println(Arrays.toString(outputCar));
		
		for(int i=0; i<carCnt; i++) {
			for(int j=i+1; j<carCnt; j++) { // 이미 나간 차 비교 할 필요 없음
				if(outputCar[i] > outputCar[j]) { //들어갔던차가 먼저 들어간 차 보다 빨리 나왔으면
					answer++;	// 증가시키고 
					break;		// 끝내고 다음 차 비교한다.
				}
			}
		}
		System.out.println(answer);
	}

}

Review🤩

Set으로 밸류값 두개 다 받아서 같은 키값의 value를 비교해서 먼저 들어간 차의 value가 높으면 구할 수 있는 방법

HashMap을 두개 안쓰더라도 get을 이용해서 같은 차가 들어간 순위를 배열을 이용해서 넣어줘서 구할 수 있는 문제..

구글 답안 참조...!!


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://www.acmicpc.net/problem/2670

 

2670번: 연속부분최대곱

첫째 줄은 나열된 양의 실수들의 개수 N이 주어지고, 그 다음 줄부터 N개의 수가 한 줄에 하나씩 들어 있다. N은 10,000 이하의 자연수이다. 실수는 소수점 첫째자리까지 주어지며, 0.0보다 크거나

www.acmicpc.net


Think🤔

처음에 받을 숫자를 입력하고 , 그 다음 소수점 숫자들을 받는다.

숫자들 중에서 연속적인 숫자 값이 제일 크면 그 값이 답이 되고, 소수점 셋째 자리까지 출력하고 리턴하면 되는 문제.


Solution✍
package back22y03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class seqNumber {
	
	// double을 바꿔주는 dStr
	public static double dStr(String str) {
		return Double.parseDouble(str);
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		int num = Integer.parseInt(bf.readLine());
		
		double[] dArr = new double[num];
		for(int i=0; i<num; i++) {
			dArr[i] = dStr(bf.readLine());
		}
		
		double max = dArr[0];
		
		for(int i=1; i<num; i++) {
			dArr[i] = Math.max(dArr[i], dArr[i-1] * dArr[i]);
			max = Math.max(max,dArr[i]);
		}
		
		System.out.printf("%.3f", max);
	}

}

double을 바꿔주는 dStr을 만들어주고 , Double.parseDouble(str)로 리턴해준다.

 

두 번째 반복문은, dArr[1]에 지금 값이 크면 지금 값을 넣어주고 ,

연속된 곱이 지금 값 보다 크면 max에 그 값을 넣어준다.

dArr[i]에는 전에 연속된 값들이 만약에 더 크면 그 전 값과 곱해서 dArr[i]에 저장하고 더 큰 값을 누적해서 넣어주는 방법.

 

package back22y03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class seqNumber {
	
	// double을 바꿔주는 dStr
	public static double dStr(String str) {
		return Double.parseDouble(str);
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		int num = Integer.parseInt(bf.readLine());
		
		double[] dArr = new double[num];
		for(int i=0; i<num; i++) {
			dArr[i] = dStr(bf.readLine());
		}
		
		double max = dArr[0];
		
		for(int i=1; i<num; i++) {
			dArr[i] = Math.max(dArr[i], dArr[i-1] * dArr[i]); // 현재 위치에서 연속된 값 중 큰 값
			System.out.println("dArr[i] : " + dArr[i] + " i가 : " + i + "  ,max : " + max);
			max = Math.max(max,dArr[i]); // 연속된 곱에서 제일 큰 값
		}
		
		System.out.printf("%.3f", max);
	}

}

이해가 잘 되지 않아서, 변화 값들을 찍어보았다.

누적된 값을 dArr[i]에 넣어줌으로써, 계속 누적한값이 max보다 커지면 max에 들어가는 방식

1.638보다 큰 연속된 숫자들을 넣어서 sysout으로 찍어서 이해할 수 있었다.


Review🤩

방법이 생각나지 않아서, 참조한 부분이 있었습니다~


 

'Algorithm' 카테고리의 다른 글

[프로그래머스] 나머지가 1이 되는 수 찾기 , 같은 숫자는  (0) 2022.03.09
[백준] 추월  (0) 2022.03.08
[백준] 설탕 배달  (0) 2022.02.28
[백준] 숫자의 합  (0) 2022.02.28
[인프런] 아나그램(해쉬)  (0) 2022.02.27
알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net


Think🤔
package back23y02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SugarDelivery {

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int sugar = Integer.parseInt(bf.readLine());
        int answer = 0;
        int three = 3;
        int five = 5;

        if(sugar % five == 0) { // 5로 딱 나눠질 때 가장 최적
            answer += sugar / five;
        }else if((sugar % five) % three == 0) { // 5로 나누고 3으로 나눠질 때 그다음 최적
            answer += sugar / five;
            answer += (sugar / five) / three;
        }else if((sugar % three) % five == 0){
            answer += sugar / three;
            answer += (sugar / three) / five;
        }else if(sugar % three == 0) { // 3으로 나눠질 때
            answer += sugar / three;
        }else { // 그 외 안나눠 지면 -1 출력
            answer = -1;
        }

        System.out.println(answer);

    }

}

중간 중간 5 , 3 을 나눠 떨어지는 반복문을 계속해서 조건을 추가시키고 없애는 방법으로 했다.

그럴려다 보니 그러면 5가 몇번 들어가는지 3이 몇번 들어가는지를 구해야 하기 때문에 더 복잡해지고 구할 수 있는지도 의문이 들었다.

 

이걸 수학적 방식으로 들어가서 

3이랑 5를 더해서 나타낼 수 있는 숫자가 아닌 1,2,4,7 값이 나오면 -1을 리턴하게 해줬고,

5로 나눌 수 없어지면 -3으로 깎으면서 +1을 해줬다.

이렇게 되면 8일 경우에도 5로 나누고 3을 깎아줘서 0이 돼서 if문을 안타고 answer에 제대로 된 값을 넣어서 리턴을 해 줄 수 있다.

 

큰 값인 5로 나누는게 일단 최적의 방법이 맞고,

그 다음 3을 구하는 방법을 -1으로 없애면서 구하는 방법이였다.


Solution✍
package back23y02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SugarDelivery {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int sugar = Integer.parseInt(bf.readLine());
		int answer = 0;
		
		while(true) {
			if(sugar == 4 || sugar == 7 || sugar == 1 || sugar == 2) {
				answer = -1;
				break;
			}
			if(sugar % 5 == 0) {
				answer += sugar / 5;
				break;
			}else { // 안나눠 떨어지면 -3 해서 횟수 증가 시키고 5로 다시 나눔 근데 그게 4나 7이면 
				sugar-=3;
				answer++;
			}
		}
		
		System.out.println(answer);

	}

}

Review🤩

빠르게 풀 수 있다고 자만했지만, 그렇게 쉬운 문제는 아니였다.


 

'Algorithm' 카테고리의 다른 글

[백준] 추월  (0) 2022.03.08
[백준] 연속부분최대곱  (0) 2022.03.01
[백준] 숫자의 합  (0) 2022.02.28
[인프런] 아나그램(해쉬)  (0) 2022.02.27
[백준] 일곱 난쟁이  (0) 2022.02.27

+ Recent posts