본문 바로가기

알고리즘

그리디 문제 풀이 (1)

728x90

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

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

[나의코드]

let fs = require("fs");
let input = fs.readFileSync("input.txt").toString().split("\n");
let [n,k] =input[0].split(" ").map(Number) //[10,4200]
let answer=0
for(i=n;i>0;i--){ // 가장 단위가 큰 동전 => 단위가 작은 동전 순차적으로
  if(input[i]<=k){ // 동전의 단위가 k보다 작을 때
    answer=answer+parseInt(k/input[i]) // k를 동전으로 나눈 몫만큼을 answer에 더해줌
    k=k%input[i] // k는 나머지가 됨
  } 
}
console.log(answer)

10분 컷!!

 

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

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

[나의 코드]

let fs = require("fs");
let input = fs.readFileSync("dev/stdin").toString().split("\n");
const n= Number(input[0])//5
const arr=input[1].split(" ").map(Number).sort((a,b)=>a-b) // [1,2,3,3,4]
let answer=0;
for(i=0;i<arr.length;i++){
  answer=answer+arr[i]*(n-i)
}
console.log(answer)

돈을 인출할 때 필요한 시간의 합의 최솟값이 되게 하려면 처음에 인출하려는 사람이 인출하는데 가장 적은 시간이 소요되고 갈수록 더 많은 시간이 필요하게 정렬을 하면 된다.

 

[나의 코드]

 

let fs = require("fs");
let input = fs.readFileSync("index.txt").toString().split("\n");
let group = input[0].split("-")
let answer=0;
for(let i=0;i<group.length;i++){
  let temp = group[i].split("+").map(Number).reduce((a,b)=>a+b)
  if(i==0) answer= answer+temp
  else answer= answer-temp
}

console.log(answer)

 

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

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

[나의코드]

let fs = require("fs");
let input = fs.readFileSync("index.txt").toString().split("\n");
let temp = input[0].split("-")//[ '55', '50+40' ], - 부호를 기준으로 나누어줌
let answer=0

for(i=0;i<temp.length;i++){
  let _temp = temp[i].split("+").map(Number).reduce((a,b)=>a+b)
  // 55, 90 과 같이 +를 기준으로 나뉜 값들을 더해줌
  if(i===0) answer=Number(_temp)
  // 맨 첫번째 값일 때는 값 그대로가 answer
  else answer= answer-Number(_temp)
  // 이후로는 -로 연결하면 최솟값이 구해짐
}
console.log(answer)

 

728x90