no1202h   3년 전

예제값은 잘 나오는데 틀리네요ㅠ

dldyddlwl   3년 전

2

2 2

1 2 

의 값을 넣어보면 1이 나옵니다. 실제로, 답은 2입니다. ( 1시부터 2시 회의, 2시부터 2시 회의 ) 

이러한 결과가 나온 이유는, selector 함수의 for loop ( 32번째줄 ) 에서, 의도하신 바와 같이 a[i]가 ans[k]가 끝나고 나서 시작할 수 있다면, 이라는 조건은

위의 예시에서 볼 수 있듯이, 역순으로 나오는 경우에 잘못된 결과가 나옵니다. ( a[2].start = 1   < ans[1].finish = 2 ) -> (끝나는 시간으로만 정렬되었기에, 시작시간은 역순일 수 있음)

이 부분만 잘 해결하시면 될 것 같습니다! 파이팅

no1202h   3년 전

코드를 이렇게 변경 하여 반례도 잘 나오는데 틀리네요 ㅠㅠ

dldyddlwl   3년 전

잘하셨습니다! 그런데, 이 경우는 어떨까요?

[반례]

5

4 4

4 4

3 4

2 4

1 4

[글쓴이님의 코드]

=> comparestart, comparefinish을 마친 후의 a는 다음과 같습니다 ( 인덱스는 1부터 )

4 4 -> 먼저 고르게 됨

3 4

2 4

1 4

4 4 -> 두 번째로 고르면서, 출력은 2가 나옴. ( 실제 정답은 , 1 4 , 4 4 , 4 4로 3이 나와야합니다. )

** 분명 시작시간으로 정렬한 것 같은데 왜 이렇게 나왔을까요? 자 정렬 부분을 다시 봅시다.

for (int i = 1; i < a.size() - 1; i++) // 자, 여기를 보시면, 저희는 1부터 size()-1 전까지 한번만 돕니다.
{
if (a[i].finish == a[i + 1].finish && a[i].start > a[i + 1].start)
{
Cm[0].start = a[i + 1].start;
a[i + 1].start = a[i].start;
a[i].start = Cm[0].start;
}

}

자 그렇다면, 이 정렬에 의하면, 5 4 3 2 1 이

1. 4 5 3 2 1

2. 4 3 5 2 1

3. 4 3 2 5 1

4. 4 3 2 1 "5", 와 같이 정렬됩니다. 버블정렬이 이중루프로 이루어진 이유는, 한번의 과정만으로는 정렬되지않은 최댓값을 가장 오른쪽으로 미는 것 밖에 할 수 없기 때문입니다.

즉, 글쓴이님의 코드와 같이, 한번의 정렬만으로는, 저런식으로 5(최댓값)은 맨 뒤로 보낼 수 있었지만, 나머지는 아니기 때문에 일어난 현상입니다.

따라서, 이 부분을 해결하시면 됩니다! 잘하고 계십니다! 계속 파이팅하세요!

==========================================================================추신) 스포일러가 될 수도 있음==============================================

sort()에서 한번에 두 조건을 해결해 볼 수도 있습니다.

comparefinish에서, 우선은 종료시간으로 정렬하게 한 후, 정렬시간이 같을 때만, 시작시간 순으로 정렬하게끔 조건을 설정해 볼 수도 있습니다.

댓글을 작성하려면 로그인해야 합니다.