X . .
. X X
이런 경우에 (1,2)번째랑 (1,3)번째랑 value값이 같은데 답은 (1,3)이랑 (2,1)을 골라야하는 2가 됩니다.
이처럼 value값이 같은 자리가 여러 개일 경우에 명백히 오류가 나며, value값이 작은 것을 고른 것이 부분 문제의 해가 될 지는 모르나, 그 부분 문제의 해가 전체 해에 영향을 끼치지는 않으므로 알고리즘의 정확성에서 문제가 생깁니다.
이 문제는 bitmask dynamic programming이나 maximum flow(network flow)알고리즘으로 해결할 수 있습니다.
mongsiry013 9년 전 1
어려운 문제는 아닌거 같은데 어디서 틀렸다는 건지 못찾고 있어요 ㅠ
채점 25%에서 틀림 판정을 받네요
틀린 케이스 좀 알려주세요ㅠ
알고리즘은 그리드 방법을 사용합니다.
사용되는 알고리즘은 다음과 같습니다.
1. 각 빈 자리마다 value 값 설정
value값이 의미하는 것은 해당 자리에 학생을 앉힐 경우 그로 인해 사용할 수 없게 되는 빈 자리의 수를 의미한다.
2. value 값이 가장 작은 빈 자리를 선택
3. 선택 된 자리에 학생을 앉힘.
- '.' 를 'O'로 변경. 'O'는 학생이 앉은 자리를 의미.
- 해당 자리에 학생을 앉힘으로써 주위에 다른 학생들이 못 앉게 되는 자리를 'X'로 변경.
'X'는 컨닝 때문에 학생이 못 앉게 되는 자리 또는 책상이 부셔져서 학생이 못 앉게 되는 자리를 의미.
4. 빈 자리가 남아 있지 않을 때까지 1번부터 다시 반복.
변수 설명 :
room - room[i][j]는 i번째 줄 j번째 열의 자리를 의미. 빈자리 : '.', 학생이 앉은 자리 'O', 학생이 앉을 수 없는 자리 'X'
Help - 각 빈자리의 value값을 저장하는 리스트. [i, j, value] 형태로 저장. value값을 기준으로 정렬하여 value값이 최소인 자리를 찾음.
empty_space - 현재 빈 자리의 개수
student_space - 현재 학생이 앉은 자리의 개수