UCPC는 개인이 진행하는 가장 큰 알고리즘 문제 풀이 대회 중에 가장 큰 프로그래밍 대회라고 해도 과언이 아닙니다. UCPC는 많은 알고리즘 문제 풀이를 하는 사람이 참여하고, 올해에는 오프라인으로 대회를 다시 바꾸면서 이것저것을 알아보고 있습니다.
  UCPC 운영을 맡으면서 한 일 중 하나는 UCPC 본선 진출 자격을 바꾸는 것이었습니다. 학교별 1팀 선발과 여성 및 비전공자 팀 추가 선발을 넣었습니다. 이렇게 바꾼 이유는 여럿이 있습니다.


  하나는 UCPC를 좀 더 교류의 장으로 만들고자 했습니다. 흔히 들어봤을 케빈 베이컨의 6단계 법칙은, 지구에 있는 사람들이 6단계 이내에서 아는 사람과 연결될 수 있다는, 어떻게 보면 세상이 매우 좁다는 법칙이었습니다. 생각보다 나는 내 주위 사람만 아는 것 같은데, 해외에 있는 사람을 알지도 못하는데, 어떻게 연결될 수 있을까요?
  실제로 사람은 자기 주위의 사람을 많이 알지만, 우연히 지금은 자기랑 떨어져 있지만 다른 먼 클러스터에 속한 사람을 많이 알고 있습니다. 얼핏 보면 관계가 없어 보이는 두 사람이 한두 사람을 거쳐 아는 이유에는 알고 있지만 멀리 떨어져 있는 사람의 역이 큽니다. UCPC도 이런역할을 하고 싶었고, 각 학교의 사람이 클러스터가 되어서 학교와 학교끼리 서로 교류하면 좋을 것이라는 생각을 했습니다.


  또한, 여성 및 비전공자 팀 추가 선발하는 이유는, 특정 집단이 알고리즘 문제 풀이에 접근하기 힘들었던 것을 해결하기 위해서도 있습니다. 저는 이렇게 벽이 있는 이유에는 구조적 문제점이 작용한다고 말합니다.
  다음의 예를 봅시다. 어떤 대회에 선발되는 국가대표가 대부분 1~4월에 태어났고, 5월 이후에 태어난 사람이 없다고 합시다. 이는 생일이 실력에 영향을 끼쳤다고 판단하는 것보다, 생일로 사람이 갈릴 수밖에 없는 구조적인 문제가 발생한다고 판단하는 것이 옳습니다. 이는 실제로 캐나다 하키 대표팀에서 일어난 것입니다. 캐나다 하키팀은 생년을 기준으로 리그를 나누는데, 5~6살 정도 되는 어린 나이에서는 출생 연도가 같아도 생일에 따라 큰 체격 차가 나게 됩니다. 이렇게 생일이 앞에 있는 사람이 뒤에 있는 사람보다 먼저 수상을 하고, 이것이 성장 후에 국가대표 선발에도 영향을 미칩니다. 이렇게 우리가 언뜻 보기에는 아무 상관이 없이 "임의"로 정한 것에도 구조적인 차별이 발생합니다.
  이런 구조적인 문제를 해결하려면 어떻게 해야 할까요? 하키팀의 문제로 돌아오면, 우리가 1~4월생만 집중하는 것이 아닌, 5-12월생에도 추가로 기회를 주면 됩니다. 이러면 하키팀에 참여할 수 있는 후보가 3배가 됩니다. 그러면 더 좋은 선수가 나올 가능성도 3배가 되겠죠. 이는 하키팀에 분명한 이득일 것입니다.

 

  프로그래밍에서의 여성도 예외는 아닙니다. 여성은 피임 도구가 발명되어 사용되기 전까지는 본인의 재생산 능력의 노예였습니다. 농업시대에서의 인구수는 곧 노동력을 뜻하니까요. 현재의 가치관은 많이 바뀌었습니다. 자연을 지배하고, 양적인 풍요를 추구하던 가치관에서, 조화를 꾀하고 질적인 행복을 추구하는 가치관으로 바뀌었습니다. 그런 사회에서도 아직 과거의 구조적인 문제는 남아 있고, 이 구조적인 문제는 적극적으로 해결되어야 합니다. 사실, 이는 여성 개개인에게서만 이득이 아니라 프로그래밍 분야 전체에서 이득입니다. 여성을 추가로 지원하게 되면 결과적으로 프로그래밍 분야를 이끌어 줄 사람이 2배가 되는 것입니다.

  비전공자의 경우도 마찬가지입니다. 왜냐하면 한국에서 전공은 선택하는 것이 아닌 경우도 많기 때문입니다. 성적에 따라 학교에 가는 경우가 많고, 대학의 이름을 위해서 과를 포기하는 경우도 많습니다. 프로그래밍 분야는 2016년 이후에 매우 인기가 많아졌으며, 프로그래밍에 관심이 있는 사람이 다른 성적 기준을 맞추지 못해 다른 과에 들어간 경우도 분명히 있습니다. 아쉬운 일이지만, 이 사람이 계속 프로그래밍을 즐길 수 있게 하고 싶었습니다.

 

  결국, 이런 본선 진출 자격 변경으로 인해서 이루고 싶은 것은 알고리즘 문제 풀이를 하는 사람의 결속력을 강화하며, 구조적 문제로 소외당하였던 사람도 참여시켜서 더 알고리즘 문제 풀이 커뮤니티를 풍요롭게 만드는 것입니다. 개인이 대회를 운영하기 때문에 이런 발걸음을 내디딜 수 있었다고 생각합니다. 이런 분위기가 확산하여, 프로그래밍 분야를 이끌어 갈 수 있는 사람이 더 많이 나왔으면 좋겠습니다.



 

'생각들' 카테고리의 다른 글

UCPC의 본선 진출 자격 변경에 대해  (106) 2022.05.12
내 부끄러운 이야기  (0) 2022.04.12
물리적인 세상 [Draft]  (0) 2021.12.23
지식의 반감기, 진로와 달리기  (0) 2021.11.11
한국에서 PS를 공부하기 위한 방법?  (0) 2019.05.21
동아리 하제  (0) 2018.08.27
  1. 이전 댓글 더보기
  2. ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 2022.05.13 22:19

    https://ucpc.me/qualifier/#%EB%B3%B8%EC%84%A0-%EC%A7%84%EC%B6%9C%ED%8C%80-%EC%84%A0%EB%B0%9C

    2022 대회요강

    참 처참하고 암담하네요. 남들보다 더 노력해서 1등을 하지 못했지만 그래도 높은 점수들을 받은 사람들이 여성참여자와 비전공자가 아니라는 이유로 좋은 기회를 내줘야한다니 참 입장바꿔 생각해보면 정말 어이없고 화날듯. 그리고 저걸로 다른 사람 기회 밀어내고 올라간사람도 정말 당당히 인정받을수 있을가나 모르겠네

    • 2022.05.13 22:22

      높은 점수를 받는 팀은 그대로 올라가고 추가로 선발하는건데 그렇게 불안해 하시는걸 보면… 혹시 설마 실력으로 올라갈 능력은 없고 처음부터 추가선발을 노리시나요?

    • Zz 2022.05.13 22:25

      추가선발도 본선 진출 최저선이 있을것인데, 그 기준선에도 들지 못해서 추가선발때문에 본선 진출할 기회뺏긴다고 남탓하면 누워서 침뱉기인거 아시죠?

    • ㅇㅇ 2022.05.13 23:13

      똑같이 못해도 어느 팀은 올라가고 어느 팀은 떨어진다는 거를 지적하는 댓글인데 댓글 쓰신 분을 못하는 사람으로 몰아가는 모습이 정말 인상적입니다 ㅎㅎ

    • ㅋㅋㅋㅋ 2022.05.14 00:46

      뭐 압도적 1등이라면 아무런 걱정이없겠지. 압도적 1등 외에도 분명 저 대회 본선만이라도 참고를 하고 싶어하는사람도 충분히 많을거고 그 사람들을 뽑는 기준에 성별이 들어가니 분노하는거아님??

    • 1113 2022.05.14 00:49

      다들 지능과 이해력이 딸리는거같아서 다른 예시를 하나 더 들어주자면 대학입시에서 턱걸이에 걸쳤는데 나보다 점수가 낮거나 비슷한사람이 여자란 이유로 합격되고 난 그 기회조차 못받는거임 거따대고 어유 니가 남잔데 공부 더 잘했어야지 하는거랑 뭐가다름ㅋㅋㅋㅋ 양심이 손을얹고 같은 입장이 되었을때 안 억울할 자신있음??

  3. aaaa 2022.05.13 22:40

    2022 수능 수학 1등급 비율 남학생 75%.. 수능에서조차 성별간 구조적 차별이 존재하나 봅니다. 이를 해결하기 위해 1등급 여성 할당제나 여성추가점수제도 등을 도입해야 할 것 같습니다.

  4. 닉네임이다 2022.05.13 23:57

    비율이 적은 집단의 참여를 장려하기 위해 할당제를 도입하는 것은 좋은 아이디어인것 같습니다

    제가보기엔 소말리아 유학생의 비율이 턱없이 부족하니 소말리아 유학생 한팀 할당이 필요합니다 비율이 턱없이 부족하니 구조적인 차별을 받고있는게 분명합니다
    그러고보니 적도기니 유학생의 비율도 부족하네요 국가별 유학생 1그룹씩 100개 팀 할당하셔서 취지에 맞는 장려활동이 될 수있길 바랍니다 누군가가 피해보지 않도록 100개팀은 추가 할당으로만 해야할것같네요

  5. asdf 2022.05.14 00:46

    젠더갈등이 너무 심해서 댓글창이 난리 났지만 다른 문제도 있다 생각합니다.

    일단 비전공자의 기준이 어디까지인지 알기가 어렵습니다. (정보시스템? 빅데이터? 수학과? 전자과? 전기과?)
    다중전공 부전공 복수전공도 많이 해서 더욱더 흐려진것 같습니다.

    비전공자 2인 이상 팀, 여성 2인 이상 팀에 대한 추가선발을 한다 했는데 1인 캐리팀을 막을 방법이 전혀 없다고 생각합니다.
    솔직히 악용할 가능성도 너무 높습니다. ucpc팀원을 못 구했지만 나가고 싶어서 그냥 아무나 팀원으로 올려놓고 혼자 푸는 사람도 봤는데 그런 사람들이 충분히 활용할 가능성이 너무 높습니다.

    비전공자들이 꼭 못하지도 않는 것 같습니다. 요즘은 중고등학교 때 부터 정올하고 오는 사람이 워낙 많다보니 꼭 그 정올러들이 컴공을 오지는 않고 의예과를 가거나, 높은 대학의 낮은과를 가서 반수 준비하거나 전과 준비를 많이 하더군요. 실제로 제 기억상 저희학교 신입생 프로그래밍 대회는 2~3년간 컴공 신입생이 1등을 못했습니다. 비전공자 2인 이상 팀도 취지와는 다르게 그냥 원래 고인물인데 과만 컴공이 아닌 사람이 혜택을보지 않을까 하네요.

    또 하나의 문제점을 얘기하면 '추가선발'이라는 것은 사실상 할당제라는 것입니다. 제 경험상 UCPC는 항상 많은 인원을 수용할 공간 대여에 난항을 겪었던 것 같습니다. 힘들게 구한 공간에서도 최대한 많은 팀을 선발하기 위해 그 공간에 정말 꽉 차게 있었죠. 이번에도 아마 그렇게 진행을 할 텐데 온라인에서는 추가 선발이 가능하지만, 오프라인 대회에서는 추가 선발이 아니라 사실상 그 공간에 들어갈 다른 팀 대신 뽑는 할당제입니다. 현재도 본선 팀이 정확히 몇 팀 올라가는지 정확히 공지 안되어 있고 애매하게 적혀 있는데 공간을 구해 공간 크기가 확정되면 그 공간에 들어갈 파이를 나눠 가지기 때문입니다.

    마지막으로 여성에 대한 얘기는 짧게 하겠습니다. 이미 많은 사람들이 댓글을 달았듯이 "구조적 문제"라는 게 과연 무엇인지 납득시키지 못하고 있습니다. 단순히 납득 못하는 사람을 못 배운 사람 취급하면 끝날 문제가 아니라 설득력을 강화할 사례나 논리를 보충해야 할 것 같습니다.

  6. qwer 2022.05.14 00:50

    그 어느 분야보다 실력을 중요시하는 영역인데, 그 근본을 부정하고 있네요.

    능력과 결과로 보여주면 될 것을 말도 안되는 잣대를 들이밀고 있는걸 보니 참 안타깝습니다.

    글에 동조하시는 분들 모두 부디 그렇게 "배려" 받아서 뽑힌 여성분들과만 같이 일하길 바라겠습니다.

  7. 논리 2022.05.14 02:23

    하키팀의 예는 구조적 문제라고 볼 수 있지만, 여성의 프로그래밍 진출 문제에는 구조적 문제를 과거에 빗대어 설명하셨네요. 구체적인 근거를 대셔야 논리적으로 탄탄한 글이 될 것 같습니다. 말씀하신것처럼 어느 분야나 많은 사람이 진입하면 관련 분야는 활성화됩니다. 마치 딥러닝에서의 최근 많은 유입이 성과를 내고 있는것처럼요. 하지만 산업에 도움이 될 것이다라는 것은 너무 당연한 이야기이고, 지금 활성화 유무를 떠나 말씀하시는 부분은 실력에 의한 경쟁 제도입니다. 무리하게 권한을 달라고 하시기 전에 실력을 키울 생각을 해보는건 어떠신지요.

  8. ttt 2022.05.14 02:31

    좋은 생각 잘 읽었습니다. 다만 UCPC 홈페이지를 둘러보니 약간 아쉬운 부분이 있어 댓글을 남깁니다.
    프로그래밍 대회는 참가하는 팀이 중요한 만큼 출제되는 문제 또한 아주 중요한 부분을 차지합니다. 그럼에도, call for task페이지에서는 특정 집단에서 출제하는 문제들이 출제될 기회는 보이지 않는 것 같습니다. 이 블로그를 보면 글쓴이께서 아주 높은 수준의 출제자이시고, 여성이시며, 이번에도 문제를 출제 하실지 모르겠지만, 결국 홀로 모든 여성을 대표하실 수 있다는 것은 아닐 것입니다. 그러니 글쓴이님 이외의 여성/비전공자 출제자의 문제가 반드시 출제될 수 있도록, 문제를 선택하는 과정 또한 개선되어야 하겠습니다. 결국 소수가 목소리를 낼 수도 없이 그저 관상용으로만 존재한다면, 여전히 그들만의 대회인 것과 다를 것이 무엇이겠습니까?

  9. 개발자 2022.05.14 06:20

    당신이 pc주의에 빠져서 이딴 글 쓸 시간에 다른 실력자들은 열심히 공부해서 실력을 올리고 있을건데.. 실력은 안되는데 코딩해서 돈은 벌고싶고 그치?? 또 징징거리는 거뭐 하아.. 미안한데 소프트웨어 영역까지 이딴 감수성 쳐꺼내들고와서 해줘 하지마세요. 실력만 보고 뽑겠다고 블라인드 채용까지 하는 마당에 이게 뭔 개듣보잡 소리야. 그냥 평생 그렇게 사회적 구조 탓이나 하면서 사세요. 보아하니 정렬 알고리즘도 bubble sorting도 겨우 이해해서 다른 최적화된 알고리즘은 손도못대는 ♩♩♪♩라 자신의 탓을 외부 환경의 탓으로 돌리는 침팬지 같은데, 부디 동료들 힘들게 하지말고 다른 분야 알아보시면 감사하겠습니다

    • ㅇㅇ 2022.05.14 09:06

      님보단 많이 벌듯..

    • ㅇㅇ 2022.05.14 18:48

      글쓴이 분 국대던데ㅋㅋ 억대연봉 버실듯ㅋㅋ 정렬 알고리즘을 모르긴 무슨... 모르는 알고리즘이 없을거같은데?

  10. 행인 2022.05.14 06:48

    근데 ucpc?? 이런 듣보잡 행사에서 우승하면 뭐있어요?? 일단 이글을 봐버렸기 때문에 이력서에 ucpc대회 수상 이력은 무시할거같네요. 특히 수상자가 여자라면 더욱 ㅋㅋ 실력도 없는데 할당제로 수상했네?라고 생각들거같은데 왜 이렇게까지 여성들을 본인 스스로 낮추는지 이해가 안되네요. 코드짜지말고 열심히 사회운동해주세요. IT업계 물 더러워지니까

    • p-adic 2022.05.14 07:56

      제가 일일히 이런것까지 다 지적을 해줘야하는지는 모르겠지만, 님 UCPC라는 대회가 뭔지 모르시죠? 예선에서 본선으로 진출하는 과정에서 할당제를 사용하는거고 본선의 수상과 무관한겁니다.

  11. ㅇㅇ 2022.05.14 08:38

    회장 개인에게 이렇게 날 선 비난이 쏟아질 일인가 싶네요. 부당한 제도라고 생각되면 공식적으로 항의하면 됩니다. 댓글처럼 익명으로 비꼬는 것이 아니라요.

    별개로 UCPC는 지금껏 개인 행사라고 할 만큼 회장이 거의 무급봉사에 가까운 일들을 하며 진행된 행사로 알고있습니다. 그 과정에서의 결정 하나가 이렇게 과도한 비난을 받아야 하는지는 모르겠습니다. 전대프연의 기조와 맞지 않는다는 지적이라면 대부분의 역대 회장들은 지금의 변화를 긍정적으로 생각한다고 알고 있습니다.

    부당한 제도라고 생각한다면 UCPC에 참가하지 않는다는 선택지도 존재합니다. 공정성을 담보하는 새로운 대회를 진행해도 좋습니다. PS판에 대회가 늘어나는 건 좋은 일이니까요.

  12. ㅇㅇ 2022.05.14 09:18

    글 잘 읽었고 좋은 변화 응원합니다. UCPC와 PS 커뮤니티의 포용력과 도전에도 늘 감사의 말씀을 전하고 싶습니다.

    어떻게 생각을 정리할까 했는데, 원댓 분께서 갈무리 잘해주셨네요. PS 커뮤니티 구성원의 배려와 다양성을 장려하는 방향은 좋은 의도에서 비롯된 것이며 세계 각지의 커뮤니티에서도 점차 공감대를 넓히고 있습니다. 전대프연의 역대 운영진들이 대부분 긍정적인 의사를 보이는 것도 이에 걸맞는 결과일 것입니다.

    물론 지금의 정책에 동의하지 않는 분도 있으리라 생각합니다. 저도 그분들이 공식적인 창구에서 문제점을 공론화해 주신다면 정책 상의 맹점을 보완하고 좋은 의도에 부합한 좋은 정책을 완성하는 데 큰 보탬이 되리라 기대합니다. 반면, 대안 제시 없이 조롱에 그치거나 운영진 개인의 인신을 공격하는 것으로는 결코 이 목표를 달성할 수 없으리란 것은 본인 스스로가 가장 잘 아실 것입니다. 적어도 PS 커뮤니티를 사랑하는 마음이 더 크시다면, 더 나은 모습 보여주실 수 있을 것입니다.

    추가로, 새로운 기획의도로 커뮤니티 구성원을 지원해 주시고 싶으시다면, 새로운 대회를 진행하여 PS 커뮤니티에 이바지 해주셔도 굉장히 감사하겠습니다.

  13. ㅇㅇ 2022.05.14 11:21

    글쎄요. 여성 및 비전공자라는 이유로 특혜를 주어야 한다는 결론에 동의하기 어렵습니다.
    기회는 평등해야 하고 결과는 공정해야 합니다. 성별 및 전공에 상관없이 동일하게 경쟁하고 동일한 기준을 주어야지요. 특정 조건에 속한다는 이유로 편의를 봐주어야 하나요?
    저는 여성 프로그래머입니다. 제 실력으로 평가받고 싶습니다. 제가 뛰어난 결과를 얻어도 제 실력이 아니고 여성이라는 이유로 이익을 얻었다고 판단될까 두렵네요.

    구조적인 차별이 있다는 말씀에도 동의하기 힘듭니다. 여자면 컴공과로 진학에 어려움이 있나요? 여자라는 이유로 교수님의 강의 내용이 달라지나요? 비전공자는 키보드를 두드리는데 어려움이 있나요?

    It는 그 무엇보다도 실력으로 평가받는 분야입니다. 신체적인 요소의 개입도 없고 학력에 대한 제한도 적습니다. 이처럼 실력만으로 경쟁하는 판에서 오히려 공정성을 해치는 선택이 되지 않길 바랍니다.

  14. ㅇㅇ 2022.05.14 11:52

    요즘 늘어나는 중국인 유학생들을 위한 중국인 팀 할당 선발제는 어떨까요? 한국에서 알고리즘 공부를 하는데 얼마나 어려움이 많을지... ucpc 본선 진출자 중에 구조적인 문제로 중국인 팀이 많지 않은것으로 아는데 중국인할당제로 이런 문제를 풀어 대화합의 장이 열렸으면 좋겠습니다.

  15. ㅇㅇ 2022.05.14 13:29

    너무 어려운 문제인 것 같습니다.

  16. . 2022.05.14 16:08

    이걸 보고서 무슨 말을 해야 할지 모르겠습니다. 본선까지 다 끝나면 이런 규정이 잘 세워진 건지 아닌지 드러나겠죠 뭐.

  17. 2022.05.14 16:51

    8-9번째 문단은 전혀 납득이 가지 않습니다. 먼저 8문단에서 '여성을 추가로 지원하게 되면 결과적으로 프로그래밍 분야를 이끌어 줄 사람이 2배가 된다'고 하셨는데, 그렇게 되려면 이 분야의 교육이나 연구 쪽에서 개선이 일어나야 할 겁니다. 대회에 적용하는 것이 프로그래밍 분야를 이끌어 줄 사람이 늘어나는 것과 무슨 상관이 있나요? 설령 자신이 운영하는 부분에 대해서라도 변화를 주자는 의미가 담겨 있었다고 하더라도 단기적으로도, 장기적으로도 좋은 대안은 안 될 것 같습니다.

    9문단을 읽어 보면 '비전공자는 대학 진학 후 프로그래밍을 많이 즐기지 못했다'는 전제가 깔려 있는 것으로 보입니다. 그리고 추가 선발에 비전공자 팀에 관한 내용이 있기 때문에 '비전공자는 프로그래밍을 많이 즐기지 못해서 실력에서 손해를 보았고, 그 손해는 팀의 본선 진출 여부에 영향을 줄 정도이다'는 전제도 깔려 있을 겁니다. 그런데 당장 위쪽에 있는 댓글들만 봐도 '그 사람들이 실력에서 별로 손해를 안 보더라'라는 내용들이 보입니다. 이걸로 일반화를 하는 것은 무리이지만, 이런 의견이 그냥 한번 나왔다가 별 상황 없이 지나가는 것도 아닌데 실제 실태가 어떤지 사전에 조사라도 했으면 좋았겠다는 생각이 듭니다. 그랬다면 좀 더 설득력 있게 의견을 전달할 수 있었겠죠.

    [이 부분은 여담인데, 현재 UCPC 관련 사이트 어디를 찾아봐도 비전공자의 기준이 어디까지인지는 나와 있지 않습니다. 이런 것도 사전에 명시가 되어 있어야 논란이 줄어들 수 있다고 생각합니다.]

    이런 종류의 글은 읽는 사람들을 어느 정도 납득시킬 수 있어야 하는데, 댓글을 보면 그런 목적을 달성하지 못한 것 같네요.

  18. ㅇㅇ 2022.05.15 04:46

    그냥 실력 있는 팀 다 지원하지말고 대회 개쳐망해서 지원 다 끊겼으면 좋겠네요

    본문 논리는 너무 빈약해서 뭐 꼬집어서 반박할 필요도 없고

    • ㅇㅇ 2022.05.15 09:33

      본인이 실력있는 팀이 되어서 보이콧 할 생각은 안 해봤나요?

    • ㅇㅇ 2022.05.15 17:31

      그럼 저 문제들을 미국 대통령이 돼서 바꿀 생각은 안해보시나요? 개억지로 열등감 프레임 씌우고 실력주의 운운할거면 적당한 논리를 들고오세요

      왜 멀쩡한 참가자 전원에게 정신병을 강요합니까
      그냥 코딩만 하는데 뭔 이념이 나오고 약자가 나오냐고ㅋㅋ

    • ㅇㅇ 2022.05.15 18:24

      본인이 보이콧 하는 게 아무 영향력이 없다는 걸 너무 잘 알고 있는 거 같아서 안쓰럽네요...

    • ㅇㅇ 2022.05.15 22:48

      적어도 멀쩡한 대회 참가자들한테 정신병 강요하는거 보단 낫죠ㅋㅋ

    • ㅇㅇ 2022.05.16 06:30

      아무도 UCPC에 참가하라고 강요한 적이 없을텐데 피해망상이 지나치신 거 같아요

  19. Vi전공자 2022.05.15 19:26

    어쩌면 청춘이란, 지금 여러분이 귀중한 젊음을 소비하는 모습과 같이, 귀중한 것을 낭비하는 시기를 나타내는 단어일 수 있겠다는 생각이 듭니다. 부디 여러분이 청춘에 끝에 다다랐을 때, 자신이 어떤 삶을 위해 귀중한 시간을 소비해 왔는지 돌아보며 후회하지 않기를 바랍니다.

  20. 비전공자입니다 2022.05.17 14:36

    개발 쪽으로 커리어를 전환하려는 비전공자입니다.

    워낙 잘하시는 분들이 많아 스스로도 입상할 수 있을 정도의 수준까지는 아니라는 것은 알고있어서
    본선 진출까지는 노려보고 싶어 본선 진출을 목표로 다함께 열심히 노력하고 있었습니다.

    그런데 이번 규정으로 인해 본선 진출 후 입상을 못하면 "저 UCPC 본선 진출해본 경험이 있습니다." 라는 말은 더이상 할 수 없을 것 같습니다.
    팀원들도 좀 침울한 분위기에요. 등록만 하면 본선 진출이 되는데 본선 진출했다고 어디 적어서 낼 수도 없을 것 같다고... 객관적으로 생각했을 때 그렇잖아요... 입장을 조금만 다르게 보면 저같은 비전공자 뿐만 아니라 여성분들도 같은 처지가 되어버린 상황입니다...

    다 생각하시는 바가 있으셔서 밀어붙이셨겠지만, 이런 처지가 되어버린 사람들도 있다는 것을 알아주셨으면 좋겠다는 마음에 이렇게 작성하게 되었습니다.
    하고 싶은 말은 많지만, 하시는 일 잘되시길 바라는 것으로 얼버무리려 합니다.
    글 읽어주실지는 모르겠으나, 읽어주셔서 감사드립니다.

  21. Real minority 2022.05.19 22:25

    솔직히 말해요. 메저리티는 영원히 안 될 거 같으니까 메저리티에 영합하고 싶어서 페미코인 탔다고. 페미니즘 하는 건 좋은데 그래봤자 주류 페미니즘 하에서 어차피 배척당할 처지면 아무 의미 없는 거 아닌가?

    • Real minority 2022.05.19 22:30

      아니 그리고 주최측이 선정한 기준에 의해서라고 했는데 그 기준도 뭔지 공개가 안 되어 있네 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 적어도 '사회에서 상식 있는 곳에서 돌아가는 여성 할당제'의 경우-물론 윗댓들은 그것에 대해서도 심한 거부감을 가지고 있습니다만, 주류 페미니스트는 그걸 지지하는 입장이니까-적어도 마이너리티 중 실력으로 위에서 친다라는 명확한 기준이라도 있지 이거 뭐 코에 달면 코걸이고 귀에 달면 귀고리 아닙니까? 같잖게 여성할당제 코스프레한 결국 '주최특별팀'이라는 거잖아요?

  흔히 컨닝이라는 말로 많이 불리는 부정행위를 뜻하는 올바른 영어 단어는 치팅입니다. 좁은 의미에서는, 평가를 볼 때 응시자가 하는 불법적이거나 비도덕적인 행위를 말합니다. 넓은 의미의 치팅은 규칙에 반하는 행위를 하는 것 전체를 의미합니다. 치팅에는 여러 가지가 있습니다. 흔히 생각하는 컨닝페이퍼(cheat sheet)가 허용되지 않는 시험에서 몰래 보는 것이나 전자제품을 사용하는 것부터 시작해서 리포트나 과제를 인터넷이나 지인으로부터 전부 베끼는 것도 치팅에 해당합니다. 물론 보여준 사람도 치팅을 한 사람입니다.

  저는 치팅을 매우 싫어합니다. 도둑이 제 발 저린다는 옛말이 맞을지는 몰라도 동시에 저는 치팅을 매우 많이 해 온 사람이기도 합니다. 치팅을 싫어하는 모든 사람이 치팅을 많이 하지는 않았으니까 오해는 하지 않으셨으면 합니다. 동시에 저는 치팅에 대한 강경한 정책을 펼쳐야 한다고 계속 말하는 사람입니다. 제가 한 치팅은 남에게 과제를 보여준 적은 물론 있고 돈을 받고 남의 과제를 하기도 해 봤으며, 프로그래밍에 관련된 교육을 받을 때 소스 코드를 외부에서 가져온 것도, 평가를 볼 때도 사실상 cheat sheet을 사용한 것과 다름없는 행동을 한 적도 있습니다. 저의 부끄러운 이야기입니다.

  다행인 점은 이 내용 모두가 결국은 들켰다는 것입니다. 치팅은 어느 순간 들키게 됩니다. 남에게 과제를 보여주면 많은 부분이 보고 썼다는 느낌이 나게 됩니다. 이것이 쌓이면 여러 정황 증거가 쌓입니다. 소스코드를 다른 곳에서 베꼈으면 치팅이고 전부 잡아낼 수 있습니다. 소스코드 순서를 바꾸거나 주석을 추가하거나 하는 등의 행위도 마찬가지입니다. 저는 한 온라인 대회가 끝나고 나서 치팅을 잡기 위해서만 거의 30시간 정도를 사용했습니다. 이런 치팅을 많이 해 본 적이 있는 사람이 잡는 치팅을 피할 수 있을까요? 물론 들키지 않을 수도 있습니다. 수법이 교묘하면 교묘할수록 찾아내기 힘든 것은 사실이니까요. 하지만 이런 치팅은 습관화가 되고 여러 번 하게 되며 반복하는 동안 실수를 하게 됩니다. 그래서 발각되면 이전의 치팅에 대해서도 처벌을 받을 것입니다. 사실, 이전에 했던 행위에 대해서는 물증이 없어서 치팅을 처벌하지 않고 있던 것이지 한 번 발각되면 이전의 치팅에 대해서도 같이 죄를 물을 수 있습니다.

  제가 치팅에 대해 강경한 정책을 펼쳐야 한다고 말하는 이유는 이러한 치팅은 습관화가 되고 다른 사람의 의욕을 갉아먹기 때문입니다. 치팅은 고평가라는 보상을 얻는 매우 쉬운 수단입니다. 그렇기 때문에 뇌는 적은 노력으로 많은 보상을 얻을 수 있는 치팅을 계속하게 되고 만성화됩니다. 나중에 가면 그 보상에 대해서도 무뎌지게 되는데 이러면 모든 일에 대해서 노력하지 않으려고 할 수도 있습니다. 이것은 치팅한 사람을 볼 때도 마찬가지입니다. 본인은 노력했는데 타인은 적은 노력으로, 그것도 부당한 방법으로 고평가를 받은 것은 본인의 노력에 대한 가치를 저평가하기 쉽고 비슷하게 치팅을 시작하기 쉽게 됩니다. 이것이 반복되면 평가와 학습을 한다는 본래의 목적은 변질하고 사라져버립니다.

  치팅은 역사적으로도 오래되었고 시험이 존재했을 때부터 함께했습니다. 그리고 사실 많은 사람이 시도해 봤을 것으로 생각합니다. 부끄러운 일이지만 누구나가 거쳐 갈 수 있는 길이기도 합니다. 사람이 고평가를 많아야 하는 이유는 많으며 여러모로 중요한 일이기도 합니다. 평가가 중요한 만큼 다른 사람은 고평가에 상응하는 기대를 하고 오히려 이 기대는 치팅보다 더더욱 끊기 힘든 것일 수도 있습니다. 이렇게 상습적으로 치팅을 하는 것의 결말은 당장 타인의 기대를 충족하지 못하는 것보다 비극적입니다. 치팅을 하고 있었다면 다시 올바른 길로 돌아왔으면 합니다. 열심히 공부하고 열심히 노력해서 평가받는 것이요. 물론 이전과 같은 노력을 하는 방법을 까먹었을 수도 있습니다. 하지만 다시 시작하면 됩니다. 지금이라도 올바른 길을 걷는 것이 본인을 더더욱 잘 알고, 본인이 보람과 성취감을 느끼는 가장 좋은 길이라고 생각합니다.

'생각들' 카테고리의 다른 글

UCPC의 본선 진출 자격 변경에 대해  (106) 2022.05.12
내 부끄러운 이야기  (0) 2022.04.12
물리적인 세상 [Draft]  (0) 2021.12.23
지식의 반감기, 진로와 달리기  (0) 2021.11.11
한국에서 PS를 공부하기 위한 방법?  (0) 2019.05.21
동아리 하제  (0) 2018.08.27

  저는 오픈리 퀴어입니다. 제가 퀴어라는 걸 굳이 밝힐 필요가 없을 때는 밝히지 않지만, 굳이 숨기지도 않으며, 많은 표현을 하고 다닙니다. 유난히 페미닌한 옷을 즐겨 입습니다. 이렇게 제가 오픈리 퀴어가 될 수 있는 이유는 제가 능력적으로 큰 성공을 거두었기 때문이라고 생각합니다.

  한국에는 성차별적인 정서가 보이는 형태든, 사람의 무의식적인 편견 속에서든 남아 있습니다. 그리고 그런 편견을 "깨부숴줬다"라고 하는 인터넷 커뮤니티 글은 대부분 "여성이라서 사람들이 나를 무시했는데, 좋은 능력을 보여주니까 아무 말 못 하더라"였습니다. 물론 저는 이런 일화를 긍정적으로만 바라보지는 않습니다. 하나는 그들은 다시 좋은 능력을 보여주지 못하는 여성을 무시할 것이고, 다른 하나는 한국에서 능력주의와 엘리트주의가 성차별보다 더 심하다는 것을 나타내주기도 하기 때문입니다. 이 능력 차이가 많이 나면 많이 날수록 그 사람의 개성은 "이상한 것"에서 "그 사람의 특징"이 되고, 저에게 있어서는 사람들이 이상하다고 느끼는 퀴어리티가 그렇습니다. 저는 이걸 적극적으로 활용합니다. 저의 능력은 저의 퀴어리티를 마음껏 표현할 수 있게 해 주는 도구이고, 그래도 특색으로 인정하는 게 사회의 시선이고, 퀴어리티를 사회에게 익숙한 것으로 끌어올리는 것이 목적입니다.

  저는 한동안 퀴어리티를 가진 사람들의 커뮤니티에서 많은 교류를 했습니다. "신드롬"이라는 닉네임을 사용했고, 지금도 저를 닉네임인 신드롬 님 이라고 불러주시는 분도 종종 있습니다. 하지만 앞으로는 교류가 적어질 것 같습니다. 가장 큰 이유는, 퀴어리티가 제 삶의 일부이고, 어떤 두 사람을 퀴어라는 연결로 묶기에 퀴어는 매우 느슨한 연결이기 때문입니다. 같은 지향성과 정체성을 가지고 고민한다면 어느 정도는 많이 연결될 것도 같지만요. 제가 어떤 사람과 서로 퀴어라는 공통점만 있을 때 친해지기란 쉽지 않다는 판단이었습니다.

  제가 해당 커뮤니티에 들어가지 않는다고 퀴어가 아니게 될 것도 아니며, 퀴어를 향한 지원을 멈추지도 않을 것이고, 운동을 멈추지도 않을 것입니다. 그중 하나가 제가 오픈리 퀴어라는 점입니다. 하지만, 이게 나의 삶의 전부가 되기를 원치는 않습니다. 저는 하고 싶은 게 많기 때문입니다. 퀴어리티는 저의 "특색" 중의 하나입니다.

  어떤 비슷한 두 사람이 있는데 그중 한 명이 퀴어인 것을 알면, 아마 그걸 계기로 더 빠르게 친해질 확률이 높을 것 같습니다. 그런데 나머지 한 명이 맥주의 일종인 스타우트를 좋아한다는 사실을 알면... 저는 그 둘과 비슷한 속도로 친해질 것 같습니다. 저에게 있어서 제가 퀴어라는 것이 삶에서 차지하는 비율은, 제가 스타우트를 좋아한다는 것이 삶에서 차지하는 비율과 비슷한 것 같습니다. 제가 스타우트를 좋아하는 것이 저의 특색이듯이, 제가 퀴어라는 것이 저의 특색입니다. 그런 인간과 인간 간의 감정과 마실 것을 어떻게 비교하냐고 할 사람도 있을 텐데, 원래 그런 것은 사람마다 다른 법이니까요. 저는 유럽에 맥주를 마시면서 여행을 떠나고 싶다고 생각한 적은 있지만, 저의 퀴어리티 때문에 여행을 떠나고 싶다고 생각한 적은 없습니다.

  제가 스타우트와 관련해서 양조장에 기부하지 않더라도, 제가 퀴어를 향한 단체에 기부하고, 퀴어리티를 가진 사람에게 지원하고 운동을 할 것이라는 이유는, 사람들은 스타우트를 좋아한다는 사실에는 말을 얹지 않지만, 퀴어라는 사실에는 말을 얹기 때문입니다. 저는 이게 단지 싫을 뿐입니다. 그래서 계속 지원하고, 운동하고, 투쟁할 것입니다. 저는 저의 삶의 그 어떤 일부라도 부정당하고 싶지 않으니까요. 그리고 남이 그런 경험을 하는 것도 원치 않으니까요.

'생각들 > GD' 카테고리의 다른 글

나에게 퀴어란  (1) 2021.12.26
2021-12-21  (0) 2021.12.23
2021-08-17  (0) 2021.08.18
#2  (0) 2021.08.11
2021-08-11  (0) 2021.08.11
2021-07-19  (0) 2021.07.20
  1. 논리 2022.05.14 02:54

    어떤 이유로 퀴어 성향을 갖게 되셨을까요? 여러 글을 읽어보니 본인이 열심히 살았으나 여러 경쟁에서 남성보다 우위를 갖지 못하게되어 생긴 반감이 퀴어 성향을 갖게 했을 수도 있을 것 같다는 생각이 드네요. 만약 그런거라면 정말 안타까운 일입니다.

    그리고 스스로 능력적으로 큰 성공을 했다라는 말은 어느 정도의 수준이 돼야 나올 수 있는 말일까 개인적으로 궁금하네요.

   어제 20211222일에 저는 워크숍을 하나 진행했습니다. 해당 모임은 어떤 사기업에서 진행하고 있는 모임이고, 참가할 기회가 있을 때마다 참가했습니다. 다양한 분야의 사람들이 모여서, 각자 자기가 하고 있는 것들에 대해 발표하고, 친목을 다지는 행사였고, 해당 멤버십 행사에서 모인 사람들과 좋은 식당에서 밥도 먹고, 이러저러 얘기도 했던 것이 기억납니다.

   이번에 해당 워크숍은 "개더타운"이라는 서비스에서 진행을 했습니다. 관리자가 맵(여기서는 해당 사기업의 회사 건물이었습니다)을 구성해 놓으면, 방향키로 이동해서 해당 맵을 탐험할 수 있고, 그 중에서 가까이 위치한 사람과는 화상 채팅이 열리는 방식의 시스템이었습니다. 흔히 "메타버스"라고도 불리는 가상 세계의 서비스 중 하나입니다.

   사실, 조금 놀라웠습니다. 오프라인에서 진행하고 있는 여러 행사들을 온라인으로 되게 잘 구현하려고 노력한 흔적들이 많이 보였기 때문입니다. 실제로 많은 사람이 컨퍼런스를 진행하고 식사를 하면 실제 대화나 사람간의 상호작용은 매우 소규모에서 이루어지기 때문입니다. 이번 워크숍에는 약 16명 정도가 참여했는데, 16명이 모인다고 16명이 모두 서로 대화를 원활하게 할 수 있는 것은 아닙니다. 워크3개의 팀으로 나누어서 진행했고, 제 팀에는 6명 정도가 있었는데, 이게 한 사람이 상호작용 할 수 있는 한계라고 생각합니다. 또한, 내가 가만히 있는 게 아니라 어쨌든 키보드를 사용하고 이동함으로써, 내가 장소와도 상호작용한다는 것을 알려주고, 이런 행동을 할 수 있다는 점이 사람의 집중력을 잘 유지시켜준다고 생각했습니다. 가령이면 OX퀴즈를 할 때, OX버튼을 누르는 것이 아닌, 사람들이 실제로 우르르 몰려다니고, 움직이는 것을 확인할 수 있는 것은 생각보다 현실감 있게 다가왔습니다. 이런 사항들을 생각보다 잘 반영한 프로그램이 아닌가하고 생각했습니다.

   하지만, 현실에서 얼굴을 맞대는 것과는 역시 달랐습니다. 몇몇은 문제가 아니라고 생각합니다. 여러 연결 문제로 진행에 딜레이가 생겼지만, 이것은 현실에서도 장비가 제대로 동작하지 않으면 점검을 해야 하는 것은 어느 곳이나 다 마찬가지입니다. 제가 좀 더 느끼는 것은, 해당 모임에 대해 느끼는 피로감이었습니다. 사람은 대화를 할 때, 표정의 매우 미묘한 부분까지 관찰하는데, 반응의 약간의 딜레이에도 사람은 민감하게 반응을 하고 그래서 서로가 서로의 맥락을 공유하는 데에 좀 더 피로감을 느낀 면이 있는 것 같습니다. , 화자에게 집중을 한다는 신호(백채널링)의 전달이 느리거나 줄어들기 때문에, 계속 화자와 청자 간의 커뮤니케이션에 서로가 집중하고 있는지 확인을 해야 하고, 그런 커뮤니케이션 자체보다 부수적인 부분에 대해서 커뮤니케이션에 추가적인 코스트가 든다고 생각합니다. 물론, 먼 거리를 이동해야하는 수고가 줄어든 것은 사실입니다. 어느 부분은 장점, 어느 부분은 단점을 잘 골라서 택해야 한다고 생각합니다.

   이런 대형 워크숍 같은 경우에는 장점과 단점을 어느 부분 저울질 할 수 있다고 생각합니다. 정보 전달이 좀 더 목적인 경우가 많고, 이동하기 힘든 사람들이 대부분인 경우가 많으니까요. 하지만, 사람들이 소규모로 친목을 하기 위해서 모이는 곳이라면 장점과 단점의 저울질이 힘들다고 생각하고, 물리적인 세계에서 만나는 것의 이점이 많다고 생각합니다.

  저는 휴학을 하고 있을 때도 동아리에 어떤 신입들이 들어오는지에 관심이 많았고, 그리고 사실 지금도 관심이 많습니다. 하지만 전혀 확인을 하지 못하고 있는데, 그 이유는 다름이 아니라 동아리방에 신입생이 없기 때문입니다. 학교 기숙사를 굳이 들어 올 필요가 없고, 방역 수칙 때문에 동아리방에서 모이기도 힘듭니다. 사실 온라인에서 회의가 있기도 하고, 마음만 먹으면 서로 얘기할 수 있는 기회는 많습니다. 하지만, 동아리방에서 있는 사람에게 그냥 얘기를 하는 것과 온라인에서 만날 약속을 따로 잡아 이야기 하는 것은 다른 이야기 입니다. 그래서 개인적으로는 기존 동아리원과 새 동아리원 사이의 결속력이 약해지고 있다는 생각을 했습니다.

   혹은 온라인에서 아예 할 수 없는 행동들도 있습니다. 제가 생각보다 중요하게 여기는 사람과 사람 사이의 포옹, 저의 큰 취미중인 하나였던 위스키와 칵테일을 마시는 것과, 파인 다이닝을 찾아다니는 것은 온라인에서는 아예 할 수 없습니다. 저의 생활 반경을 수도권에서 대전으로 옮기면서 아쉬운 것 중 하나라고 생각합니다. 대전에서의 새로운 인간관계를 맺어야 하는데, 저는 학교 안에서는 신입생만큼 새로운 도전이 허용되는 나이도 아니고, 아직도 좋은 요리와 좋은 술을 찾으러 갈 때는 서울에 있는 식당과 바를 찾아갑니다. 이것은 한국의 수도권 중심주의도 있다고 생각하지만, 그냥 생활 반경을 옮기면서 겪어야 하는 필연적인 변화 중에 하나도 있습니다.

   어쨌든 우리는 물리적인 세상 안에서 살아갑니다. 디지털이 세상을 좀 더 가깝게 만들어 주었고, 물리적인 세상의 영향력을 줄인다고는 했지만, 사실 세상을 가깝게 만들어 주기보다는 세상을 넓게 만들고 새로운 연결을 만들어줬다고 하는 게 맞는 것 같습니다. 디지털이 세상을 가까이 만들어 준만큼, 물리적인 세상은 멀어졌다고 느낍니다. 사실 우리는 이런 디지털과 물리적인 세상을 적당히 선택하고 조율할 수 있는 계기가 만들어진 걸지도 모르겠습니다. 어떤 것은 디지털로 해도 상관이 없거나 혹은 더 좋고, 어떤 것은 디지털이 해결해 줄 수 없는지.

 

  사실, 저는 물리적인 세상에 큰 원망을 가지고 살아갑니다. 하지만 어쩌겠나요? 주어진 것은 주어진 것이고, 계속 시도해 보는 것만이 답이라고 생각합니다. 제가 개척할 수 있는 것은 개척해 보려고 노력해야 할 것 같습니다. 오늘도 서울을 갈 준비를 해야겠습니다. 이제 씻고, 옷도 잘 챙겨 입고 화장도 하고 나가야죠.

'생각들' 카테고리의 다른 글

UCPC의 본선 진출 자격 변경에 대해  (106) 2022.05.12
내 부끄러운 이야기  (0) 2022.04.12
물리적인 세상 [Draft]  (0) 2021.12.23
지식의 반감기, 진로와 달리기  (0) 2021.11.11
한국에서 PS를 공부하기 위한 방법?  (0) 2019.05.21
동아리 하제  (0) 2018.08.27

피검사를 4달 정도만에 진행했습니다. 에스트라디올-데포를 맞고 1주일 후에 피검사를 진행했고, 프롤락틴 수치가 28ng/mL, 에스트라디올 수치가 342pg/mL, 테스토스테론 수치가 0.28ng/mL이 나왔습니다. 안티안드로겐을 사용하지 않았는데 테스토스테론 수치가 매우 낮은게 이례적이라고 합니다. 저는 샘플이 바뀌지 않았나 의심할 정도였습니다.

 

피검사를 진행한 이유는 에스트라디올 변화에서 나타나는 감정변화입니다. 에스트라디올 농도가 낮아지는 피크에서 감정변화가 생기고(여러 기작이 있다고 합니다), 그래서 에스트라디올 데포를 맞는 주기를 줄여보자는 생각에서 피검사를 요청을 했습니다. 에스트라디올 데포는 그대로 비슷한 주기로 맞되, 프로기노바 경구투여를 하는 방법을 바꿀 생각입니다.

 

 

'생각들 > GD' 카테고리의 다른 글

나에게 퀴어란  (1) 2021.12.26
2021-12-21  (0) 2021.12.23
2021-08-17  (0) 2021.08.18
#2  (0) 2021.08.11
2021-08-11  (0) 2021.08.11
2021-07-19  (0) 2021.07.20

프로그래밍을 하고 싶지 않다. 이유는 여럿 있는데, 가장 큰 것은 매번 바뀌는 기술적인 사항을 찾아가는게 매우 힘들기 때문이다. 6개월정도 지난 repo에 npm i를 타이핑하고 본 2000여개의 보안 취약점을 보고, 지친다는 것을 가장 크게 느낀 것 같다.

 

학문적인 지식에는 반감기가 있다는 주장이 있다. 학문에서 활발하게 사용되는 지식 중 절반이, 새로운 발견으로 대체되거나 틀린것으로 밝혀지는 시간이다. 물론 엄밀하게 정의되어 있지는 않는 개념이지만, 프로그래밍은 2.5년에서 7년정도라고 한다. [1] 필드에서 어떤지에 대해서는 찾은 글이 없다. 프로그래밍과 컴퓨터공학을 하다보면, 어딘가로 계속 달려야 한다. 과거에 내가 배웠던 것은 현재에 와서는 낡거나 틀린 지식이 된다. 그래서 나는 이론전산학을 하는게 좋다고 생각했다. 왜 이론전산학을 하는게 좋다고 생각하냐면, 적어도 반감기가 2.5년까지 짧지는 않을 것이니까. 그리고, 나는 프로그래밍을 잘 하니까. 이 생각은 점점 바뀌어서 이산수학을 하고 싶다는 생각까지 바뀌었다. 물론, Tutte Graph 보다는 node.js가 내가 살아가고 있는 세상을 더 많이 바꿔놓을 수 있겠지만, 어쨌든 내가 하고 싶은 것을 해야하니까. 사실 수학의 반감기도 그렇게 길지는 않은 것 같다. 9.17년 정도라고 한다. [2] 물론, 내가 "올바르다"고 받아들였던 사실이 "틀린" 사실이 되지는 않겠지만.

 

내가 지금 공부하고 싶은 공부는 언어학이나 심리학이다. 나는 그렇게 학점이 좋지 않기 때문에 의전원에 갈 수 없다. 내가 현실적으로 언어학을 지금 공부할 수 있는 방법은, 자연어 처리 관련 전산 대학원에 들어가는 것이고, 심리학을 공부할 수 있는 방법은 지금 학교에서 바이오 및 뇌 공학과 복수전공을 해서 심리학과 관련된 대학원을 들어가는 것이다. 그렇지만, 이런 선택을 할 것 같지는 않다. 나는 수학과 프로그래밍을 꽤 잘 하기 때문에, 내 장점을 충분히 이용하는게 맞는 전략이기 때문이다. 만약에 내가 수학과 프로그래밍을 그렇게까지 잘 하지 않았다면, 집에 좀 더 빌붙어서 내가 맞는 전공을 찾아가겠다고 말했을까? 잘 모르겠다. 사실은 심리학의 반감기도 그렇게 길지는 않다. 3.3년에서 19년정도라고 한다. [2] 내가 심리학과 관련된 공부를 해도 위의 문제들을 만날 것이다. 심지어 이 분야는 진짜 과거에 많은 사실이라고 생각했던 것들이 거짓으로 밝혀지는 곳이다. 생각 해 보면, 세상은 빨리 바뀌기 때문에, 세상을 바꿀 수 있는 위치에 있는 학문을 필연적으로 반감기가 짧을 수 밖에 없는 것 같다. 내가 원하는 두 가지를 모두 달성하는 일은, 마치 유니콘을 쫓는 것과 같지 않을까?

 

사실 난 이런 고민들을, 더 이상 이 분야에서 달릴 자신이 없다는 선언이고, 박수 받을 때 떠나고 싶을 뿐이며, 그냥 내 자리를 유지할 수 없을 것 같기 때문에 도망가는 도피라고 생각한다. 사실 지금도 도망치는 것 보다는 갓길을 선택하는거에 가깝지만.

 

나는 지금도 계속 달리고 있고, 다른 길도 이러저러 확인하고 있다. 다른 사람은 조금 쉬어도 좋다고 하지만, 어릴 때부터 계속 움직이도록 훈련 받은 나는 달리는 것이 나의 삶이기 때문에 달리지 않는 나의 삶이 예상되지 않아서 불안하다. 나의 삶은 컨베이어 벨트여서, 달리지 않는 것은 곧 뒤쳐진다는 의미였으니까. 그리고, 뒤쳐지면 영원히 따라잡을 수 없을 것 같고, 미래의 내가 언젠가 해야 하는 일이라고 생각하니까. 나는 갓길이 되었든, 험난한 길이 되었든 어딘가로 계속 달려야겠다. 이렇게 고민해도 선택은 갈림길에 선 내가 하지 않을까? 어떤 선택을 해도 달리면 된 것이다.

 

출처

[1] https://spectrum.ieee.org/an-engineering-career-only-a-young-persons-game

[2] https://www.universetoday.com/97806/book-review-the-half-life-of-facts-why-everything-we-know-has-an-expiration-date/

[3] https://psycnet.apa.org/record/2012-16074-001

 

 

 

 

 

 

 

 

??

사실은 더 이상 달리고 싶지 않은데, 달리지 않아도 괜찮다고 느낄만한 심리적으로 안정된 기반이 존재하지 않는다. 나는 달리지 않는 나에게 나는 가치를 찾을 수 없어서 오늘도 달리고, 이는 다시 나에게 과부하로 다가와서 나를 해친다. 이런 연결고리가 삶이라면 더 이상 지속하고 싶지 않다. 그래서 연결고리를 끊을 수단을 찾고 있지만, 찾지 못한 것 같다. 그냥 통째로 내던지고 싶다.

 

'생각들' 카테고리의 다른 글

내 부끄러운 이야기  (0) 2022.04.12
물리적인 세상 [Draft]  (0) 2021.12.23
지식의 반감기, 진로와 달리기  (0) 2021.11.11
한국에서 PS를 공부하기 위한 방법?  (0) 2019.05.21
동아리 하제  (0) 2018.08.27
교수님과 상담을 하고 왔습니다  (1) 2018.07.11

  2020년 8월 13일에 혈액결과가 나와서, 전화상담을 했습니다. 직접 방문을 해서 결과를 들을 수 있고, 전화로 상담을 할 수도 있다고 했기 때문에, 저는 전화로 상담을 했습니다. 단, 전화로 상담을 하면 3,500원의 진료비가 나온다고 했습니다.

  2020년 8월 17일에 직접 방문해서 호르몬주사를 맞았습니다. 혈액검사 결과를 얘기 하고, 앞으로 어떤 식으로 건강관리를 해야 한다 같은 점을 얘기 한 이후에 데포주사를 맞았습니다. 근육이 많은 팔과 엉덩이중 선택해서 맞을 수 있었습니다. 용량이 크거나 아프지는 않았으며, 비용은 상담과 합해서 14,500원이 나왔습니다. 나중에 익숙해지면 자가주사를 하는 형태로 처방하기도 한다고 합니다.

 

 

'생각들 > GD' 카테고리의 다른 글

나에게 퀴어란  (1) 2021.12.26
2021-12-21  (0) 2021.12.23
2021-08-17  (0) 2021.08.18
#2  (0) 2021.08.11
2021-08-11  (0) 2021.08.11
2021-07-19  (0) 2021.07.20

  남성성이라는 것은 사회가 붙이는 것이기 때문에, 남성이 남성성에 갇힐 필요는 없다. 하지만 나는 사회를 살아가는 사람이고, 나는 태어날 때 남성이라는 성별이 지정되었기 때문에, 사회에 있는 나는 남성성을 강요받는다. 전통적으로 남성성이라고 말함은 체력, 용기, 독립심, 리더십, 강한 의사 표현이다. [1] 나는 여기서 체력, 강한 의사 표현, 리더십 같은 특징에 가치를 둔다. 용기에 대해서는 가치 중립적이며, 독립심은 내가 추구하고자 하는 가치와는 거리가 있다. 또한, 나는 사회에서 요구되는 여성성도 가지고 있다. 전통적으로 여성성이라고 말함은, 우아함, 친절함, 공감, 겸손, 섬세함이다. [1] 이 특성들은 내가 추구하고자 하는 가치와 일맥상통한다.
  나는 신체 자체에 대한 성별 불일치감을 다른 트랜스젠더처럼 크게 느끼지 않는다. 내가 신체 자체에 대해 성별 불일치감을 느끼는 거의 유일하다시피 하는 부분은 내가 임신을 할 수 있는 몸이 아니라는 것이다. 다른 내가 느끼는 성별 불일치감은 대부분 사회적인 시선에서 나온다. 솔직히 나는 내 키와 체격이 마음이 안 든다고 생각하지만, 신체적 성별 불일치감이냐고 물으면 아닌 것 같다. 하지만, 사회가 나의 키와 체격 때문에 나를 여성으로 바라봐주지 않는다는 점은 트리거가 되고, 이는 나의 성별 불일치감에 일조한다.
  전통적인 남성성을 추구하지 않는 것도 아니며, 신체적인 성별 불일치감을 크게 느끼지도 않는데, 왜 호르몬 치료를 받냐고 나에게 물어보면, 그것은 내가 사회에 받아들여지기 위한 노력이다. 사회에 순응하지 않는 나의 표현을 쓰면, 나의 호르몬 치료는 잘못되었다.
  어릴 적부터 나의 여성성을 표현하려는 시도는 많이 제지당했다. 실제로 내가 여성적인 취미라고 보이는 뜨개질을 하고부터 좋아하는 색이 분홍색이라고 말하는 것까지 많은 사람은 한두 마디를 얹었다. 내가 머리를 기르면 사람들은 칼같이 그 머리를 자르려고 했고, 내 머리를 어울리지 않는다고 표현했으며, 짧게 자른 나의 머리를 좋다고 표현했다. 그 사람들은 스트레스가 쌓여 가위로 내가 내 머리를 자르는 행위에 대해서 '이렇게라도 자르는 게 어디야.'라고 말했을 수도 있다. 내 주위의 사회는 나의 여성성을 외면했으며, 나의 성급함은 정제되지 못했고, 나의 다정함은 갈 곳을 잃었다. 나의 여성성은 억압되어왔다. 반면에 나의 남성성은 큰 성공을 이룬 것 같다. 이래서 당연히 모두가 나를 남성으로 인식했고, 나조차도 나를 사회적 남성성에 빗대어 인식했다. 나는 우아함, 공감, 섬세함 등의 가치를 기르는 데에 멀어졌고, 오히려 내 주위의 남성 사회 평균보다 낮아졌을 수도 있을 것 같다.

  내가 남성 사회에서 불쾌함을 덜 인식했던 이유는, 나에게서 전통적인 남성성을 찾아볼 수 있어서 그걸 선택적으로 표출했고, 또한 내 주위에서 내 여성성을 인정해 주는 사람이 있기 때문이었던 것 같다. 나는 나에게서 여성성을 찾아주는 사회를 찾아가야 했고, 찾아갔다. 흔히 말하는 얼굴을 보며 얘기하는 "일반적이고 정상적인" 사회가 내 여성성을 하나도 찾아주지 않았기 때문이다. 이는 나의 큰 체격과도 관련이 있을 것이다. 내가 가장 크게 성별 불일치감을 느낀 곳은 기초군사훈련을 받은 4주 동안이다. 내가 보던 가장 남성성이 강조되는 사회였고, 나는 이 사회에 적응하지 못했다. 이 사회는 나에게서 모든 여성성을 표현할 기회를 주지 않았으며, 그런 점은 나에게 압박과 불안, 그리고 공포감으로 나타났다.
  성별 정체성은 내가 정하지만, 사회적 성별은 내가 정하는 것이 아니다. 사회적 성별은 사회가 정하고, 사회적 성별이 내가 원하는 대로 비치기 위한 노력을 할 수 있지만, 모든 노력이 성과로 다가오는 것은 아니다. 나는 이를 위해서 강력한 수단을 써야 했고, 정체화와 호르몬 치료는 그런 사회가 나를 받아주게 하는 거의 유일하다시피 한 방법이었다.
  정체화를 한 이후에, 누구보다도 성별 고정관념을 타파하고 싶은 사람인 나는 사회가 만들어 놓은 여성성이라는 고정관념에 갇혀버렸다. 머리를 기르지 않고 짧게 자른 여성도 여성이다. 하지만 나는 머리를 길게 기른다. 마른 몸을 동경하지 않는 여성도 여성이다. 하지만 나는 마른 몸을 동경한다. 치마를 입지 않는 여성도 여성이다. 하지만 나는 치마를 입는다. 나는 나 자신에게 여성성을 강요하고, 그래야 사회가 나를 그나마 여성으로 봐준다는 점을 잘 안다. 동시에, 남성으로 사회가 나를 바라볼 때는 느끼지 못했던, 여성으로 사회에서 비칠 때 사회가 나에게 주는 상처와 억압을 느끼고 있다. 몸의 상처도 있다. 나에게는 아직도 아물지 않은 왼쪽 다리의 상처가 있고, 사회적 여성성에 맞춰 제모하다가 얻은 상처이다. 그리고 마음의 상처가 낫는 것은 몸의 상처가 낫는 것보다 느리다.
  모든 사람이 마스크를 끼고 다닌다. 여성으로 비치는 데에 얼굴의 지방배치나 하관도 영향을 끼치는데 마스크는 이를 완벽하게 가려준다. 내가 머리가 조금 길고, 내가 치마를 입고, 조금만 높은 목소리를 낸다면, 내가 여성으로 비치는 데는 문제가 없다. 사람들은 내가 남성인데 여성복을 입었다고 생각하기보다는, 내가 여성인데 키가 매우 크다고 생각하기로 했나 보다. 여성성에 부합하기 위해 나는 머리를 길렀고, 머리를 기르는 것은 내가 나갈 때 준비하는 시간을 늘린다. 옷도 골라서 입어야 하고, 여성복은 의도적으로 불편하게 설계된 것이 아닌가 할 정도로 편의성이 없다. 나는 왜 단추 방향이 블라우스와 와이셔츠가 반대인지도 모르겠고, 왜 청바지에 앞주머니가 없는지도 모르겠다. 나는 이제야 왜 많은 여성이 핸드백을 들고 다니는지 이해했다.

  길거리를 걸어갈 때, 장사하는 사람이 집요하게 나에게 말을 거는 경우가 늘어났다. 같이 얘기하는 사람이 나의 말에 귀 기울이지 않는 경우가 늘어났다. 내가 한번 말하면 들었던 것을 두세 번 말해야 하는 경우가 늘어났다. 내가 여성적인 이름과 외형을 가지고 사람에게 조언할 때, 내 조언을 무시하는 일이 눈에 띄게 늘어났다. 이런 것은 나만 느끼는 것이 아닌 것 같다. 이런 여성에 대해 무의식적이든 의식적이든 깔린 성차별은 수치화가 될 수 있을 정도로 나타났다. 가령이면, 여성이라는 정보는 취업에 악영향을 준다. [2] 나는 아직 여성적인 표현을 하고 구직활동을 해 본적은 없기 때문에 느끼는 차별에 대해서 자세히 알지는 못하지만, 일상에서 느끼는 차별과 같거나 혹은 더 큰 수준의 차별을 느낄 것 같다는 생각이 있다. 나는 나의 자기표현과 지적 성취도 중요하기 때문에, 실제로 내가 사회에서 직업을 구하고, 논문을 쓰고, 발표하고 남을 설득하려면, 내가 선택할 수 있는 가장 편한 수단은 남성성을 사용하는 것이다.
  사회적 남성성은 유용하다. 나를 표현하고 내가 받아들여지기 위해서 남성성을 사용한다. 사람들이 나의 말을 듣는 이유가 그냥 내가 그런 사람이라서가 아니라, 젠더에 무관한 게 아니라, 그 사람들이 나를 남성으로 인식하고 있어서라는 이유는 나를 혼란스럽게 만들기 충분했다. 그래서 나는 나의 유용한 남성성을 아예 버리지 않기로 했고 상황에 따라서 이 둘을 선택하기로 했다. 어떤 사회에도 속해 있지만 어떤 사회에도 속하지 못하는 교란자가 된 것이다. 나는 내가 젠더에 관련 없이 원하는 방식으로 표현되기를 원하지만, 사회는 내 표현을 젠더에 가두어서 억압한다. 여기서 내가 할 수 있는 최선의 선택의 결론이 호르몬 치료까지 온 것이다.

  나의 호르몬 치료는 잘못되었다.

 

[1] Vetterling-Braggin, Mary (1982). "Introduction". "Femininity", "masculinity", and "androgyny": a modern philosophical discussion. Totowa, N.J: Littlefield, Adams. ISBN 9780822603993.

 

[2] Research: To Reduce Gender Bias, Anonymize Job Applications https://hbr.org/2020/03/research-to-reduce-gender-bias-anonymize-job-applications

'생각들 > GD' 카테고리의 다른 글

2021-12-21  (0) 2021.12.23
2021-08-17  (0) 2021.08.18
#2  (0) 2021.08.11
2021-08-11  (0) 2021.08.11
2021-07-19  (0) 2021.07.20
#1  (0) 2021.07.14

  2021년 8월 10일 화요일에 풀 배터리 검사 결과가 나왔고 이에 대해 상담하러 갔습니다. 선생님은 검사 결과를 상세하게 설명해 주셨고, 저에게 호르몬 치료를 진행하고 싶으면 진단서를 발급해 주겠다고 하셨습니다. 저는 F64.9라는 코드가 적힌 진단서를 발급해달라는 얘기를 했고, 진단서를 발급해주셨습니다. 또한, 풀 배터리 검사 기록지의 사본도 같이 가져갔습니다. 총비용은 만원이 조금 넘게 나왔던 것 같습니다. 다음 상담은 9월 2일 목요일이 될 것 같습니다.

  2021년 8월 11일 오전에 대전의 민들레의원을 찾아갔습니다. 처음에 전화했고, 호르몬 치료를 하겠다는 의사를 전달하니까 진단서가 있어야 하고, 있으면 가지고 오라는 얘기를 들었습니다. 진단서를 가지고 민들레 의원에 방문했습니다. 저에게 MtF 치료 동의서라는 문서를 주셨고, 해당 문서에는 호르몬 치료가 어떤 것이고, 어떤 질환들이 발생할 수 있으며(호르몬은 간에서 처리되며, 콜레스테롤과 유사한 작용을 하므로 심장 혹은 간에 관련된 질환들이 발생할 수 있습니다), 몸에 어떤 변화들이 생기는지에 대해서 적혀 있었습니다. 또한, 해당 병원에서는 우울증을 포함한 다른 정신질환이 있는 경우에 호르몬 치료를 진행할 수 없다 같은 내용이 있기 때문에, 상대적으로 성별 불일치감을 느끼는 사람에게 흔한 우울증 같은 질병이 있는 경우에는 추가로 얘기가 필요하리라 생각합니다. 저는 동의서에 서명하고, 혈압을 잰 다음에 진료실로 들어갔습니다.

  진료실에서는, 호르몬 치료가 어떤 것인지, 진단은 어디서 받아 왔는지 등등을 말해줬고, 제가 호르몬 치료를 받는 만큼 호르몬 치료에 대해서 잘 이해하고 있어야 한다고 말했습니다. 또한, 호르몬 치료를 받게 되면 어떤 일이 일어나는지 등을 상세하게 설명해 주셨습니다. 추가로 성 재지정 수술을 받을 생각은 있는지, 후에 자손을 남길 생각이 있으면 냉동 정자 생각은 있는지, 현재 파트너가 혹시 있고 호르몬 치료를 한다는 내용을 알고 있는지 등등을 물어봤습니다. 저는 추가로 풀 배터리 검사지를 전달해 드렸고, 필요한 내용을 의무기록에 기록한 것 같습니다.

  민들레의원에서는 처음에는 매일 안드로쿨을 먹고, 졸라덱스데포주사를 2주에 한 번 맞고, 혈액 검사를 3개월에 한 번 하는 것을 기본으로 하지만, 주기는 예후를 보면서 조절할 수 있다고 했습니다. 현재 프로기노바는 재고가 없어서 제공하지 못하지만, 9-10월 정도에는 다시 재고가 채워질 거라고 하셨습니다. 나중에는 안드로쿨을 먹는 주기나 혈액검사를 하는 주기를 늘린다고 하였습니다. 저 같은 경우는 남성호르몬 레벨이 낮아지는 것을 원치 않아서 안드로쿨을 사용하지 않는 방향으로 호르몬치료를 진행하고 싶다고 말했고, 원하면 그렇게 하면 될 것 같다고 말해주셨습니다.

  처음 가면 호르몬제를 바로 투여하지 않고, 소변과 혈액 검사를 진행합니다. 비용은 6만 원 정도가 나왔으며, 혈액 내 호르몬 비율 같은 경우에는 비보험으로 들어가서 가격이 있다고 합니다. 혈액 검사는 5일 정도가 소요된다고 하며, 5일 후에 전화를 주면 예약을 잡거나 방문을 해서 호르몬 치료를 받으면 된다고 합니다.

 

'생각들 > GD' 카테고리의 다른 글

2021-08-17  (0) 2021.08.18
#2  (0) 2021.08.11
2021-08-11  (0) 2021.08.11
2021-07-19  (0) 2021.07.20
#1  (0) 2021.07.14
2021-07-14  (0) 2021.07.14

SCPC 2021 2차 대회가 8월 7일 오전 9시부터 12시간동안 진행되었다.

SCPC 대회와 관련된 정보는 https://research.samsung.com/scpc 에서 찾을 수 있다.

 

이 게시글에서는 해당 대회 문제의 풀이를 다룬다.

 


1. 원 안의 점

  문제를 요약하면, 원점 $(0, 0)$을 중심으로 하는 반지름 $R$인 원 내부에 들어있는 좌표가 모두 정수인 점의 개수를 세는 문제이다. 단, 원의 경계에 놓인 점은 생각하지 않는다. ($R \le 200\,000$)

  풀이는 간단하다. $x$좌표가 $a$인 위치에 대해서 $y$좌표로 가능한 값은 $-\sqrt{x^2-a^2}$ 초과 $\sqrt{x^2-a^2}$ 미만인 값이고($-R < a < R$), 정수점의 개수는 $\sqrt{x^2-a^2}$ 미만인 양의 정수의 개수에다가 1을 곱한 값이다. 구현할 때는 $\sum_{a=-R+1}^{R-1} (\lfloor \sqrt{x^2-a^2-1} \rfloor$)과 같은 식으로 구현할 수 있다. ($x^2-a^2$은 정수이기 때문에, $x^2-a^2$ 미만인 정수는 $x^2-a^2-1$ 이하인 정수와 같다.)

  시간복잡도는 $\mathcal{O}(R)$이다.


2. 직8각형

  문제를 요약하면, 한 변의 길이가 $K$인 각 변이 축에 평행한 정사각형 5개가 그림처럼 +모양으로 배치되어 있을 때, 외각에 놓인 8개의 점을 길이가 $K$인 직8각형이라고 부른다. 평면 상의 점 8개와 $K$가 주어질 때, 길이가 $K$인 직8각형이 되도록 점을 옮기려고 한다. 여기서, 점의 순서는 중요하지 않다. 이 때, 필요한 점의 이동거리 합의 최소값을 구하는 문제이다. 여기서, 이동거리는 택시거리이다($(a, b)$와 $(c, d)$ 사이의 거리는 $|a-b| + |c-d|$이다.)

  어떤 점이 직8각형의 어떤 점에 대응되어야 하는지 알 경우에 필요한 이동거리 합의 최솟값을 구하는 방법을 생각해보자.

  첫째로, 택시거리는 $x$좌표와 $y$좌표의 차이의 합이기 때문에, $x$좌표와 $y$좌표를 따로 생각할 수 있다. 그렇기 때문에, $x$좌표와 $y$좌표에 대해 문제를 따로 따로 풀어줄 수 있다.

  둘째로, 이동거리가 최소가 되는 $p_0$의 $x$좌표를 편의상 $a$라고 하면, $p_0, p_1$으로 옮기는 점은 $x$좌표가 $a$, $p_2, p_7$로 옮기는 점은 $x$좌표가 $a+K$, $p_3, p_6$으로 옮기는 점은 $x$좌표가 $a+2K$, $p_4, p_5$로 옮기는 점은 $x$좌표가 $a+3K$가 되도록 옮겨야 한다. $p_i$로 옮겨야 하는 점의 $x$좌표를 $x_i$라고 하면, $|x_0 - a| + |x_1 - a| + |x_2 - (a+K)| + |x_3 - (a+2K)| + |x_4 - (a+3K)| + |x_5 - (a+3K)| + |x_6 - (a+2K)| + |x_7 - (a+K)|$ 를 최소화 하는 문제가 된다. 기본적으로 어떤 배열 $v$에 대해, 합 $|v_i-a|$를 최소화하는 문제는 매우 잘 알려진 문제로, $a$를 $v_i$의 중앙값으로 잡으면 된다. 이 경우도 유사하게, $a$를 $x_0, x_1, x_2-K, x_3-2K, x_4-3K, x_5-3K, x_6-2K, x_7-K$의 중앙값으로 설정하면 될 것이다. $y$좌표에 대해서도 문제를 비슷하게 풀어줄 수 있다.

  이런 식으로, 어떤 점이 직8각형의 어떤 점에 대응되어야 하는지 알 경우 필요한 이동거리 합의 최솟값은 $\mathcal{O}(8)$에서 $\mathcal{O}(8^2)$ 정도의 시간에 중앙값을 구해서 합을 구하는 방식으로 문제를 해결할 수 있다. 이제 모든 조합을 다 시도해보면 $\mathcal{O}(8! \times 8)$ 에서 $\mathcal{O}(8! \times 8^2)$ 정도 시간에 문제를 해결할 수 있다.


3. 산탄총

  문제를 요약하면, $N \times N$ 격자의 각 칸에 (음수일 수 있는) 수가 하나 써 있고, 산탄총의 퍼지는 정도 $K$가 주어진다. 산탄총을 어떤 칸을 중심으로 사격하면 중심과 택시거리가 $K$ 미만인 칸에 대해서, 해당 칸과 중심의 택시거리가 $x$이면 해당 칸에 있는 수에 $K-x$를 곱한 수 만큼의 점수를 얻는다. 여기서, 중심은 격자 밖일수도 있다. 산탄총을 한번 사격해서 얻을 수 있는 점수의 최댓값을 구하는 문제이다. 오른쪽 그림은 $K=3$일때 산탄총을 사격해서 얻을 수 있는 점수의 모양이다. ($1 \le K \le N \le 600$)

  모든 칸을 중심으로 해서 산탄총을 쐈을 때, 각각의 점수를 구해서 그 중 최댓값을 구하면 되는 문제이다. 격자의 밖을 중심으로 하는 경우도 물론 고려해야한다. 격자에서 $K$ 이상 떨어진 곳을 중심으로 산탄총을 사격하는 경우에는 점수가 항상 0이므로 고려하지 않아도 되고, 각 좌표가 $-K$ 부터 $N+K$인 곳을 고려해서 사격하면 된다.

  이제, 각 칸의 점수를 효율적으로 구하기 위해서, 중심을 오른쪽으로 한 칸 옮길 때 점수 차이를 살펴보자. 두 칸의 경계를 기준으로 왼쪽에 있는 칸의 거리는 1씩 늘어나고, 오른쪽에 있는 칸의 거리는 1씩 줄어든다. 열 번호가 왼쪽 칸 이하이면서, 거리가 $K$미만인 칸(아래 그림에서 주황색 영역)의 수의 합만큼 값이 줄어들고, 열 번호가 오른쪽 칸 이상이면서, 거리가 $K$미만인 칸(아래 그림에서 파란색 영역)의 수의 합만큼 값이 늘어난다.

  이제, 파란색 영역과 주황색 영역의 합을 효율적으로 구해보자. 파란색 영역의 중심칸을 아래로 한 칸 옮기면 거리가 $K-1$인 점들이 바뀌게 된다. 여기서 위쪽 칸과 거리가 $K-1$이면서, 열 번호가 위쪽 칸 이상이고, 행 번호가 위쪽칸 이하인 점들(아래 그림에서 빨간색 영역)의 수의 합 만큼 값이 줄어들고, 아래쪽 칸과 거리가 $K-1$이면서, 열 번호가 위쪽 칸 이상이고, 행 번호가 오른쪽 칸 이상인 점들(아래 그림에서 초록색 영역)의 수의 합 만큼 값이 늘어난다. 주황색 영역도 대칭적으로 구할 수 있다.

  이제, 우리는 빨간색과 초록색으로 표현된 영역인 대각선 모양의 $K$개의 칸의 합을 효율적으로 구해야하는데, 이는 중심칸이 오른쪽 아래로 내려갔을 때, 왼쪽 끝과 오른쪽 끝의 수가 더해지고 빠지는 것으로 문제를 해결할 수 있다. (그림의 노란색과 보라색 칸) 초록색 영역도 대칭적으로 구할 수 있다.

문제에서 구해야하는 영역들

  이 영역들의 합을, 좌표를 섬세하게 계산해주면 문제를 해결할 수 있다. 각 영역은 중심이 한 점에서 다른 점으로 옮겨질 때 상수번의 연산만을 하기 때문에, 시간 복잡도는 $\mathcal{O}(N^2)$이다.


4. 패턴 매칭

  문제를 요약하면, 두 문자열 $A$와 $B$가 매칭된다는 것은, $A$와 $B$의 길이가 같고, $A_i = A_j$와 $B_i=B_j$가 동치라는 것을 의미한다. 텍스트 하나와 $K$개의 패턴을 주어질 때, 각 패턴이 텍스트에 등장하는 횟수를 계산하여라. (텍스트의 길이 $2\,000\,000$ 이하, 패턴의 길이 $500$이하, 패턴 길이 합 $30\,000$이하)

  Aho-corasik의 패턴 매칭 알고리즘을 사용하자. 우리가 문자열의 각 문자 대신 매칭에 사용할 대상은 이전에 같은 문자가 언제 등장했는지 여부이다. 다음과 같은 관찰을 활용하자.

 

  관찰. 어떤 문자열 $S$의 $f(S)$를 다음과 같이 정의하자.

    - $f(S)$는 길이가 $S$와 같은 배열이다. $f(S)$의 $i$ 번째 값은 $S_i = S_{i-L}$을 만족하는 최소인 양수 $L$이다. (조건을 만족하는 $L$이 없을 경우 $f(S)$의 $i$ 번째 값은 0이다.)

  문제에서 정의한 문자열 $A$와 $B$가 매칭되는 것은 $f(A)$와 $f(B)$가 동일한 것과 동치이다.

 

  증명. (⇒) $f$를 정의할 때 사용한 연산은, 문자열의 두 값이 같다는 연산 뿐이기 때문에, 문제에서 주어진 $A$와 $B$에 대한 $f(A)$와 $f(B)$의 값은 동일하다.

  (⇐) $A_i$와 같은 문자가 등장하는 $i$ 번째 이전의 위치를 찾아보자. $f(A)_i$가 0이면, 같은 문자가 등장하지 않는다. $f$의 정의에 따라, $A$의 $i-f(A)_i$ 번째 위치에서 $A_i$와 같은 문자가 등장하고, $i-f(A)_i$ 번째 위치에서 $i$번째 위치 사이에서는 문자가 등장하지 않는다. 이제 $i-f(A)_i$ 번째 위치 이전에서는 $A_i$와 같은 문자가 언제 등장하는지를 살펴보자. $A_{i-f(A)_i} = A_i$이기 때문에, $f(A)$ 배열의 $i-f(A)_i$ 값을 확인하는 것으로 재귀적으로 확인해 줄 수 있다.

$f(A)$와 $f(B)$의 값이 같다는 것은, $A_i$와 같은 문자가 등장하는 $i$ 번째 이전의 위치와, $B_i$와 같은 문자가 등장하는 $i$ 번째 이전의 위치의 집합이 같다는 뜻이다. 그렇기 때문에, $A_i = A_j$와 $B_i=B_j$는 동치이다.

 

  이를 직접 사용하려고 하면, 위의 정의가 "길이가 다른 두 문자열"에 대해서는 동작하지 않는다는 것을 알 수 있다. 예를 들면 $S=abaca$와 $T=xyx$가 있다고 하자. $f(S)$는 $[0, 0, 2, 0, 2]$이고 $f(T)$는 $[0, 0, 2]$이다. 위에 정의한 문자열 매칭을 그대로 사용하면, $S$는 $T$의 첫 번째 위치에서만 매칭되는 것으로 생각되지만, 실제로는 세번째 위치에서도 매칭된다. 이는 부분문자열 $aca$와 $xyz$에서 첫번째 $a$에 해당하는 $f$값 $2$가 매칭되는 패턴 $xyz$의 $x$의 인덱스인 $0$보다 커서, $2$칸 전의 문자가 사실 같음에도 매칭할 때는 고려대상이 되지 않기 때문에 발생하는 문제이다. 특정 위치의 함수값이 인덱스보다 큰 경우는 고려 대상에서 제외해서 배열의 값을 $0$으로 바꿔줘야 하고, 이는 Aho-corasik의 failure function을 계산할 때 처리해 줄 수 있다.

  이래서, (일반적인) 스트링 $f(T)$에서 패턴 $f(P)$가 언제 등장하는지 개수를 세는 문제로 바뀌었다. 기본적인 Aho-corasik 문제임으로 따로 설명하지는 않는다. 위의 failure function을 계산할 때, 자기보다 길이가 긴 인덱스 값이 등장하는 시점에 유의하자.

  시간복잡도는 문자열 길이와 패턴 길이 합의 선형에 비례하는 시간복잡도가 든다.


5. Hanoi Tower

  문제를 요약하면, 일반적인 하노이 타워 문제와 같이, 1번 기둥에 있는 원판을 3번 원판으로, 큰 디스크가 작은 디스크 위에 올라가지 않도록 모두 옮기는 문제이다. 단, 기존 하노이 타워는 한 기둥에서 다른 기둥으로 옮길 때, 한 기둥의 첫 번째 원판을 다른 기둥의 첫 번째 원판이 되도록 옮겼다. 하지만, 이번 하노이 타워는 한 기둥의 가운데 원판이 다른 기둥의 "가운데 원판"이 되도록 옮겨야 한다. 여기서 어떤 기둥의 가운데 원판은, 그 기둥에 쌓인 원판의 개수를 $n$이라고 할 때, $1+\left\lfloor\frac{n}{2}\right\rfloor$ 번째 원판을 말한다. 최대 이동 회수 $M = 980403$이 주어졌을 때, 디스크의 개수 $N$을 (코드를 제출하는 사람이) 정하고, 1번 기둥의 $N$개의 원판을 3번 기둥으로 옮기는 문제이다. ($N = 26$인 경우 만점이다.)

  여러가지 관찰이 필요한 문제이다. 다음과 같은 관찰을 하나씩 해 보자.

 

관찰 1. 한 기둥의 가장 위에 있는 원판을 다른 기둥의 가장 위로 옮기려면, 해당 원판을 제외하고는 두 기둥에 다른 어떠한 원판도 존재하지 않아야 한다.

증명. $n=1$인 경우만 $1+\left\lfloor\frac{n}{2}\right\rfloor = 1$이 된다.

 

  편의상 원판의 번호를 작은 것 부터 큰 것 까지 $1$부터 $N$까지의 번호를 붙이자. 여기서 다음과 같은 전략을 사용할 수 있다. 1번 기둥에서 3번 기둥으로 원판을 모두 옮기기 위해서는 $2$번 원판부터 $N$번 원판까지를 전부다 2번 기둥으로 옮긴다음에, 1번 기둥에서 3번 기둥으로 1번 원판을 옮기고, 2번 기둥에 놓인 $N-1$개의 원판을 다시 3번 기둥으로 옮겨야 한다.

과정 M000, 이름이 붙은 이유는 아래 문단이 설명되어 있다.

  일반적인 하노이 타워 문제는 나머지 원판들에 대해 재귀적으로 같은 방식으로 진행했겠지만, 이 문제는 다른 점이 있다. 바로, 1번 원판의 존재때문에 기둥을 빼내는 순서가 다르다는 점이다. 1~5번 원판이 쌓여있을 때 빠지는 순서는 3, 4, 2, 5(, 1)순이다. 하지만 2~5번 원판이 쌓여있을 때 빠지는 순서는 4, 3, 5, 2순이다. 즉, 어떤 기둥 위에 (고정되어서 빠지지 않는) 원판이 $0$개 있는지 $1$개 있는지에 따라서 과정이 다르게 된다. $a$, $b$, $c$번 기둥 위에 고정된 원판이 각각 $x$, $y$, $z$개 있는 상황에서 a번 기둥에서 c번 기둥까지 $N$개의 원판을 옮기는 과정을 $Mabc(N, a, b, c)$이라고 말하자. 가장 처음의 상황은 $M000(N, 1, 2, 3)$이고, $M000(N, a, b, c)$는 $M100(N-1, a, c, b)$를 수행하고, $a$에서 $c$로 1번 원판을 옮기고, $M001(b, a, c)$를 수행하게 된다. 이제 해당 기둥의 "가운데 원판"의 위치가 바뀐다.

 

관찰 2. 기둥 위에 고정된 원판이 1개 있는 경우, 가운데 원판을 $\left\lfloor\frac{n+1}{2}\right\rfloor$번 원판이라고 생각하면 된다. 또한, 해당 기둥의 가장 아래에 있는 원판을 옮기려면, 해당 기둥에는 고정된 원판과 가장 아래에 있는 원판을 제외하고, 남은 원판이 없어야 한다.

 

증명. 고정된 원판 1개를 제외하고 원판이 $n$개 있는 경우, 고정된 원판을 포함한 중심 위치는 $1+\left\lfloor\frac{n+1}{2}\right\rfloor$번째이다. 첫 번째인 고정된 원판을 제외하면, 중심 위치는 $\left\lfloor\frac{n+1}{2}\right\rfloor$번 원판이 된다. 여기서 $n \ge 1$ 일 때, 항상 $1 \le \left\lfloor\frac{n+1}{2}\right\rfloor \le n$을 만족하므로, 중심 원판은 항상 옮기려는 원판 중에 존재한다. 가장 아래쪽에 있는 원판을 꺼내려면, $n = \left\lfloor\frac{n+1}{2}\right\rfloor$ 이어야 하고, 이 경우는 $n=1$이다. 옮기려는 원판을 제외하고는 다른 원판이 존재하지 않는다.

 

  이제 해당 과정을 기준으로 $M100(N, a, b, c)$상황을 생각해보자. ($M001$은 $M100$의 역순으로 진행된다.) 가장 아래에 있는 원판을 옮기는 과정을 생각해보자. 이도 마찬가지로, $a$번 기둥의 $N$번 원판을 제외한 원판들을 전부 $b$번 원판에 옮기고 $N$번 원판을 $c$번 원판에 옮긴 이후에, $b$번 기둥의 나머지 원판을 $c$번 기둥으로 옮기면 된다.

  여기서, 과정을 잘 살펴보면 $a$번 기둥에서 마지막에 나오는 두 개의 1번 원판과 $N$번 원판을 옮길 때, $b$번 기둥을 거쳐갈 필요 없이 $c$번 기둥으로 두 원판을 차례로 옮길 수 있다는 것을 알 수 있다. ($a$번째 원판과 $c$번째 원판의 "가운데 원판"을 정의하는 홀짝성이 달라서 발생하는 일이다.) 그래서 과정을 바꿔서 $N-2$개의 기둥을 한번에 옮기는 것으로 문제를 풀 수 있다.

과정 M100, 고정된 원판은 -로 표시되었다.

  이제, 여기서 재귀적인 과정을 하려면 또 역시 자신 위와 아래에 있는 원판이 문제라는 것을 알 수 있다. 하지만 이 경우에는 중심 원판이 바뀌지 않기 때문에, 다음과 같은 관찰을 이용해서 재귀식을 그대로 사용할 수 있다.

 

관찰 3. 기둥 위에 고정된 원판이 X+K개, 아래쪽에 X개 있는 경우 가운데 원판은 기둥 위에 고정된 원판이 $K$개, 아래쪽에 $0$개 있는 경우와 같다.

 

증명. 원판이 $n$개 있는 경우, 고정된 원판을 포함한 중심 위치는 $1+\left\lfloor\frac{n+2X+K}{2}\right\rfloor$번째이다. $X+K$개의 고정된 원판을 제외하면, 중심 위치는 $1-K+\left\lfloor\frac{n+K}{2}\right\rfloor$번 원판이 된다. $K=0$일 때는, 위에서 $1+\left\lfloor\frac{n}{2}\right\rfloor$번째, $K=1$일 때는, 위에서 $\left\lfloor\frac{n+1}{2}\right\rfloor$번째 원판이다.

 

  그래서 $1$번과 $N$번 원판을 더 이상 옮기지 않을 생각으로 같이 무시해주어도, 원반의 위치는 변하지 않는다. $M100(N, a, b, c)$는 $M100(N-2, a, c, b)$를 진행하고, $a$ 번 기둥에서 $c$ 번 기둥으로 원판을 두 번 옮기고, $M010(N-2, b, a, c)$를 진행해주면 된다.

  이제 $M010$을 살펴보자. $M010$은 $M000$과 유사하지만, 가운데 원판에 따른 홀짝성을 고려해서 $M101(N-1, a, c, b)$를 진행하고 $a$번 기둥에서 $c$번 기둥으로 원판을 옮기고, $M101(N-1, b, a, c)$를 진행하면 된다. 하지만 이것이 최적이 아닌 경우는 위에 논의했던 대로 $a$ 번 기둥에서 $b$ 번 기둥에 홀짝성이 다른 점을 이용하면 한 번에 두 개의 원판을 옮길 수 있기 때문이다. 이를 이용해서 $a$ 번 기둥에서 $c$ 번 기둥으로 $2$번부터 $N-1$번 원판을 옮기고, $a$ 번 기둥에서 $b$ 번 기둥으로 $1$번과 $N$번 원판을 옮기고, $c$ 번 기둥에서 $a$ 번 기둥으로 $2$번부터 $N-1$번 원판을 옮기고, $b$ 번 기둥에서 $c$ 번 기둥으로 $1$번과 $N$번 원판을 옮기고 $a$ 번 기둥에서 $c$ 번 기둥으로 $2$번부터 $N-1$번 원판을 옮기면 된다.

  ...여기까지가 Jérémy Barbay가 arXiv[1602.03934]에 올린 "Bouncing Towers move faster than Hanoï Towers, but still require exponential time"라는 아티클에 설명되어 있는 사항이고, 이 아티클은 이 방법이 최적이라고 주장하지만, 이 아티클의 증명이 틀렸는지 이 문제가 만점을 받을 수 없는 문제인지, 위에 적힌 방법으로는 만점을 받을 수 없다.($N=25$일 때 $885\,735$번, $N=26$일 때 $1\,594\,323$번 움직인다.)

과정 M010?, 고정된 원판은 -로 표시되었다.

 

 

 

 

 

 

 

  이 문제에서 만점을 받으려면, 해당 아티클의 증명의 틀린 부분을 찾으면서 위 문제의 설명에서 간과되어 있는 부분을 찾아야 하는데, $M010(N, a, b, c)$의 과정은 바깥에 있는 고정된 원판을 움직일 수 없는 것을 가정하고 있지만, 사실 고정된 원판을 움직이고 원래 위치로 돌려놓으면 된다!

  다음과 같은 과정을 생각하자. $N$번 원판의 위치를 고려하지 않고 $1$번부터 $N-1$번까지의 원판을 $a$ 번 기둥에서 $b$ 번 기둥으로 옮겨놓는다. 그 후 $N$번 원반이 $a$ 번 기둥에 있으면 $c$ 번 기둥으로, $c$ 번 기둥에 있으면 $a$ 번 기둥으로 옮긴 다음에, 다시 $1$번부터 $N-1$번까지의 원판을 위 과정의 역순으로 $b$ 번 기둥에서 $c$ 번 기둥으로 옮겨놓는다. 이 경우 $M010(N, a, b, c)$는 (Notation을 확장해서 관찰 3에서 $K=-1$이라는 의미로) $M(-1)01(N-1, a, c, b)$를 진행하고 $N$번 원판의 $a$, $c$위치를 바꾼 이후에 $M10(-1)(N-1, b, a, c)$를 실행한다고도 볼 수 있겠다. 여기서 $K$가 $0$이나 $1$이 아닐 경우에는, 가운데 원판이 고정된 원판을 가리킬 수 있다는 점이고, 우리는 이 경우를 특별하게 허용하기로 했다.

과정 M010, 고정된 원판은 -로 표현되었다.

  위쪽에서 고정된 원판을 -로 표현했다. 아래쪽에서 고정된 원판은 +로 표현하자. $1$번부터 $N$번까지의 원판을 빼내는 과정의 마지막은 $2, +, 1$번 원판 순이 되어버렸다. 이 경우에도 $1$번 원판을 빼내려면 나머지 원판을 다 빼내야 하기 때문에, 나머지 $2$번부터 $N$번 원판까지를 생각해보자. 가장 빨리 빼내는 방법은 $2$번부터 $N$번까지의 원판을 한 개 이하를 제외하고 $b$ 번 기둥에 몰아놓은 이후에 1번 원판을 $c$ 번 기둥으로 옮기는 것이다. 여기서 한 개 이하의 원판을 제외하는 이유는, 한 개의 원판이 있어도 1번 원판이 $c$번 기둥으로 들어갈 수 있기 때문이다. 여기서 우리는 1번과 2번 다음으로 빼기 어려운 $N$ 번 원판을 $c$ 번 기둥에 같이 남기는 방식을 사용할 것이다.

  $3$번 원판부터 $N$ 번 원판까지를 $c$ 번 기둥에 옮기고, $2$번과 $+$ 번 원판을 $b$ 번 기둥에 옮기다. 그리고 나머지 허용된 하나의 $N$ 번 기둥을 제외한 $3$번 부터 $N-1$번 원판을 $b$ 번 기둥에 옮긴다. 나머지는 재귀적으로 $M(-1)01(N-2, b, a, c)$를 호출해주면 된다.

과정 M(-1)01, 고정된 원판은 -, 가장 커서 위치를 자유로이 할 수 있는 원판은 +로 표현되었다.

  이를 구현하면 $N=26$일 때 $972\,051$번 연산을 사용해서 원판을 전부 옮길 수 있고, 이는 $980\,403$이라는 제한 안에 들어가는 수이다.


아래는 풀이를 구현한 소스코드이다.

 

#1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
using namespace std;
 
long long solve(int N)
{
    long long ans = 0;
    for(int i=-N+1; i<=N-1++i)
    {
        int j = sqrt(1LL*N*N-1LL*i*i-1);
        ans += 2*j+1;
    }
    return ans;
}
 
int main()
{
    int T; scanf("%d"&T);
    for(int i=1; i<=T; ++i)
    {
        int N; scanf("%d"&N);
        printf("Case #%d\n%lld\n", i, solve(N));
    }
}
cs

#2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <bits/stdc++.h>
using namespace std;
 
 
int solve(int K, vector<pair<intint> > V)
{
    sort(V.begin(), V.end());
    long long minv = LLONG_MAX;
    do
    {
        const int dx[] = {00123321};
        const int dy[] = {12332100};
        vector<int> xc, yc;
        for(int i=0; i<8++i)
        {
            xc.push_back(V[i].first+dx[i]*K);
            yc.push_back(V[i].second+dy[i]*K);
        }
        sort(xc.begin(), xc.end()); sort(yc.begin(), yc.end());
        long long ans = 0;
        for(int i=0; i<8++i)
            ans += abs(xc[i]-xc[3])+abs(yc[i]-yc[3]);
        minv = min(ans, minv);
    }while(next_permutation(V.begin(), V.end()));
 
    return minv;
}
 
int main()
{
    int T; scanf("%d"&T);
    for(int i=1; i<=T; ++i)
    {
        int K; scanf("%d"&K);
        vector<pair<intint> > V;
        for(int j=0; j<8++j)
        {
            int a, b; scanf("%d%d"&a, &b);
            V.emplace_back(a, b);
        }
        printf("Case #%d\n%d\n", i, solve(K, V));
    }
}
cs

#3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <bits/stdc++.h>
using namespace std;
 
long long solve(int N, int K, vector<vector<long long> > A)
{
    vector<vector<long long> > D(N+2*K, vector<long long>(N+2*K)), U = D, R = D, L = D, ans = D;
    auto get = [N, K](const vector<vector<long long> >& V, int x, int y)
    {
        if(x < 0 || x >= N+2*|| y < 0 || y >= N+2*K) return 0LL;
        return V[x][y];
    };
 
    long long ret = 0;
    for(int i=0; i<N+2*K; ++i)
        for(int j=0; j<N+2*K; ++j)
        {
            D[i][j] = get(D, i-1, j-1- get(A, i-K, j-1+ get(A, i, j+K-1);
            U[i][j] = get(U, i-1, j+1- get(A, i-1, j+K) + get(A, i+K-1, j);
        }
    for(int i=0; i<N+2*K; ++i)
        for(int j=0; j<N+2*K; ++j)
        {
            R[i][j] = get(R, i-1, j) - get(D, i-1, j) + get(U, i, j);
            L[i][j] = get(L, i-1, j) - get(U, i-K, j-K+1+ get(D, i+K-1, j-K+1);
        }
    for(int i=0; i<N+2*K; ++i)
        for(int j=0; j<N+2*K; ++j)
            ret = max(ret, (ans[i][j] = get(ans, i, j-1- get(L, i, j-1+ get(R, i, j)));
    return ret;
}
 
int main()
{
    int T; scanf("%d"&T);
    for(int t=1; t<=T; ++t)
    {
        int N, K; scanf("%d%d"&N, &K);
        vector<vector<long long>>V(N+2*K, vector<long long>(N+2*K));
        for(int i=K; i<N+K; ++i)
            for(int j=K; j<N+K; ++j)
                scanf("%lld"&V[i][j]);
        printf("Case #%d\n%lld\n", t, solve(N, K, V));
    }
    return 0;
};
cs

#4 (node가 패턴의 길이만큼의 배열을 담고 있어서, 시간복잡도가 더 크나, 통과 가능하다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <bits/stdc++.h>
using namespace std;
 
vector<int> convert(string s)
{
    vector<int> res(s.size());
    vector<int> arr(26-1);
    for(int i=0; i<(int)s.size(); ++i)
    {
        int c = s[i]-'a';
        if(arr[c] == -1) res[i] = 0;
        else res[i] = i - arr[c];
        arr[c] = i;
    }
    return res;
}
 
const int PATTERN_MAXL = 500;
const int PATTERN_TOTLEN = 30000;
 
struct Node
{
    int L, cnt;
    int next[PATTERN_MAXL+1];
    int fail;
} NODE[PATTERN_TOTLEN+1];
 
int tp = 0;
 
void reset(){ tp = 0; }
 
int new_node()
{
    NODE[tp].L = NODE[tp].cnt = 0;
    memset(NODE[tp].next, -1sizeof NODE[tp].next);
    NODE[tp].fail = -1;
    return tp++;
}
 
int get_fail(int node, int c)
{
    if(node == -1return 0;
    if(c > NODE[node].L) c = 0;
    if(NODE[node].next[c] != -1return NODE[node].next[c];
    return get_fail(NODE[node].fail, c);
}
 
int put(int node, int c)
{
    if(NODE[node].next[c] != -1return NODE[node].next[c];
    int ret = new_node();
    NODE[ret].L = NODE[node].L + 1;
    NODE[node].next[c] = ret;
    return ret;
}
 
vector<int> fail_order;
void forward_fail()
{
    fail_order.clear();
    queue<int> Q; Q.push(0);
    while(!Q.empty())
    {
        int n = Q.front(); Q.pop();
        fail_order.push_back(n);
        for(int i=0; i<=NODE[n].L; ++i)
        {
            int m = NODE[n].next[i];
            if(m != -1)
            {
                Q.push(m);
                NODE[m].fail = get_fail(NODE[n].fail, i);
            }
        }
    }
}
void back_prop()
{
    reverse(fail_order.begin(), fail_order.end());
    for(int n: fail_order)
        if(n != 0)
            NODE[ NODE[n].fail ].cnt += NODE[n].cnt;
}
 
 
vector<int> solve(vector<int> s, vector<vector<int>> V)
{
    reset();
    int root = new_node();
    vector<int> patNodes;
    for(const auto& pat: V)
    {
        int cur = root;
        for(auto v: pat)
            cur = put(cur, v);
        patNodes.push_back(cur);
    }
    forward_fail();
    int cur = root;
    for(auto v: s)
    {
        cur = get_fail(cur, v);
        NODE[cur].cnt++;
    }
    back_prop();
    for(auto& v: patNodes) v = NODE[v].cnt;
    return patNodes;
}
 
int main()
{
    ios::sync_with_stdio(false);
    int T; cin >> T;
    for(int t=1; t<=T; ++t)
    {
        int N, K; string s; cin >> N >> K >> s;
 
        vector<vector<int>> V(K);
        for(auto& v: V)
        {
            string s; cin >> s; v = convert(s);
        }
 
        vector<int> res = solve(convert(s), V);
 
        long long ans = 0;
        for(int i=1; i<=K; ++i) ans += res[i-1]*i;
 
        cout << "Case #" << t << endl << ans << endl;
    }
}
cs

#5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <string>
#include <iostream>
using namespace std;
 
string op[3= {"*AB""C*D""EF*"};
string B1(intintintint), B2(intintintint), C(intintintint);
string D1(intintintint), D2(intintintint);
 
string A(int N, int a, int b, int c)
{
    if(N == 0return string();
    return B1(N-1, a, c, b) + op[a][c] + B2(N-1, b, a, c);
}
 
string B1(int N, int a, int b, int c)
{
    if(N == 0return string();
    if(N == 1return string({op[a][c]});
    return B1(N-2, a, c, b) + op[a][c] + op[a][c] + C(N-2, b, a, c);
}
 
string B2(int N, int a, int b, int c)
{
    if(N == 0return string();
    if(N == 1return string({op[a][c]});
    return C(N-2, a, c, b) + op[a][c] + op[a][c] + B2(N-2, b, a, c);
}
 
string C(int N, int a, int b, int c)
{
    if(N == 0return string();
    if(N == 1return string({op[a][c]});
    if(N == 2return string({op[a][b], op[a][c], op[b][c]});
    return D1(N-1, a, c, b) + (N%4 < 2 ? op[a][c]: op[c][a]) + D2(N-1, b, a, c);
}
 
string D1(int N, int a, int b, int c)
{
    if(N == 0return string();
    if(N == 1return string({op[a][b], op[a][c]});
    if(N == 2return string({op[a][c], op[a][b], op[a][c]});
    return C(N-2, a, b, c) + op[a][b] + op[a][b] + C(N-3, c, a, b) + op[a][c] + D1(N-2, b, a, c);
}
 
string D2(int N, int a, int b, int c)
{
    if(N == 0return string();
    if(N == 1return string({op[a][c], op[b][c]});
    if(N == 2return string({op[a][c], op[b][c], op[a][c]});
    return D2(N-2, a, c, b) + op[a][c] + C(N-3, b, c, a) + op[b][c] + op[b][c] + C(N-2, a, b, c);
}
 
string solve(int N)
{
    return A(N, 012);
}
 
int main()
{
    int N = 26;
    cout << "Case #1" << endl << N << endl << solve(N) << endl;
}
cs

'프로그래밍 > 알고리즘' 카테고리의 다른 글

SCPC 2021 2차 풀이  (1) 2021.08.07
SCPC 2021 1차 풀이  (0) 2021.07.17
Merry Problem Solving 4일차  (0) 2018.12.26
Merry Problem Solving 3일차  (0) 2018.12.24
Merry Problem Solving 2일차  (0) 2018.12.24
Merry Problem Solving 1일차  (0) 2018.12.21
  1. 맞춤법지킴이 2021.08.07 21:55

    회수 -> 횟수

    https://kornorms.korean.go.kr/regltn/regltnView.do?regltn_code=0001&regltn_no=250#a250

    제30항 사이시옷은 다음과 같은 경우에 받치어 적는다.
    3. 두 음절로 된 다음 한자어
    횟수(回數)

+ Recent posts