프로그래머스 문제풀기

프로그래머스 17탄 (코딩도장)

Hyeon been 2023. 6. 1. 21:49

한번씩 읽고 가세요.

“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90

120번째 죄수

감옥에 120명의 죄수가 있다. 간수는 복도를 120번 동안 다음 조건에 지나간다.

  • 처음에 문은 모두 닫혀 있다.
  • N번째 지나갈 때에는 N의 배수인 문들이 열려 있으면 닫고, 닫혀 있으면 연다.
  • 마지막에 문이 열려 있으면 그 방의 죄수는 석방이다.

과연 몇 명의 죄수가 석방될까?

let room = Array(120).fill(-1)
for(let i = 1; i < 121; i++){
    for(let n = 1; n < 121; n++){
        if (n % i == 0){
            room[n-1] *= -1
        }
    }
}
room.filter(v => v == 1).length

1부터 120까지의 숫자로 채워진 room이라는 배열을 생성합니다. 배열의 초기 값은 모두 -1로 설정됩니다. 그런 다음, 중첩된 반복문을 사용하여 각 숫자에 대해 나누어 떨어지는 경우 해당 숫자의 인덱스에 있는 배열 요소를 -1에서 1로 변경합니다.

더 자세히 설명하자면:

  1. room 배열은 길이가 120이고, 모든 요소가 -1로 채워진 배열로 초기화됩니다.
  2. 외부 반복문은 i 변수를 1부터 120까지 증가시키면서 실행됩니다.
  3. 내부 반복문은 n 변수를 1부터 120까지 증가시키면서 실행됩니다.
  4. 만약 n이 i로 나누어 떨어지면, room 배열의 n-1 인덱스에 있는 요소를 -1에서 1로 변경합니다.
  5. 외부 반복문이 종료되면, room 배열에서 값이 1인 요소만 필터링하고, 그 개수를 반환합니다.

결과적으로 이 코드는 1부터 120까지의 숫자 중에서 약수의 개수가 홀수인 숫자의 개수를 반환합니다.

 

 

Subdate

두 날짜(YYYYMMDD)의 차이 일수를 구하는 프로그램을 작성하시오.

※ 단, 프로그래밍 언어에서 지원하는 날짜차이를 계산하는 라이브러리는 사용하지 말것

예)

20070515 sub 20070501 = 14
20070501 sub 20070515 = 14
20070301 sub 20070515 = 75

function subdate(date){
    년 = parseInt(date.slice(0, 4))
    월 = parseInt(date.slice(4, 6))
    일 = parseInt(date.slice(6))
    console.log(년, 월, 일)
    월별일 = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    일수 = 년 * 365 + 일
    for(let i=1; i<월;i++){
        일수 += 월별일[i]
    }
    return 일수
}

function solution(a, b){
    return Math.abs(subdate(a) - subdate(b))
}

solution('20070515', '20070501') //14
solution('20070301', '20070515') //75

함수 subdate(date)는 날짜를 입력받아서 해당 날짜의 연도, 월, 일을 추출하고, 일수로 변환하여 반환합니다.

  1. date.slice(0, 4)는 date 문자열에서 0부터 4 인덱스 이전까지의 부분 문자열을 추출합니다. 이 부분은 연도를 나타냅니다. parseInt() 함수를 사용하여 문자열을 정수로 변환하고, 년 변수에 저장합니다.
  2. date.slice(4, 6)는 date 문자열에서 4부터 6 인덱스 이전까지의 부분 문자열을 추출합니다. 이 부분은 월을 나타냅니다. 마찬가지로 parseInt() 함수를 사용하여 문자열을 정수로 변환하고, 월 변수에 저장합니다.
  3. date.slice(6)는 date 문자열에서 6 인덱스부터 끝까지의 부분 문자열을 추출합니다. 이 부분은 일을 나타냅니다. 마찬가지로 parseInt() 함수를 사용하여 문자열을 정수로 변환하고, 일 변수에 저장합니다.
  4. console.log(년, 월, 일)은 추출한 년, 월, 일을 출력합니다.
  5. 월별일은 각 월별로 해당 월의 일 수를 저장한 배열입니다.
  6. 일수 변수에 년 * 365 + 일을 대입하여 일수를 계산합니다.
  7. for 반복문을 사용하여 1부터 월 이전까지의 월별 일 수를 더해줍니다.
  8. 최종적으로 계산된 일수를 반환합니다.

함수 solution(a, b)는 subdate 함수를 이용하여 두 날짜 간의 차이를 구합니다.

  1. subdate(a)와 subdate(b)를 호출하여 각각 a와 b의 일수를 구합니다.
  2. Math.abs() 함수를 사용하여 두 일수의 차이를 절댓값으로 변환하여 반환합니다.

solution('20070515', '20070501')은 '20070515'와 '20070501' 사이의 일수 차이를 구하고, 결과로 14를 반환합니다.

solution('20070301', '20070515')은 '20070301'와 '20070515' 사이의 일수 차이를 구하고, 결과로 75를 반환합니다.