https://www.acmicpc.net/problem/2457
JavaScript 코드
const [in1, ...in2] = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
const N = Number(in1)
const inputList = in2.map((el) => el.split(" ").map(Number))
const flowers = inputList.map(el => {
const startMD = el[0] * 100 + el[1]
const endMD = el[2] * 100 + el[3]
return [startMD, endMD]
}).sort((a, b) => a[0] - b[0])
const lastCheckDay = 1130
let end = 301
let checkList = []
let ans = 1
let i = 0
let flag = false
if (flowers[0][0] > end) {
console.log(0)
return
}
while (i < flowers.length) {
const flower = flowers[i]
if (flower[0] > end) {
if (checkList.length > 0) {
if (checkList[0][0] > end) {
flag = true
break
}
checkList.sort((a, b) => b[1] - a[1])
end = checkList[0][1]
if (end > lastCheckDay) {
break
}
ans++
i--
checkList = []
}
}
checkList.push(flower)
i++
}
if (flag || checkList.sort((a, b) => b[1] - a[1])[0][1] <= lastCheckDay) {
console.log(0)
} else {
console.log(ans)
}
풀이 과정
1. 월/일로 나뉘어진 입력을 쉽게 풀이할 수 있게 치환하고 (월*100 + 일), 피는 날짜를 기준으로 오름차순 정렬한다.
2. 꽃이 지는 날을 end 변수로 두고, 3월 1일 이전에는 피어 있지 않아도 되므로 초기 값을 3월 1일인 301로 둔다.
3. 피는 날짜 기준 오름차순 정렬했기 때문에 첫 꽃이 피는 시점이 end 이전이라면 0을 출력하고 리턴한다.
4. end 변수값 이전에 피기 시작하는 꽃들 중 가장 오래 피어있는 꽃을 고른다.
checkList에 push 하여 지는 날짜를 기준으로 내림차순 정렬한다.
만약 다음 꽃이 end 변수값 이후에 핀다면 flag 값을 주고 while을 탈출한다.
5. checkList에서 가장 오래 피어있는 꽃이 지는 날짜를 end 변수에 넣고 ans 값을 증가시킨다.
이때 i가 증가하면 현재 체크하지 못한 꽃을 넘어가게 되므로 i를 하나 감소시켜준다.
6. 12월은 체크하지 않고 11월 30일보다 빨리 끝나면 while을 나가서 0을 출력한다.
'틀렸습니다' 반례 고려사항
기본적인 앞뒤 날짜 체크 (3.1/11.30)
중간에 꽃이 피지 않는 기간 발생 경우 체크 (flag 처리)
런타임 에러
배열 참조 에러 항상 조심하기
if (checkList.length > 0) { ... }
'main > Algorithm' 카테고리의 다른 글
백준 _ 2580 스도쿠 (Python, JavaScript) (0) | 2024.05.10 |
---|---|
코드트리 두달 사용 솔직 후기 (0) | 2024.04.06 |
알고리즘 공부에서 길을 잃었나요 .....? 코드트리 한달 사용 솔직 후기 (0) | 2024.03.02 |
구름톤 챌린지 남은 문제들 푼 일기 (JavaScript) (1) | 2023.12.01 |
구름톤 챌린지 20일차 일기 (0) | 2023.09.10 |