프로그래머스 문제풀기

프로그래머스 15탄 -(아마존 면접문제)

Hyeon been 2023. 5. 31. 20:50

한번씩 읽고 가세요.

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

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

1.

사무실에는 특정일자의 출퇴근 시간이 기록된 거대한 로그파일이 있다고 한다.

파일의 형식은 다음과 같다. (한 라인에서 앞부분은 출근시간(HH:MM:SS), 뒷부분은 퇴근시간이다)

09:12:23 11:14:35
10:34:01 13:23:40
10:34:31 11:20:10

특정시간을 입력(예:11:05:20)으로 주었을 때 그 시간에 총 몇 명이 사무실에 있었는지 알려주는 함수를 작성하시오.

 

풀이

let t = '09:12:23'
t = t.split(':').join('')
let count = 0

let logs = `09:12:23 11:14:35
10:34:01 13:23:40
10:34:31 11:20:10`
let log = logs.split('\n')

for (let l of log){
    let 출근 = l.split(' ')[0].split(':').join('')
    let 퇴근 = l.split(' ')[1].split(':').join('')
    if (출근 <= t && t <= 퇴근){
        count += 1
    }
}

count

//10:35:00
//11:21:00
//13:25:00
  1. 주어진 변수들은 다음과 같습니다:
    • t는 초기 시간을 나타냅니다. ('09:12:23')
    • count는 출근 시간과 퇴근 시간 사이에 속하는 로그의 개수를 저장하는 변수입니다.
    • logs는 로그들을 담은 문자열입니다.
    • log는 logs를 줄바꿈 문자(\n)을 기준으로 분리한 배열입니다.
  2. t를 콜론(:)으로 분리하고, 분리된 요소들을 합쳐서 t에 다시 할당합니다. (t = t.split(':').join(''))
    • 이를 통해 t는 콜론을 제거한 형태의 문자열이 됩니다.
  3. 초기값으로 count를 0으로 설정합니다.
  4. for...of 문을 사용하여 log 배열의 각 요소를 하나씩 확인합니다.
    • 각 로그 l에 대해, 공백을 기준으로 분리하고 출근 시간과 퇴근 시간을 얻습니다.
    • 출근 시간과 퇴근 시간을 콜론(:)으로 분리하고, 분리된 요소들을 합쳐서 출근 시간과 퇴근 시간을 콜론을 제거한 형태의 문자열로 만듭니다.
    • 만약 출근 <= t && t <= 퇴근 조건을 만족한다면, 즉 t가 출근 시간과 퇴근 시간 사이에 속한다면 count를 1 증가시킵니다.
  5. 최종적으로 count 값을 반환합니다.

따라서, 주어진 로그들 중에서 출근 시간과 퇴근 시간 사이에 속하는 로그의 개수가 결과로 출력됩니다.

 

2.

감옥에 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. room은 길이가 120인 배열로 초기화되며, 모든 요소는 -1로 채워집니다.
  2. 첫 번째 반복문에서 i는 1부터 120까지 증가합니다.
  3. 두 번째 반복문에서 n은 1부터 120까지 증가합니다.
  4. if (n % i == 0)는 n이 i로 나누어 떨어지는지를 확인합니다.
  5. 만약 n이 i로 나누어 떨어진다면, room[n-1]의 값을 반전시킵니다. (room[n-1] *= -1)
    • room 배열의 인덱스는 0부터 시작하므로 n-1을 사용하여 요소에 접근합니다.
    • 해당 위치의 값이 -1일 경우 1로, 1일 경우 -1로 변경됩니다.
  6. 반복문이 모두 종료된 후, room 배열에서 값이 1인 요소의 개수를 세어 반환합니다. (room.filter(v => v == 1).length)

따라서, 주어진 조건에 따라 room 배열의 값을 변경하고, 배열에서 값이 1인 요소의 개수를 세어 결과를 반환합니다.