알고리즘 공부하며 배운내용
손에 손잡고
올림픽 개막식에 손에 손잡고 공연을 한다.
우선 모든 사람이 옆 사람과 손을 잡을 수 있는지 확인을 하고,
모두와 잡을 수 있으면 얼마나 떨어져 있는지 알아내려고 한다.
각 사람의 위치는 (x, y) 좌표로 표현된다.
y 좌표가 같으면 같은 줄에 서있는 거다.
들어오는 값
첫 번째 줄에는 전체 사람 수 N이 입력된다.
두 번째 줄부터는 사람들 차례대로(x, y)가 입력된다.
예)
5
1 3
2 3
3 5
1 5
7 5
보여줄 값
모두가 옆 사람과 손을 잡을 수 있는 경우
SUCCESS 출력, 그 다음줄에 가장 먼 거리를 출력
아니면 FAIL 출력
예)
SUCCESS
4
핵심 포인트
전부 다 비교하지 않고, 왼쪽 오른쪽만 비교하면 된다.
y좌표가 같으면 x좌표를 비교해서 오름차순으로 정렬하고, 다르면 y좌표 오름차순으로 정렬을 한다.
그럼 딱 왼쪽 오른쪽만 비교하면 된다.
코드
정렬 뒤에 함수 부분에서 코드를 좀 더 다듬을 수 있을 것 같지만,
우선 앞으로 전진! 다음에 돌아올지도
// VSCode에서 JavaScript 테스트 하기위한 코드
// 메모장에 테스트 케이스 넣고 handhand.txt로 저장했다.
let fs = require('fs')
let input = fs.readFileSync('handhand.txt').toString().split('\n')
// 배열의 첫 번째는 사람수라 빼간다
const ppl = +input.shift()
let coorArr = []
let sameLine = 0
let tempDist = 0
let distance = 0
// 여기가 포인트
// y좌표 같으면 x좌표 오름차순, 다르면 y좌표 오름차순
coorArr = input.sort((a, b) => {
if(a[2] === b[2]) {
return a[0] - b[0]
}
else {
return a[2] - b[2]
}
})
// 왼쪽 오른쪽 비교해서 출력하는 함수
function showDist(coor) {
for(let i = 0; i < coor.length-1; i++) {
if(sameLine === 0 && coor[i][2] !== coor[i+1][2]) {
return 'FAIL'
}
if(coor[i][2] === coor[i+1][2]) {
sameLine = 1
tempDist = +coor[i+1][0] - +coor[i][0]
distance = Math.max(+distance, +tempDist)
}
else {
sameLine = 0
continue;
}
}
return `SUCCESS \n${distance}`
}
console.log(showDist(coorArr));
'Computer Science > Algorithm :: 알고리즘' 카테고리의 다른 글
알고리즘 :: 가장 튼튼한 줄, 크레인 (0) | 2021.09.24 |
---|---|
알고리즘 :: 0과1 문자열 압축, 재귀함수, 분할정복 (0) | 2021.09.24 |
알고리즘 :: 계단 오르기, 피보나치, 메모이제이션 (0) | 2021.09.24 |
알고리즘 :: 마트 계산대, 이진 탐색 (0) | 2021.09.20 |
알고리즘 :: From Here To Here, 슬라이딩 윈도우 (0) | 2021.09.19 |