{"id":26638372,"url":"https://github.com/ohzeno/algo","last_synced_at":"2025-10-24T01:04:27.905Z","repository":{"id":39253806,"uuid":"449220693","full_name":"ohzeno/Algo","owner":"ohzeno","description":"Problem Solving","archived":false,"fork":false,"pushed_at":"2025-03-31T17:57:45.000Z","size":4335,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-31T18:44:21.796Z","etag":null,"topics":["algorithms","baekjoon","data-structures","javascript","leetcode","problem-solving","programmers","python","sql","swea"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ohzeno.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-18T09:30:19.000Z","updated_at":"2025-03-31T17:57:48.000Z","dependencies_parsed_at":"2024-06-28T10:49:40.517Z","dependency_job_id":"a1f4cca9-2147-47f6-b302-b66090cfd9f2","html_url":"https://github.com/ohzeno/Algo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ohzeno%2FAlgo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ohzeno%2FAlgo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ohzeno%2FAlgo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ohzeno%2FAlgo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ohzeno","download_url":"https://codeload.github.com/ohzeno/Algo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248287974,"owners_count":21078819,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithms","baekjoon","data-structures","javascript","leetcode","problem-solving","programmers","python","sql","swea"],"created_at":"2025-03-24T17:35:12.664Z","updated_at":"2025-10-24T01:04:27.832Z","avatar_url":"https://github.com/ohzeno.png","language":"Python","readme":"# Algo\n\n[TOC]\n\n\n\nBaekJoon, Programmers, LeetCode, SWEA 등에서 알고리즘, SQL 문제들을 풀어서 기록하고 있다. Python, JavaScript, SQL은 여기서 관리하고, Java는 [Algo_Java](https://github.com/ohzeno/Algo_Java) 레포에서 관리하고 있다.\n\n사이트, 문제, 언어에 따라 [AlgoBoost](https://github.com/ohzeno/AlgoBoost) 확장프로그램에서 자동으로 양식을 만들고 클립보드에 복사해준다.\n\nSQL의 경우 문제가 적어서 복습하는 경우가 많다. 너무 간단한 쿼리의 경우, 다시 풀어도 변화가 없는 경우가 있어 다시 커밋하지 않기로 한다.\n\n\u003cbr\u003e\n\n## boj_judge\n\n프로그래머스나 릿코드와 달리 백준은 테스트케이스가 여럿일 때 테스트가 힘들다.\n\n채점기를 만들어서 한꺼번에 채점할 수 있도록 했다.\n\n```python\nimport sys\n# sys.stdin = open(\"input.txt\")\ndef input():\n    return sys.stdin.readline().rstrip()\n```\n\n풀이코드의 sys.stdin = open(\"input.txt\")를 주석처리하고 사용한다.\n\n```py\nscript = \"i_pro.py\"\n```\n\nboj_judge.py에서 스크립트의 경로를 지정한다. 나는 최상위 폴더의 i_pro.py에 풀이하기에 수정할 일이 거의 없다.\n\n```py\ninputdatas = [\n    {\n        \"data\": \"\"\"2 1\n5 10\n100 100\n11\"\"\",\n        \"answer\": \"10\",\n    },\n    {\n        \"data\": \"\"\"3 2\n1 65\n5 23\n2 99\n10\n2\"\"\",\n        \"answer\": \"164\",\n    },\n]\n```\n\n백준의 테케를 복사해서 넣으면 정렬이 이상하게 보이지만 이건 아직 어쩔 수 없다. 여기서 정렬을 맞추면 데이터의 정렬이 이상해져서 입력에 문제가 생김. 그렇다고 테케를 복사해서 붙여넣을 때마다 줄바꿈을 \\n으로 바꾸는 것은 비효율적이다.\n\n이후 boj_judge_py.py(언어별로 파일명이 다르다.)를 실행하면 된다.\n\n```cmd\npass\npass\n```\n\n테케 모두 통과할 경우.\n\n```cmd\npass\nfail\n  expected:\n    164\n  got:\n    163\n```\n\n틀릴 경우 정답과 내 풀이 출력값 비교\n\n```cmd\npass\nfail\n  expected:\n    164\n  Error:\n    Traceback (most recent call last):\n      File \"i_pro.py\", line 36, in \u003cmodule\u003e\n        max_price /= 0\n    ZeroDivisionError: division by zero\n```\n\n풀이 코드에서 에러가 발생할 경우, 해당 코드의 에러만 가져와서 에러 위치와 내용을 출력하도록 처리했다.\n\n\u003cbr\u003e\n\n## 제출용 코드 변환\n\n### Algo\n\n로컬과 사이트에 제출할 코드는 다르다. 특히 백준 제출시에는 풀이 코드에서 sys.stdin = open(\"input.txt\")을 제거하지 않으면 오류가 발생한다.\n\n```py\nfile_path = '../i_pro.py'\n```\n\n제출용 코드 변환/제출용 코드 변환.py에서 변환할 코드 경로를 입력. ~~나는 i_pro.py만 사용해서 수정할 일이 거의 없다.~~ js, java 문제풀이도 하게 되어 언어별 변환 파일을 따로 만들었다.\n\n이후 실행하면 코드에서 주석을 비롯해 불필요한 부분을 제거하고 클립보드에 복사한다. 백준, 릿코드, 프로그래머스 모두 가능.\n\n\u003cbr\u003e\n\n### SQL 스키마 변환\n\n프로그래머스는 스키마를 제공하지 않지만 릿코드는 스키마를 제공해서 로컬에서 테스트할 수 있다. 하지만 스키마가 난잡해서 알아보기 힘들다. \n\nSQL/input.txt에 릿코드의 스키마를 붙여넣고 SQL/Schema_Conversion.py를 실행하면 알아보기 쉽게 변환된 쿼리가 클립보드에 복사된다.\n\n해당 쿼리를 sql_pro.sql 위쪽에 붙여넣고 쿼리를 넣고 실행하면 로컬에서 db를 조회하고 테스트할 수 있다.\n\n```sql\nCreate table If Not Exists Product (product_id int, product_name varchar(10), unit_price int)\nCreate table If Not Exists Sales (seller_id int, product_id int, buyer_id int, sale_date date, quantity int, price int)\nTruncate table Product\ninsert into Product (product_id, product_name, unit_price) values ('1', 'S8', '1000')\ninsert into Product (product_id, product_name, unit_price) values ('2', 'G4', '800')\ninsert into Product (product_id, product_name, unit_price) values ('3', 'iPhone', '1400')\nTruncate table Sales\ninsert into Sales (seller_id, product_id, buyer_id, sale_date, quantity, price) values ('1', '1', '1', '2019-01-21', '2', '2000')\ninsert into Sales (seller_id, product_id, buyer_id, sale_date, quantity, price) values ('1', '2', '2', '2019-02-17', '1', '800')\ninsert into Sales (seller_id, product_id, buyer_id, sale_date, quantity, price) values ('2', '2', '3', '2019-06-02', '1', '800')\ninsert into Sales (seller_id, product_id, buyer_id, sale_date, quantity, price) values ('3', '3', '4', '2019-05-13', '2', '2800')\n```\n\n```sql\nCreate table If Not Exists Users;\nTruncate table Users;\ninsert into Users;\n```\n\n리트코드의 스키마는 위와 같은 과정을 거치지만 이렇게 하면 이미 Users 테이블이 존재할 경우, 데이터만 제거된다.\n\n그리고 새로 입력하려던 Users와 기존 Users의 스키마가 다를 경우 오류가 발생한다.\n\n```sql\nDROP TABLE IF EXISTS Users;\n```\n\n그래서 DROP TABLE IF EXISTS Users; 를 사용하여 기존 테이블이 존재할 경우 제거하고 새로운 테이블을 생성하도록 했다.\n\n```sql\nDROP TABLE IF EXISTS Product;\nDROP TABLE IF EXISTS Sales;\nCreate table Product (product_id int, product_name varchar(10), unit_price int);\nCreate table Sales (seller_id int, product_id int, buyer_id int, sale_date date, quantity int, price int);\ninsert into Product (product_id, product_name, unit_price)\nvalues ('1', 'S8', '1000'),\n       ('2', 'G4', '800'),\n       ('3', 'iPhone', '1400');\ninsert into Sales (seller_id, product_id, buyer_id, sale_date, quantity, price)\nvalues ('1', '1', '1', '2019-01-21', '2', '2000'),\n       ('1', '2', '2', '2019-02-17', '1', '800'),\n       ('2', '2', '3', '2019-06-02', '1', '800'),\n       ('3', '3', '4', '2019-05-13', '2', '2800');\n```\n\n변환된 쿼리\n\n\u003cbr\u003e\n\n## 양식\n\n백준, 프로그래머스, 릿코드, 프로그래머스 sql, 릿코드 sql 양식을 따로 뒀다.\n\njs양식은 로직이 같으니 여기서 다루지 않는다. java양식은 [Algo_Java](https://github.com/ohzeno/Algo_Java) 레포에 있고, 로직이 같으니 다루지 않는다.\n\n평소에는 [AlgoBoost](https://github.com/ohzeno/AlgoBoost) 확장프로그램에서 양식을 자동으로 만들고 클립보드에 넣어주면 i_pro.py, i_pro.js, Main.java 등에 붙여넣고 풀고 있다.\n\n 백준, 프로그래머스 양식은 특이사항이 없으므로 여기서 설명하지 않는다.\n\n\u003cbr\u003e\n\n### 리트코드 양식\n\n```py\nimport inspect\nfunctions = [\n    value for value in Solution.__dict__.values() if inspect.isfunction(value)\n]\nmy_func = functions[0]\nsol = Solution()\nfor inputdata in inputdatas:\n    data, ans = inputdata[\"data\"], inputdata[\"answer\"]\n    res = my_func(sol, *data)\n    if res == ans:\n        print(\"pass\")\n    else:\n        summary = \"fail\"\n        for label, content in [(\"expected:\", ans), (\"got:\", res)]:\n            summary += f\"\\n  {label}\\n\"\n            summary += f\"    {content}\\n\"\n            summary = summary.rstrip()\n        print(summary)\n```\n\n릿코드는 Solution함수 내부에 함수를 만들도록 되어있으므로 my_func에 Solution 내부 함수들을 가져와서 사용한다. 함수가 여럿이면 my_func에서 인덱싱 해줘야 하고, 인풋데이터가 릿코드식 트리구조인 경우, 트리를 만드는 등 따로 작업한다.\n\nfunctions는 정의순서를 유지하기 위해 `__dict__`로 직접 참조하였다. my_func는 인스턴스 메서드 사용이지만 직접참조라 self가 자동 전달되지 않는다. 그래서 인스턴스를 생성해서 첫 인자로 넣어준다.\n\nex) [Binary Tree Level Order Traversal](https://leetcode.com/problems/binary-tree-level-order-traversal/?envType=study-plan\u0026id=level-1)\n\n```py\nclass TreeNode:\n    def __init__(self, val=0, left=None, right=None):\n        self.val = val\n        self.left = left\n        self.right = right\n        \ndef build_binary_tree(datas: List[Optional[int]]):\n    if not datas:\n        return None\n    root = TreeNode(datas[0])\n    queue = deque([root])\n    i = 1  # 인덱스 0은 이미 처리했으므로, 인덱스 1부터 시작\n    l_datas = len(datas)\n    while i \u003c l_datas:\n        cur_node = queue.popleft()\n        for side in [\"left\", \"right\"]:  # 자식 추가\n            if i \u003c l_datas and datas[i] is not None:\n                child = TreeNode(datas[i])\n                setattr(cur_node, side, child)  # cur_node.side = child\n                queue.append(child)\n            i += 1\n    return root\n\nimport inspect\nsol = Solution()\nfunctions = inspect.getmembers(sol, predicate=inspect.ismethod)\nmy_func = functions[0][1]\nfor t in inputdatas:\n    tree = build_binary_tree(t)\n    print(my_func(tree))\n```\n\n\u003cbr\u003e\n\n### 리트코드 SQL 양식\n\n```sql\nCreate table If Not Exists Users;\nTruncate table Users;\ninsert into Users;\n```\n\n리트코드의 스키마는 위와 같은 과정을 거치지만 이렇게 하면 이미 Users 테이블이 존재할 경우, 데이터만 제거된다.\n\n그리고 새로 입력하려던 Users와 기존 Users의 스키마가 다를 경우 오류가 발생한다.\n\n```sql\nDROP TABLE IF EXISTS Users;\n```\n\n그래서 DROP TABLE IF EXISTS Users; 를 사용하여 기존 테이블이 존재할 경우 제거하고 새로운 테이블을 생성하도록 했다.\n\nSchema_Conversion.py에서는 이런 내용을 고려하여 변환하도록 되어있다.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fohzeno%2Falgo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fohzeno%2Falgo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fohzeno%2Falgo/lists"}