문자열 - 아호 코라식(Aho-Corasick)
아호 코라식(Aho-Corasick)에 대해 알아보자.
1년 가까이 코드포스를 한 것 같다. 중간에 코드포스를 쉰 적도 있었지만 백준을 풀면서도 꼭 블루로 올리고 싶다고 생각을 했었다.
내가 올린 과정과 방법, 그리고 앞으로 어떻게 공부하는 것이 좋은지 글로 남기려고 한다.
내가 고생한 만큼까지 고생하지 않도록 내 글을 읽는 누군가가 도움이 되었으면 한다.
지금 찐블루가 아니기때문에 점수 올리는 법 같은 글을 쓰는 것도 웃기지만 나에게 너무 기쁜일이라 이 경험을 꼭 공유하고 싶다.
먼저 이건 내 본캐(dosaseung)의 점수이다. (아직 민트다..ㅎ)
그래도 뭔가 분석해보자면 뉴비에서 고생하다가 그린으로 올라가고, 또 그린에서 고생하다가 민트로 올라간다.
그리고 또 민트에서 고생하고 있었다 ㅋㅋ 마치 계단형 그래프에 노이즈를 끼운듯한 느낌?
민트에서 고생하면서 든 생각은 ‘나는 사실 블루를 갈만한 놈이 아닌건 아닐까?’였다.
하지만 그래프를 분석해보면 이제는 블루를 갈때라고 생각했어도 됐을텐데 싶다.
민트에서 고생하는 내가 싫어서 부캐를 만들었다. 그리고 조용히 실력을 쌓아보자 했던 것이다.
아래는 부캐의 점수 등락 추이다.
결과는 10번만에 블루에 입성했다!!!
마지막에 504등을 하면서 104점을 끌어올려 겨우 찍은 것이 보일것이다 ㅋㅋ
아직은 항상 블루 퍼포먼스가 나오진 않는다.
하지만 내가 확실하게 느낀 것은 계속하면 분명히 실력이 늘고 앞으로 항상 블루 퍼포먼스가 나오는 날이 분명히 올 것이라는 것이다.
1603점..블루 턱걸이까지 나는 겨우 왔다.
하지만 겨우 왔기 때문에 어떻게 해야 블루를 갈 수 있는지 생각을 많이 해볼 수 있었고 그 방법을 이야기 해보려고 한다.
일단 정보는 당연히 중요하다.
내가 어느정도를 해야 어느 정도의 점수가 오르고, 어떤 문제가 주로 나오고, 보통 대회 시간은 언제고 등 여러 정보를 알고 있어야 점수를 올리기 유리하다.
블루를 목표로 한다고 해보자.
그러면 보통 div2에는 20000명 정도가 참여한다. 그러면 여기서 최소 1500등안에 들어야한다.
블루가 상위 10퍼센트라고 하지만 점수가 오르려면 1500등 안에는 들어야 민트에서 점수가 오른다.
그러면 어떻게 풀어야 이 등수가 나올까?
나는 A, B, C를 매우 빨리(40분이내) 풀거나 D까지 대회시간 20~30분정도 남기고 풀면 이 등수가 나온다고 느꼈다.
물론 셋의 난이도에 따라 확확 변하긴하지만 중요한 것은 쉬운 문제 (A, B, C)를 빨리 푸는 것이다.
이는 타자를 빨리 치는건 중요치 않다. (올바른 생각을 한번에 하고 정확하게 밀고 나가는 것이 중요하다)
이런 목표를 세우려면 코드포스 시스템을 잘 이해하는 것이 좋다.
코드포스에 나오는 유형은 매우 전형적인 코드포스 문제이다.
아무리 백준으로 많이 연습해도 코드포스를 푸는 것과는 조금 차이가 있다는 말이다.
특히 짝수/홀수를 이용하는 문제, n = 1, 2, 3을 예외 처리하고 나머지를 처리하는 문제, gcd를 이용해야 할 것 같지만 사실은 배수/약수 논리로 푸는 문제 등이 A, B, C에 많이 배치된다.
또한 뒤에서부터 보면서 푸는 테크닉, 코포에 자주 나오는 그리디가 분명히 존재한다.
백준에서 어려운 알고리즘 (HLD, FFT 등등)을 배워도 코드포스 블루가는데는 쓸모가 없다. (생각의 성장, 구현실력 향상을 제외하곤 없다)
따라서 연습을 코드포스로 열심히 해야한다. 나는 사실 이걸 알지만 열심히 안했다….
대신!! 대회는 무조건 참가했다. 절대적인 양을 무시할 수 없다는 것이다.
단기간에 빠르게 점수를 올리고 싶다면 버츄얼을 많이 도는 것이 좋다. (특히 A, B, C, D까지 빨리 풀기를 연습해보자)
모두가 해야하는걸 알지만 너무나도 귀찮은 것이 틀린 문제 다시 풀기다.
코포에서 업솔빙이 중요한 이유는 2번에서 이야기한 내용과 일맥상통한다.
코드포스에 자주 등장하는 유형을 익히는 것이 정말 중요하기 때문이다.
특히 에디토리얼이 정말 잘 나와있다. 커뮤니티 댓글도 좋은 정보가 많다.
에디토리얼의 힌트나 설명을 이용해서 풀어보면 출제자의 의도를 확인하기도 좋을 것이다.
내가 생각하기에 중요한 것은 절대 남의 코드를 보면서 업솔빙하지 않기이다.
남의 코드를 보면서 업솔빙하면 그 논리가 제대로 내 머리속에 박히지 않고 그냥 날아가버리기 때문이다.
물론 남의 코드를 보고 다시 내 코드로 바꿔보는 것도 괜찮긴하다. 하지만 그냥 보면서 거의 배끼듯이하면 실력향상이 매우 더딜것이다. (내가 좀 그랬다…그냥 이렇게 푸는거구나 하고 넘기거나 , 에디토리얼의 코드를 좀만 손봐서 제출하곤했다)
조금 귀찮더라도 스스로 생각하는 법을 기르긴 해야한다.
2번에서 이야기했듯이 사실 백준은 코드포스를 올리는데 엄청난 도움이 되지는 못한다.(한국인 세터분들의 코드포스 문제가 있긴하다)
하지만 백준에서의 장점은 한국 사이트고 사람들도 많이하고 solved.ac가 재밌어서 꾸준히 할 수 있다는 것이다.
스트릭을 쌓는 재미라던지 (근데 이게 나중엔 필수 퀘스트같아서 굉장히 힘들어지긴 한다.) 그런 것들로 문제 푸는 습관을 들일 수 있다.
나의 스트릭이다. 정말 꾸준히 했다.
근데 내가 추천하는 것은 어떤 문제를 질질 끌면서 고민하는 거 말고 백준 문제를 시간을 잡고 좀 타이트하게 푸는 연습을 하는 것이 좋다. 그러니까 코포 블루를 가고 싶다면 다이아,루비 문제는 조금 미뤄도 괜찮다.
결국 하고픈 말은 코드포스 문제를 많이 그리고 꾸준히 풀어봐라 인것 같다.
머리가 좋은 사람들은 굉장히 빨리 블루에 가곤한다. (그래서 내가 더욱 심리적으로 힘들었다)
하지만 실력이 멈춘것 같아도 무조건 늘고 있으니 계속 도전하길 바란다.
나 혼자 심심해서 Q&A형식으로 내 계획을 말해보려한다.
네니오. 10월달은 시험기간이라서 쉬려고 한다. PS만 하다가 지난학기 좀 많이 망쳤다.
심지어 지난학기에 믿고 있던 알고리즘도 A밖에 못맞았다. (다른 과목들은 B, B+…)
이번엔 방심하지 않고 열심히 시험공부를 해야봐야겠다.
그렇다면 당연히 YES다. 나의 목표는 레드코더가 될 때까지 하는 것이다. 몇 년이 걸려도 계속 해볼 생각이다.
중간에 현실적인 문제(취업 등)가 있어서 못하게 된다면 잠시 쉴 수도 있지만 몇 십년이 지나도 계속 하지 않을까 싶다.
CP가 참 매력있고 재밌기 때문이다.
그건 사실 큰일났다. 내가 개발공부를 거의 안해서 회사에서 뽑아갈지 모르겠다. ㅋㅋㅋ
하지만 왜인지 이 PS공부가 다른 사람과 나의 차이를 만들고 내 장점을 만들어준 기분이라 왠지 모를 자신감이 있다.
사실 나의 꿈은 게임개발자이다.
내 인생의 목표는 내 생각들(인생에 대한 생각, 재밌다고 생각한 것, 공부한 것 등)을 다른 사람들과 함께 즐기고 정신적인 고양을 하는 것이 목표이기 때문이다.
그 중 게임은 문학, 음악, 미술, 프로그래밍 등 다양한 분야가 합쳐진 종합 예술이고 따라서 내 생각을 전하는 매개체로 참 좋다고 생각했기 때문이다.
어쨌든 그에 대한 공부를 하긴 할거다…ㅠㅠ
내년에 휴학을 한번하고 내 공부계획을 정리 해볼까?도 고민중이다.
이 질문은 내가 나에게 하는건 아니고 진짜 좋아하는 사람이 질문 해줘서 넣었다.
참 어려운 것 같다. 막연하게 코드포스 레드? 오렌지? ICPC 본선 10등이내? 참 대단한 목표들이 있다. 하지만 이건 PS를 공부하는 이유가 될 수 없다.
예를 들어, “왜 공부하세요?” 라는 질문에 “좋은 회사에 가려고요” 라고 하는 느낌이기 때문이다.
위 대답이 나쁜건 아니지만 공부의 목표가 저런거라면 나는 조금 씁쓸한 느낌이 들어서 별로다.
최종목표를 생각하기 전에 왜 내가 이 공부를 하는가 생각해봤더니 재밌어서였다.
나는 이 재밌는 공부를 많이 많이 배워서 다른 누군가에게 잘 알려줄 수 있는 사람이 되고 싶다.
누군가가 나를 통해 PS에 재미를 느낀다면 정말 뿌듯할 것 같다.
뭔가 게임을 개발해서 유저에게 기쁨을 주고 싶은 마음과 일맥상통하는 것 같기도 하다.
최종목표는 누군가에게 이 재미를 알려줄 수 있을 정도로 PS를 좋아하고 잘 알기!!로 정했다.
언젠가 PS가 재미없어지는 날이 올지도 모른다.
하지만 이렇게 재밌게 했던 기억과 추억은 평생가기 때문에 이런 목표는 변하지 않을 것이다.
아니면 어쩌면 이미 이룬 상태일지도 ㅋㅋ
뭔가 추상적인 말들만 늘어놓다보니 엄청 긴 글이 되었다.
나 어쩌면 글 쓰는걸 좋아하는 걸지도??
마무리하며, 내가 하고 싶은 말을 해보겠다.
내 글을 읽어보는 사람은 PS(Problem Solving)를 하는 사람일 확률이 높을텐데
나는 스물둘에 ps를 접했다. (지금은 24이고) 그리고 20살 전까지만해도 나는 정말 똑똑한데 노력을 안해서 이런줄 알았고, 수학을 못하는 다른 애들을 무시했고, 머리가 안 좋아 보이는 사람들을 무시했다.
하지만 여기 PS판에는 괴물들이 굉장히 많다.
나는 여기서 매우 겸손해졌다 ㅋㅋ 그리고 모든 사람들을 대단하게 보기 시작했다.
내가 풀고 남이 못 푸는 문제가 있으면 내가 못풀고 남이 푸는 문제가 있듯이 서로 잘하는게 다를 수 있다.
내가 알아낸 것은 못하는 것이라도 계속하면 실력이 늘고, 못하는 것을 계속하는 것이 지능보다 대단한 진짜 능력이라는 것이다.
나는 민트에서 블루의 과정에서 포기를 생각하기도 했다. 하지만 계속했고 결국 이뤄냈다.
계속 도전하는 좋은 마인드를 얻어낸 것 같다.
너무 정신없이 글을 쓴 것 같다.
결론은
이 두 가지이다.
나의 경험이 PS하는 사람에게 재미, 도움을 주었으면 정말 좋겠다.
긴 글을 읽어준 사람들 너무 고맙습니다 💙🩵
아호 코라식(Aho-Corasick)에 대해 알아보자.
docker를 이해해보자
2060 염소줄서기 풀이 및 코드
분할정복을 이용한 다이나믹 프로그래밍 최적화
코드포스 다시 열심히! 블로그도 열심히!
rust 공부시작!
코드포스 블루 달성 후기
여름캠프 및 SUAPC 후기
2023-05-25-Edu Codeforce round 149 (Div.2)
2023-05-13-Edu Codeforce round 148 (Div.2)
HLD(Heavy Light Decomposition)
행렬 거듭 제곱
2023-05-02-It takes two
Codeforce round 868 (Div.2)
2월 11일 문제풀이
Codeforces#846, TypeDB Foreces 2023, Codeforces#848 업솔빙
ps5 게임 : 용과같이 제로 리뷰
백준 23877번 Convoluted Intervals 문제풀이
codeforce round #828(div 3), EDU #137(div 2) 업솔빙
codeforce round #823(div 2), #824(div 2) 업솔빙
AtCoder Beginner Contest 270 업솔빙
ps5 게임 : 용과같이 극 1 리뷰
백준 18719번 Binomal 문제풀이
백준 14288번 회사문화4 문제풀이
백준 3308번 Matching 문제풀이
백준 18186번 라면사기(large) 문제풀이
백준 4196번 도미노 문제풀이
백준 3176번 도로 네트워크 문제풀이
백준 16367번 TV Show Game 문제풀이
ps5 게임 : 페르소나 5 더 로열 리뷰
codeforce round #811(div 3), #812(div 2), CodeTon round 2 업솔빙
백준 21162번 뒤집기 K 문제풀이
codeforce round #808(div 2), #803(div 2, virtual) 업솔빙
codeforce round #807(div 2) 업솔빙
백준 10167번 금광 문제풀이
codeforce round #805(div 3), #806(div 4) 업솔빙
백준 18253번 최단경로와 쿼리 문제풀이
에듀 라운드 131 업솔빙
백준 1949번 우수 마을 문제풀이
백준 3665번 최종 순위 문제풀이
Trie 자료구조 이해하기
merge sort를 이용하여 inversion 개수세기
3솔의 벽이 너무 높다..
lazy propagation없이 구간 갱신하기
코드포스 폭망기념 upsolving
백준 11505 구간 곱 구하기 문제풀이
백준 1305 광고 문제풀이
백준 4386 별자리 만들기 문제풀이
백준 4803 트리
백준 2206 벽 부수고 이동하기 문제풀이
백준 2166 다각형의 면적 문제풀이
백준 12015 가장 긴 증가하는 부분 수열2 문제풀이
백준 10986 나머지합 문제풀이
스택 구현하기 ========== 자료구조의 기본이라고 하면 스택 과 큐가 있다 백준 10828번에서 마주친 스택
매우매우 많은 정렬이 있지만 그중 가장 안 어려운 3가지를 공부해보았다.
Leave a comment