파이썬을 이용해 방배정하는 프로그램의 알고리즘을 어떤식으로 짜는지 궁금합니다.

조회수 1293회

저는 현재 고등학교 기숙사 생활을 하고있습니다. 저희 학교 기숙사는 방안에 책상이 배치되어 있어 수면 패턴이 맞지 않는 친구들과 같은 방을 쓰면 불빛 때문에 쉽게 잠을 잘 수 없습니다. 많은 친구들이 위의 문제 때문에 불편을 겪고 있어 제가 유일하게 아는 언어인 python으로 프로그램을 만들어서 도와주고 싶습니다. 만들고 싶은 프로그램은 기숙사를 사용하는 친구들의 수면시간을 조사해 수면시간이 비슷한 친구들에게 방을 배정해주는 프로그램입니다.!!

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 이 질문이 "프로그래밍을 통한 우리 주변의 문제 해결" 같은 류의 여름방학 과제 때문에 허겁지겁 나온 질문이 아니라고 전제를 한다면, 질문자님은 특정 "알고리즘"을 "파이썬"으로 구현하면 이 문제가 해결될 것이라고 진심으로 믿고 계신 것일 텐데요...

    ...그렇다면 말씀하신 아이디어는 다소 기술관료제(technocracy)적인 발상이기에 애초에 그런 알고리즘을 구태여 만드는 고생을 안 하셨으면 좋겠다는 생각이 있네요.

    1. 수면 패턴을 분석하고 대충 맞는 사람끼리 매칭시켜 준다는 것까지야 뭐 대수로울 것이 없죠. 이미 존재하는 테크닉들의 조합이 될 테니까요.
    2. 문제는 그 조합으로 성취하고 싶은 세상, 또는 성취될 세상의 모습입니다.
    3. 잘은 모르지만 기숙사 생활에 있어서는 자기 방 자기 자리가 되게 중요하지 않나요? 단지 수면 패턴이 비슷하다는 이유로 하루아침에 별로 원치도 않았던 새 자리로 이동하라고 하는 건 좀 불공평하달까 일방적인 처사가 되지 않을까요?
    4. 사람 수면 시간이라는 게 그렇게까지 기계적으로 일관되지는 않지 않나요? 일찍 자던 사람도 어떨 때는 더 공부하고 싶을 수 있고, 원래 잠을 잘 자던 사람도 스트레스 때문에 점점 잠을 못 이루게 될 수 있는데, 이 변화를 모두 캐치해서 방 배정을 처리할 계획인지요?
    5. 애초에 룸메이트라는 게 단지 수면 패턴만 가지고 매칭을 해 줄 일인지요? 성격이라든가 서로 친해질 수 있는/없는 요인이라든가 뭐 그런 것들이 있지 않나요? 혹시 이 파이썬 프로그램과 알고리즘은 그런 추가적 요소를 전부 배제할 계획인지요?
    6. "많은 친구들"이 "불편"해한다고 하셨는데, 문제 상황이라 여겨야 할 정도의 불편인가요? 실질적인 유무형의 누수와 피해가 발생하고 있는 것인가요 아니면 '아~ 이런거 있으면 좋겠는데' 정도의 불평인가요? 생각보다 많은 스타트업들이 '아~ 이런거 있으면 좋겠는데' 정도의 아이디어만 가지고 사업을 벌이고 망하기를 반복합니다.
    7. 무엇보다, 이게 방을 배치해서 해결할 문제일까요? 혹시 기숙사 공간을 잠만 쾌적하게 자는 곳으로 만들지 않고 모든 원생의 모든 생활을 무차별적으로 그런 공간에 구겨넣은 학교의 정책과 문화와 구조가 문제인 것은 아닐까요? 캘리포니아는 주거 문제가 심각한 곳인데, 어떤 머리 좋은 개발자가 기막힌 알고리즘으로 "팟셰어"라는 걸 개발했습니다. 침대 외의 모든 것을 공유하는 숙소를 좀 싼 가격에 빌릴 수 있게 해주는 서비스죠. 그래서 캘리포니아의 주거 문제가 해결됐냐고요? 어떨 것 같으세요?
    8. 아무리 생각해 봐도, 말씀하신 문제는, 정말 이런 문제가 존재한다면, 파이썬으로 해결할 문제가 아닙니다. 더 좋은 방음 커튼, 더 체계적인 원생 관리, 더 좋은 정책과 행정력이 필요한 문제죠. 예컨대 기숙사에 공부용 24시간 공간이 따로 있어서 누구든지 공부는 거기서 하라고 하면, 그래도 그 문제가 해결이 안 되는 부분일까요?

    저는 개인적으로 '최소 기술 추정의 원칙'이라는 걸 주장하고 싶은데, 어떤 문제든지, 기술을 통해서만 해결할 수 있다는 판단이 나오기 전까지는, 그 문제는 기술 없이 -- 기존의 도구와 사회적 협의로 -- 해결할 수 있다고 간주해야 한다는 겁니다. 어떤 기능을 하는 구현체를 개발하는 것과.문제를 해결하는 것은 서로 완전히 다르고, 보통은 후자가 전자보다 우선이기 때문이지요.

    이게 썩 개소리 같지 않다면, 한 번만 그 원칙을 이 문제에 적용해서 생각해 주세요. 그래도 파이썬이 꼭 필요하겠다 싶으시면, 그때 다시 구체적인 시나리오를 올려 주시면 좋지 않을까 합니다.

    • 안녕하세요 질문자입니다. 먼저 좋은 얘기 해주셔서 감사합니다. 제 질문을 다시보니 오해할만 하다고 생각합니다. 하루 아침에 별로 원치도 않았던 새 자리로 이동하라는 것은 이상하다고 하셨는데 저희 학교는 분기당 한번씩 기숙사를 재배치 합니다. 제 의도는 원치도 안았던 새 자리로 단지 수면 패턴만 맞게 이동시키는게 아니라 어짜피 방을 옮겨야되니까 이왕이면 수면패턴이 맞는 친구들끼리 방을 배치해주자입니다. 그리고 문제상황이라 여길만 한지 생각해 보라고 하셨는데 실제 많은 친구들이 이 문제 때문에 힘들어합니다. 밤에 제대로 잠을 자지 못하면 다음날 학업에도 악영향을 미치고 이런 생활이 반복되면 학업이 최우선인 고등학생들에게는 큰 문제가 됩니다. 애초에 기숙사 환경을 바꾸는게 최우선이지만 저희 학교 기숙사는 그럴 여건이 되지 못합니다. 기숙사 수용인원이 가득차 자습실을 만들수도 없습니다. 그래서 저는 아직 잘 다루지는 않지만 조금이라도 할 줄 아는 파이썬을 이용해 방 배치 프로그램을 만들면 어떨까 생각했던 것입니다. 알 수 없는 사용자 2019.8.24 15:07
    • 그렇군요. 그러면 다른건 몰라도 여러 사람들의 수면패턴이나 희망사항 같은 정보들을 취합해 적당히 클러스터링해주는 연산 정도는 프로그래밍으로 해줘야겠네요. 사실 여기서부터는 저도 배움이 얕아서 뭐라 답을 못드리겠지만.. pandas 같은 걸로 데이터 그룹핑을 해보는 데서 시작하실 수 있을것 같네요. https://www.shanelynn.ie/summarising-aggregation-and-grouping-data-in-python-pandas/ 제 추론은.. 왠지 학교에서도 한때는 룸메이트 매칭을 시켜주려고 했는데 아무리 해봐도 안되니까 그냥 3달에 한번씩 복불복을 돌리기로 한거 아닌가 싶네요 ㅋㅋ 엽토군 2019.8.24 17:59
  • 아주 단순한 알고리즘을 제안해 보면,

    각 학생의 수면패턴은 시간단위의 벡터로 표현합니다.

    0시부터 6시까지 자는 학생의 벡터는 (1, 1, 1, 1, 1, 1, 0, 0, 0, 0, ..., ) 와 같이 될 겁니다.

    이런 데이터가 모였다면, 각 벡터들 중 비슷한 것을 찾아서, Va와 Vb 간의 거리를 구합니다. 이 거리를 구하는 방법은 여러가지가 있을 수 있습니다. 가장 간단하게 생각할 수 있는 것은, Va-Vb 벡터의 크기를 구하는 것이겠습니다. 1시부터 6시까지 자는 학생A와 0시부터 6시까지 자는 학생 B의 벡터의 차는 (1, 0, 0, ... ) 이 될 것이고 이 벡터의 크기는 1입니다.

    이런 식으로 거리를 구할 수 있다면, 둘씩 조합할 수 있는 모든 경우의 수 가운데, 거리의 합이 가장 적은 것을 택하면 되겠습니다.

    • 이런 식으로도 생각할 수 있다니 놀랍군요. 좋은 아이디어 감사합니다. 알 수 없는 사용자 2019.9.8 23:14
    • @코딩조아 : 대단한 것은아니고, 머신러닝의 클러스터링을 아주 단순하게 표현한 것입니다. 해당 키워드로 검색해서 공부해 보세요. nowp 2019.9.16 14:18

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)