Computer Science/Algorithm :: 알고리즘

알고리즘 :: 손에 손잡고, 더블 정렬 [함수 개선?]

HJPlumtree 2021. 9. 24. 20:55

알고리즘 공부하며 배운내용

 

 

손에 손잡고

올림픽 개막식에 손에 손잡고 공연을 한다.

 

우선 모든 사람이 옆 사람과 손을 잡을 수 있는지 확인을 하고,

모두와 잡을 수 있으면 얼마나 떨어져 있는지 알아내려고 한다.

 

각 사람의 위치는 (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));