728x90
반응형
SMALL

문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한 사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

입출력 예

progresses speeds return

[93, 30, 55] [1, 30, 5] [2, 1]
[95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1, 1] [1, 3, 2]

입출력 예 설명

입출력 예 #1

첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.

두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.

세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.

따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.

입출력 예 #2

모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다.

따라서 5일째에 1개의 기능, 10일째에 3개의 기능, 20일째에 2개의 기능이 배포됩니다.

package LV2;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/*
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고,
이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와
각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

 */
public class H42586 {
	public int[] solution(int[] progresses, int[] speeds) {
		Queue<Integer> q = new LinkedList<>(); // 각 작업의 완료 날짜를 저장할 큐
		List<Integer> answerList = new ArrayList<>(); // 배포마다 몇 개의 기능이 배포되는지를 저장할 리스트

		for (int i = 0; i < speeds.length; i++) {
			double remain = (100 - progresses[i]) / (double) speeds[i]; // 각 작업마다 남은 일수 계산
			int date = (int) Math.ceil(remain); // 올림하여 날짜 계산 (일수는 소수점 없이 정수여야 함)

			if (!q.isEmpty() && q.peek() < date) { // 만약 이전 작업이 더 오래 걸리는 경우(즉, 현재 작업이 먼저 끝나는 경우)
				answerList.add(q.size()); // 큐의 사이즈를 결과 리스트에 추가 (배포된 작업의 수)
				q.clear(); // 큐 초기화
			}

			q.offer(date); // 큐에 현재 작업의 완료 날짜 추가
		}

		answerList.add(q.size()); // 마지막 배포 작업의 수 추가

		// 리스트를 배열로 변환
		int[] answer = new int[answerList.size()];

		for (int i = 0; i < answer.length; i++) {
			answer[i] = answerList.get(i); // 리스트의 각 원소를 배열에 추가
		}

		return answer; // 결과 반환
	}
}

 

가면 갈수록.. 변수명을 짓기가 힘들어서
https://www.curioustore.com/#!/

 

Curioustore

변수명 짓기, 컬럼명 짓기, 영어약자, 変数名 つけ方, カラム名建てる, 英語の略語, 命名变量, 命名该列, 英文缩写

www.curioustore.com

여기서 검색해서 괜찮은걸 가져오고 있습니다..

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글

카펫  (0) 2023.05.22
피보나치 수  (0) 2023.05.22
프로세서  (0) 2023.05.19
행렬의 곱셉  (1) 2023.05.18
다음 큰 숫자  (0) 2023.05.18
728x90
반응형
SMALL

문제 설명

운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다. 2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다. 3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다. 3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.

예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.


제한사항

  • priorities의 길이는 1 이상 100 이하입니다.
    • priorities의 원소는 1 이상 9 이하의 정수입니다.
    • priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
  • location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.
    • priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이 표현합니다.

입출력 예

priorities location return

[2, 1, 3, 2] 2 1
[1, 1, 9, 1, 1, 1] 0 5

입출력 예 설명

예제 #1

문제에 나온 예와 같습니다.

예제 #2

6개의 프로세스 [A, B, C, D, E, F]가 대기 큐에 있고 중요도가 [1, 1, 9, 1, 1, 1] 이므로 [C, D, E, F, A, B] 순으로 실행됩니다. 따라서 A는 5번째로 실행됩니다.

스텍 - 후입선출(책을 쌓아서 가장 마지막에 쌓은 책부터 처리)

큐 - 선입선출(줄을 서서 가장 먼저 줄을 선 사람부터 처리)

package LV2;

import java.util.Collections;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;

/*
운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다.
이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
  3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와,
몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때,
해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.
 */
public class H42587 {
	public int solution(int[] priorities, int location) {
		// 프로세스를 순서대로 관리하는 큐를 선언
		Queue<Integer> q = new LinkedList<>();
		// 프로세스를 우선순위대로 관리하는 우선순위 큐를 선언
		PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());

		// 프로세스의 우선순위를 큐와 우선순위 큐에 추가
		for (int i : priorities) {
			q.offer(i);
			pq.offer(i);
		}

		// 실행된 프로세스의 개수를 카운트할 변수 선언
		int answer = 0;
		// 큐가 빌 때까지 실행
		while (!q.isEmpty()) {
			// 큐에서 프로세스를 하나 꺼내기
			int current = q.poll();
			// 꺼낸 프로세스의 우선순위가 가장 높다면
			if (current == pq.peek()) {
				// 실행된 프로세스 개수를 하나 증가시키고
				answer++;
				// 우선순위 큐에서 해당 프로세스를 제거한다.
				pq.poll();
				// 꺼낸 프로세스가 찾고자 하는 프로세스라면 반복문을 종료
				if (location == 0) {
					break;
					// 아니라면 찾고자 하는 프로세스의 위치를 하나 줄인다.
				} else {
					location--;
				}
				// 꺼낸 프로세스의 우선순위가 가장 높지 않다면
			} else {
				// 큐의 마지막에 다시 넣는다.
				q.offer(current);
				// 찾고자 하는 프로세스의 위치를 조정한다.
				location = (location == 0) ? q.size() - 1 : location - 1;
			}
		}
		// 찾고자 하는 프로세스가 실행된 순서를 반환
		return answer;
	}
}

조건연산자라는 특별한 연산자를 이용해 프로그램 내에서 조건에 따라 location 값을 변경하고 있다. 이러한 조건연산자는 조건 ? 값1 : 값2 형태로 표현되며, 조건이 참일 경우 **값1**을, 거짓일 경우 **값2**를 반환한다.

코드에서 **location**은 찾고자 하는 프로세스의 위치를 의미하며, 0부터 시작. 큐에서 프로세스를 꺼냈을 때 해당 프로세스가 가장 높은 우선순위를 가지지 않아 다시 큐에 넣게 되면, 찾고자 하는 프로세스의 위치도 함께 조정해야한다.

location = (location == 0) ? q.size() - 1 : location - 1;

  1. **location**이 0인 경우(즉, 꺼낸 프로세스가 찾고자 하는 프로세스인 경우), 다시 큐의 맨 뒤로 들어가므로 **location**을 큐의 사이즈에서 1을 뺀 값으로 설정한다. 이렇게 하면 **location**은 현재 큐의 마지막 위치를 가리키게 된다.
  2. **location**이 0이 아닌 경우, 꺼낸 프로세스는 찾고자 하는 프로세스 앞에 있던 프로세스이므로 **location**을 1만큼 감소시킨다. 이렇게 하면 **location**은 여전히 찾고자 하는 프로세스를 가리키게 된다.
728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글

피보나치 수  (0) 2023.05.22
기능개발  (0) 2023.05.19
행렬의 곱셉  (1) 2023.05.18
다음 큰 숫자  (0) 2023.05.18
숫자의 표현  (0) 2023.05.18
728x90
반응형
SMALL

문제 설명

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건

  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.

입출력 예

arr1 arr2 return

[[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]
package LV2;
/*
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
 */
public class H12949 {
	// 함수의 입력값으로 두 2차원 배열 arr1, arr2를 받기
	public int[][] solution(int[][] arr1, int[][] arr2) {
		// 결과를 저장할 answer 2차원 배열을 초기화, arr1의 행의 크기와 arr2의 열의 크기로 배열을 생성
		int[][] answer = new int[arr1.length][arr2[0].length];

		// arr1의 행을 순회하는 for문
		for (int i = 0; i < arr1.length; i++) {
			// arr2의 열을 순회하는 for문
			for (int j = 0; j < arr2[0].length; j++) {
				// arr1의 열 혹은 arr2의 행을 순회하는 for문
				// arr1의 각 행과 arr2의 각 열을 곱셈하는 과정을 수행
				for (int k = 0; k < arr1[0].length; k++) {
					// arr1의 i번째 행과 k번째 열의 원소와 arr2의 k번째 행과 j번째 열의 원소를 곱한 값을 answer의 i행 j열에 더함
					answer[i][j] += arr1[i][k] * arr2[k][j];
				}
			}
		}
		// 최종적으로 계산된 행렬 곱 결과를 반환
		return answer;
	}
}

3중 for문을 이용해서 행렬의 곱셈을 구현

  1. 첫 번째 for문은 arr1의 행을 순회
  2. 두 번째 for문은 arr2의 열을 순회
  3. 세 번째 for문은 곱셈을 수행하는 동안 arr1의 열 혹은 arr2의 행을 순회

각각의 원소들을 곱하고 그 결과를 answer[i][j]에 더해주고, 이 과정을 반복하여 최종적으로 행렬의 곱을 구한다.

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글

기능개발  (0) 2023.05.19
프로세서  (0) 2023.05.19
다음 큰 숫자  (0) 2023.05.18
숫자의 표현  (0) 2023.05.18
이진 변환 반복하기  (0) 2023.05.18

+ Recent posts