얼음꽃의 일지

[항해9기] 알고리즘 모의고사 문제 본문

항해 일지

[항해9기] 알고리즘 모의고사 문제

얼음꽃 2022. 9. 28. 16:42
728x90

[ 이 문제에 대한 출처는 스파르타코딩클럽, 항해99입니다. ]

 

▶ 숫자 거꾸로 더하기

 

예를 들어 숫자가 123456 으로 주어졌을때 결과 값은 6+5+4+3+2+1 = 123456의 합 으로 나와야 합니다.

 

function solution(n) {
    let arr = n.toString().split("").reverse()
    let sum = 0
    for (let i = 0; i < arr.length; i++) {
        sum += Number(arr[i])
    }
    let k = `${arr.join("+")} = ${sum}`
    return k
}
console.log(solution(718253))

풀이 방식

1. 그냥 숫자가 들어오기 때문에 먼저 각 숫자를 분리 시키기 위해 toString()으로 변환을 해주고

    split(")을 이용해 배열로 바꿔주면서 reverse로 순서를 바꾸어주었습니다. -> [ '3', '5', '2', '8', '1', '7' ]

 

2. 합을 구해야하기 때문에 sum이라는 변수를 선언해주고 arr의 길이 만큼 반복문을 돌리면서 arr안의 있는        값을 더해줘서 sum에 넣어줍니다. -> 26

 

3. 결과값이 각 값에 +를 붙여서 받았기 때문에 k를 선언하면서 백틱(``)을 이용하여 arr의 값에 +를 붙이고

    = 합 형태로 넣어 주었습니다. 그리고 return으로 반환 하게되면 결과 값이 나옵니다.

 

4. 결과 : 3+5+2+8+1+7 = 26

 

▶ 공부 얼마나 했는지 구하기

 

체크인, 체크아웃한 두 시간을 가진 배열이 주어지고, 24시 즉 00시 넘어간 이후에는 24+@로 계산합니다.

그리고 새벽 5시 정각 혹은 그 이상 체크아웃 시간이 나오면 제대로 안누른걸로 간주하고 21시(밤9시) 시간을

변경해서 풉니다.

 

function solution(arr1, arr2) {
  let sum = 0                                     
  for(let i = 0 ; i <arr2.length; i++) {          
    if(arr2[i] >= 29) {                          
      arr2.splice(i,1,21)                         
    }
    sum += arr2[i] - arr1[i]                      
  }
  return sum
}
let checkin = [9,9,9,9,7,9,8]
let checkout = [23,23,30,28,30,23,23]
console.log(solution(checkin, checkout))

풀이방식

1. 먼저 공부한 시간의 합을 받아와야하기 때문에 sum을 선언 해줍니다.

 

2. checkin이나 checkout은 같은 길이인 행렬이기 때문에 아무 길이나 받아와도 됩니다. 저는 arr2를 받아와       서 반복문을 돌리고 먼저 새벽 5시가 넘어가면 splice를 이용해서 그 값을 21로 변경 해주었습니다.

    -> checkout = [23,23,21,28,21,23,23]

 

3. 이제 checkout값을 바꿨으니 checkin과의 차이 값이 공부한 시간이 되고, 그 시간을 sum에 더해서 넣어줍     니다. 그리고 sum을 return으로 반환 해줍니다. -> 102

 

4. 결과 : 102

 

 

▶ 소수에서 최대값 , 소수 아닌 값에서 최소 값 구하기

 

값이 주어지는데 이 값들이 각각 소수인지 아닌지를 파악을 하고 소수와 소수 아닌 값을 분리를 시킨 후 소수에서는 최대값을 가져오고 소수 아닌 값에서는 최솟값을 가져옵니다. 형태는 {최소값} {최대값} 입니다.

 

function isPrime(num) {
  for (let i = 2; i <= Math.sqrt(num); i++) {           
    if (num % i === 0) return false                      
  }
  return num                                            
}

function solution(n) {
  let answer = n.toString().split(" ")         
  let m = []                                    
  let o = []                                   
  for(let  i = 0; i < answer.length; i++) {     
    if(isPrime(answer[i])) {                    
      m.push(answer[i])
    }
    else {
      o.push(answer[i])
    }
  }
  let output = `${Math.min(...o)} ${Math.max(...m)}`
  return output  
}
let s="97 75 88 99 95 92 73"
console.log(solution(s))

 

풀이방식

1. 먼저 소수인지 아닌지를 확인하는 함수를 만들어 줍니다. 들어오는 값의 제곱근으로 반복문을 돌려서 자기 자신 제외하고 안나누어 떨어지면 소수로 return 해주고 아니면 return false를 해줍니다.

 

2. 이제 두번째 함수에서 값을 확인하는데요. 먼저 들어오는 값을 각각 확인하기 위해 toString().split(" ")를 써서 배열로 만      들어 줍니다. -> ["97", "75", "88", "99", "95", "92", "73" ]

 

3. 소수인 값을 받기 위한 변수 m, 소수가 아닌 값을 받기 위한 변수 o를 공백인 배열로 만들어주고나 answer      의 길이로 반복문을 돌립니다. 돌리면서 소수인지 판별하는 함수를 이용해 소수인 것은 m으로 아닌 것은 o      로 보내줍니다.

    -> m = ["97", "73"] ,  o = ["73", "88", "99", "95", "92"]

 

4. 이제 min,max를 이용해서 각각의 값을 구한 후 백틱(``)을 이용해서 값을 받을 형태로 만들어주고 그걸 선        언한 output 변수에 넣은 다음 return으로 반환해줍니다.

 

5. 결과 : 75 97

 

[ 이 문제에 대한 출처는 스파르타코딩클럽, 항해99입니다. ]

 

https://spartacodingclub.kr/

 

스파르타코딩클럽

5주 완성! 코딩을 전혀 모르는 비개발자 대상의 웹개발 강의

spartacodingclub.kr

https://hanghae99-v2.spartacodingclub.kr/

 

온라인 코딩부트캠프 항해99, 현업과 같은 실전프로젝트

99일 동안 동료들과 함께 개발 공부에만 몰입하세요. IT 기업에서 환영 받는 주니어 개발자로 성장할 수 있습니다.

hanghae99-v2.spartacodingclub.kr

 

728x90