본문 바로가기

알고리즘

자바스크립트 배열 문제풀이

728x90

[문제1]

https://www.acmicpc.net/submit/10818

 

로그인

 

www.acmicpc.net

[나의 코드]

let fs = require("fs");
let input = fs.readFileSync("dev/stdin").toString().split("\n");

let n = Number(input[0]);
let temp=input[1].split(" ")
let array=[]
for(i=0;i<temp.length;i++){
  array.push(Number(temp[i]))
}

console.log(`${Math.min(...array)} ${Math.max(...array)}`)

풀면서도 이게 최선은 아니겠구나 싶었음... 입력 받은걸 굳이 배열로 만든다음에 그것을 for문 돌려서 숫자로 변형시키고 굳이 다시 스프레드 문법 이용해서 min, max 구하는 구차한 과정들...

 

[인사이트]

let fs = require("fs");
let input = fs.readFileSync("input.txt").toString().split("\n");

let n = Number(input[0]);
let array=input[1].split(" ").map(Number)


console.log(`${Math.min(...array)} ${Math.max(...array)}`)

해설강의는 조금 다른 방법으로 풀었지만 참고해서 위의 코드로 리팩토링을 하는것이 가능했다. for문을 사용하지 않고 바로 문자로 바꿔서 배열로 저장!

 

[인사이트2] : reduce를 이용한 풀이 방법

let fs = require("fs");
let input = fs.readFileSync("dev/stdin").toString().split("\n");

let n = Number(input[0]);
let array=input[1].split(" ").map(Number)

let min = array.reduce((a,b)=>Math.min(a,b))
let max = array.reduce((a,b)=>Math.max(a,b))


console.log(min +" "+max)

reduce를 이용한 풀이가 가장 깔끔하다고 생각!

 

[문제2]

https://www.acmicpc.net/submit/2562

 

로그인

 

www.acmicpc.net

[나의코드]

let fs = require("fs");
let input = fs.readFileSync("dev/stdin").toString().split("\n");

const array=input.map(Number)
const max=Math.max(...array)
const maxIndex=array.indexOf(max)+1

console.log(max+"\n"+maxIndex)

 

[문제3]

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

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

 

[나의코드](틀림)

let fs = require("fs");
let input = fs.readFileSync("dev/stdin").toString().split("\n");

let array=input.map(x=>Number(x)%42)
let set = new Set(array)

console.log([...set].length)

무조건 맞출줄 알았는데 자꾸 30% 정도에서 틀렸다고 떠서 예외처리 못한거라고 생각했다. 아무리 생각해봐도 빠뜨린 부분이 생각이 안나서 결국 해설 봄...ㅠ

 

[해설코드]

let fs = require("fs");
let input = fs.readFileSync("dev/stdin").toString().split("\n");

let array=input.map(Number)
let set = new Set();

for(let i=0;i<10;i++){
    set.add(array[i]%42)
}

console.log(set.size)

내가 쓴 코드와 해설코드가 본질적으로 뭐가 다른지 잘 모르겠음... gpt도 두 코드는 같다고 하는데...

 

 

[문제4]

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

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

[나의코드]

let fs = require("fs");
let input = fs.readFileSync("input.txt").toString().split("\n");

let n = Number(input[0])
let answer=""

for(i=1;i<=n;i++){
  let array=(input[i].split(" ").map(Number))
  let num=array[0]
  let average=(array.reduce((a,b)=>a+b)-num)/num
  let cnt=0;
  for(j=1;j<=array.length;j++){
    if(array[j]>average){
      cnt++
    }
  }
  answer=answer+((cnt*100/num).toFixed(3)+"%")+"\n"
}
console.log(answer)

처음에는 콘솔을 한번에 안찍고 여러번 출력해서 런타임에러 떠서 한번에 모아서 찍는걸로 수정함. 마음에 안드는 부분은 reduce 로 평균구하는 부분에서 초기값을 배열의 두번쨰부터 reduce 를 사용할 수 있으면 좋을거 같은데 방법이 안떠올라서 그냥 초기값을 한번 빼줘서 평균을 구했음

 

 

[문제5]

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

 

1546번: 평균

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보

www.acmicpc.net

[나의코드]

let fs = require("fs");
let input = fs.readFileSync("input.txt").toString().split("\n");

let n = Number(input[0])
let array=input[1].split(" ").map(Number)
let max=Math.max(...array)
let newArray=array.map((item)=>item*100/max)
let newAverage=newArray.reduce((a,b)=>a+b)/array.length

console.log(newAverage)

한방에 정답><

[인사이트]

 

 

728x90