# Ruby 1.8에서테스트
# 여러개의 팀이 한 회의실을 사용할때
# 가장 많은 팀이 회의실을 사용하도록 스케줄링을 하는 문제이다
# 회의는 중간에 중단이될수가없구, 여러팀이 동시에 회의실을 쓸 수없다
# 맨 처음에 회의가 끝나는 시간이 작은 순서대로 정렬한다
# 그 다음 그 팀이랑 시간이 겹치지 않는 팀을 집어넣구,
# 또 그다음엔 그 팀이랑 시간이 겹치지 않는 팀을 집어넣는순으로 스케쥴링을 한다
class Meeting
def initialize(team_name, start_time, finish_time)
@team_name = team_name
@start_time = start_time
@finish_time = finish_time
end
attr_reader :team_name, :start_time, :finish_time
def <=>(obj)
return (self.finish_time <=> obj.finish_time)
end
def ==(obj)
return ( (self.team_name == obj.team_name) and
(self.start_time == obj.start_time) and
(self.finish_time == obj.finish_time) )
end
end
# last_meeting의 끝나는 시간 전에 회의를 시작하면 겹치는것.
def overlap?(last_meeting, new_meeting)
return (new_meeting.start_time < last_meeting.finish_time)
end
def room_schedule(meetings)
scheduled = Array.new
last = 0
meetings.sort!
scheduled[0] = meetings[0]
1.upto(meetings.length - 1) do |i|
unless overlap?(meetings[last], meetings[i])
last = i
scheduled << meetings[last]
end
end
return scheduled
end
require 'test/unit'
class TestRoomSchedule < Test::Unit::TestCase
def test_method
ans = [ Meeting.new('b', 1, 4), Meeting.new('e', 5, 7), Meeting.new('g', 8, 11),
Meeting.new('i', 12, 14) ]
input = [ Meeting.new('a', 3, 5), Meeting.new('b', 1, 4), Meeting.new('c', 2, 13),
Meeting.new('d', 5, 9), Meeting.new('e', 5, 7), Meeting.new('f', 0, 6),
Meeting.new('g', 8, 11), Meeting.new('h', 8, 12), Meeting.new('i', 12, 14) ]
assert_equal(ans, room_schedule(input))
end
end
# 여러개의 팀이 한 회의실을 사용할때
# 가장 많은 팀이 회의실을 사용하도록 스케줄링을 하는 문제이다
# 회의는 중간에 중단이될수가없구, 여러팀이 동시에 회의실을 쓸 수없다
# 맨 처음에 회의가 끝나는 시간이 작은 순서대로 정렬한다
# 그 다음 그 팀이랑 시간이 겹치지 않는 팀을 집어넣구,
# 또 그다음엔 그 팀이랑 시간이 겹치지 않는 팀을 집어넣는순으로 스케쥴링을 한다
class Meeting
def initialize(team_name, start_time, finish_time)
@team_name = team_name
@start_time = start_time
@finish_time = finish_time
end
attr_reader :team_name, :start_time, :finish_time
def <=>(obj)
return (self.finish_time <=> obj.finish_time)
end
def ==(obj)
return ( (self.team_name == obj.team_name) and
(self.start_time == obj.start_time) and
(self.finish_time == obj.finish_time) )
end
end
# last_meeting의 끝나는 시간 전에 회의를 시작하면 겹치는것.
def overlap?(last_meeting, new_meeting)
return (new_meeting.start_time < last_meeting.finish_time)
end
def room_schedule(meetings)
scheduled = Array.new
last = 0
meetings.sort!
scheduled[0] = meetings[0]
1.upto(meetings.length - 1) do |i|
unless overlap?(meetings[last], meetings[i])
last = i
scheduled << meetings[last]
end
end
return scheduled
end
require 'test/unit'
class TestRoomSchedule < Test::Unit::TestCase
def test_method
ans = [ Meeting.new('b', 1, 4), Meeting.new('e', 5, 7), Meeting.new('g', 8, 11),
Meeting.new('i', 12, 14) ]
input = [ Meeting.new('a', 3, 5), Meeting.new('b', 1, 4), Meeting.new('c', 2, 13),
Meeting.new('d', 5, 9), Meeting.new('e', 5, 7), Meeting.new('f', 0, 6),
Meeting.new('g', 8, 11), Meeting.new('h', 8, 12), Meeting.new('i', 12, 14) ]
assert_equal(ans, room_schedule(input))
end
end

