diff --git a/01_copyFiles.py b/01_copyFiles.py index a3f9b0c..7262a24 100644 --- a/01_copyFiles.py +++ b/01_copyFiles.py @@ -50,10 +50,10 @@ def copy_ent_files(source_root, target_root): # source_directory = r"D:\project\data\CAS_제2510회 정기\제2510회 코딩활용능력 2급 정기 답안파일" # 원본 디렉토리 경로 # test_name = "2512_CAS_2_A" -test_name = "2512_CAS_2_B" +test_name = "2601_CAT_3_A" # source_directory = r"D:\project\data\CAT_제2511회 정기\답안파일" # 원본 디렉토리 경로 -source_directory = r"D:\project\data\제2512회 정기_CAS\CAS\B형" # 원본 디렉토리 경로 +source_directory = r"D:\project\data\CAT_제2601회 정기\CAT_제2601회 정기\CAT_답안파일" # 원본 디렉토리 경로 target_directory = rf".\ent\{test_name}" # 타겟 디렉토리 경로 copy_ent_files(source_directory, target_directory) diff --git a/02_extract_project_json.py b/02_extract_project_json.py index 0034b66..2773202 100644 --- a/02_extract_project_json.py +++ b/02_extract_project_json.py @@ -50,8 +50,8 @@ def process_ent_files(ent_dir, output_dir): # 실행 예 if __name__ == "__main__": - # test_names = ["2509_CAT_3_A"] - test_names = ["2512_CAS_2_A", "2512_CAS_2_B"] + test_names = ["2601_CAT_3_A"] + # test_names = ["2512_CAS_2_A", "2512_CAS_2_B"] for test_name in test_names: ent_dir = f".\\ent\\{test_name}" output_dir = f".\\output\\{test_name}" diff --git a/251128_2511_CAT_3_A_채점결과.xlsx b/251128_2511_CAT_3_A_채점결과.xlsx deleted file mode 100644 index a5d4cd2..0000000 Binary files a/251128_2511_CAT_3_A_채점결과.xlsx and /dev/null differ diff --git a/260129_2512_CAS_2_B_TEST.xlsx b/260129_2512_CAS_2_B_TEST.xlsx new file mode 100644 index 0000000..d697343 Binary files /dev/null and b/260129_2512_CAS_2_B_TEST.xlsx differ diff --git a/251127_2511_CAT_3_A_채점결과.xlsx b/260129_2601_CAT_3_A_TEST.xlsx similarity index 52% rename from 251127_2511_CAT_3_A_채점결과.xlsx rename to 260129_2601_CAT_3_A_TEST.xlsx index 2a23efd..f9f9ce9 100644 Binary files a/251127_2511_CAT_3_A_채점결과.xlsx and b/260129_2601_CAT_3_A_TEST.xlsx differ diff --git a/correct/2512_CAS_2_B.json b/correct/2512_CAS_2_B.json index 009df65..dc7dcdc 100644 --- a/correct/2512_CAS_2_B.json +++ b/correct/2512_CAS_2_B.json @@ -392,13 +392,13 @@ { "ele": [ "$[1][1].type", - "$[1][1].params[0].params[0].params[3]", + "$[1][1].params[0].params[1]", "$[1][1].params[0].type", "$[1][1].params[0].params[2].params[0]" ], "answer": [ "repeat_while_true", - null, + "$..objects[?(@.name=='놀이동산')].id", "reach_something", null ], @@ -435,13 +435,13 @@ { "ele": [ "$[1][2].type", - "$[1][2].params[0].params[0].params[3]", + "$[1][2].params[0].params[1]", "$[1][2].params[0].type", "$[1][2].params[0].params[2].params[0]" ], "answer": [ "repeat_while_true", - null, + "$..objects[?(@.name=='백화점')].id", "reach_something", null ], @@ -516,13 +516,13 @@ { "ele": [ "$[2][1].type", - "$[2][1].params[0].params[0].params[3]", + "$[2][1].params[0].params[1]", "$[2][1].params[0].type", "$[2][1].params[0].params[2].params[0]" ], "answer": [ "repeat_while_true", - null, + "$..objects[?(@.name=='백화점')].id", "reach_something", null ], @@ -559,13 +559,13 @@ { "ele": [ "$[2][2].type", - "$[2][2].params[0].params[0].params[3]", + "$[2][2].params[0].params[1]", "$[2][2].params[0].type", "$[2][2].params[0].params[2].params[0]" ], "answer": [ "repeat_while_true", - null, + "$..objects[?(@.name=='놀이동산')].id", "reach_something", null ], diff --git a/correct/2601_CAT_3_A.json b/correct/2601_CAT_3_A.json new file mode 100644 index 0000000..f9612d1 --- /dev/null +++ b/correct/2601_CAT_3_A.json @@ -0,0 +1,498 @@ +{ + "1-1": { + "type": "scene", + "ele": "$..objects[?(@.name=='약도')]", + "point": 2, + "desc": "문제 1/약도/[배경] 이름 설정/이름 변경 없음", + "sort": 11 + }, + "1-3": { + "type": "scene", + "ele": "$..objects[?(@.name=='놀이동산')]", + "point": 2, + "desc": "문제 1/놀이동산(4)/[개체] 이름 설정 1/이름을 '놀이동산'으로 변경하기", + "sort": 13 + }, + "1-4": { + "type": "scene", + "ele": "$..objects[?(@.name=='백화점')]", + "point": 2, + "desc": "문제 1/건물(6)/[개체] 이름 설정 2/이름을 '백화점'으로 변경하기", + "sort": 14 + }, + "1-5": { + "type": "scene", + "ele": "$..objects[?(@.name=='우리집')]", + "point": 2, + "desc": "문제 1/예쁜집/[개체] 이름 설정 3/이름을 '우리집'으로 변경하기", + "sort": 15 + }, + "1-6": { + "type": "scene", + "ele": "$..objects[?(@.name=='어린이')]", + "point": 2, + "desc": "문제 1/어린이(2)/[개체] 이름 설정 4/이름을 '어린이'로 변경하기", + "sort": 16 + }, + "2-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'놀이동산')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 2.36, + "desc": "문제 2/놀이동산/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "90" + ], + "point": 2.36, + "desc": "문제 2/놀이동산/[시작]의 세부 동작 1/크기를 '90' 으로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-25", + "60" + ], + "point": 2.36, + "desc": "문제 2/놀이동산/[시작]의 세부 동작 2/x: '-25' y: '60' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][0].type", + "$[1][0].params[1]" + ], + "answer": [ + "when_some_key_pressed", + "49" + ], + "point": 2.36, + "desc": "문제 2/놀이동산/'1' 키/1' 키를 눌렀을 때", + "type": "list" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "add_effect_amount", + "color", + "30" + ], + "point": 2.36, + "desc": "문제 2/놀이동산/['1' 키]의 세부 동작 1/'색깔' 효과를 '30' 만큼 주기", + "type": "list" + }, + { + "ele": "$[1][2].params[*].params", + "answer": [ + "여기는 놀이동산!", + "1" + ], + "point": 2.36, + "desc": "문제 2/놀이동산/['1' 키]의 세부 동작 2/'여기는 놀이동산!' 을 '1' 초 동안 '말하기'" + }, + { + "ele": "$[1][3].type", + "answer": "erase_all_effects", + "point": 2.36, + "desc": "문제 2/놀이동산/['1' 키]의 세부 동작 3/효과 모두 지우기" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_some_key_pressed" + ], + "sort": 102 + }, + "3-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'백화점|건물')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 2.36, + "desc": "문제 2/백화점/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "50" + ], + "point": 2.36, + "desc": "문제 2/백화점/[시작]의 세부 동작 1/크기를 '50' 으로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "180", + "50" + ], + "point": 2.36, + "desc": "문제 2/백화점/[시작]의 세부 동작 2/x: '180' y: '50' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][0].type", + "$[1][0].params[1]" + ], + "answer": [ + "when_some_key_pressed", + "50" + ], + "point": 2.36, + "desc": "문제 2/백화점/'2' 키/'2' 키를 눌렀을 때", + "type": "list" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "add_effect_amount", + "color", + "40" + ], + "point": 2.36, + "desc": "문제 2/백화점/['2' 키]의 세부 동작 1/'색깔' 효과를 '40' 만큼 주기", + "type": "list" + }, + { + "ele": "$[1][2].params[*].params", + "answer": [ + "여기는 백화점!", + "1" + ], + "point": 2.36, + "desc": "문제 2/백화점/['2' 키]의 세부 동작 2/'여기는 백화점!' 을 '1' 초 동안 '말하기'" + }, + { + "ele": "$[1][3].type", + "answer": "erase_all_effects", + "point": 2.36, + "desc": "문제 2/백화점/['2' 키]의 세부 동작 3/효과 모두 지우기" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_some_key_pressed" + ], + "sort": 109 + }, + "4-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'우리집|예쁜')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 2.36, + "desc": "문제 2/우리집/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "60" + ], + "point": 2.36, + "desc": "문제 2/우리집/[시작]의 세부 동작 1/크기를 '60' 으로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-190", + "-90" + ], + "point": 2.36, + "desc": "문제 2/우리집/[시작]의 세부 동작 2/x: '-190' y: '-90' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][0].type", + "$[1][0].params[1]" + ], + "answer": [ + "when_some_key_pressed", + "51" + ], + "point": 2.36, + "desc": "문제 2/우리집/'3' 키/'3' 키를 눌렀을 때", + "type": "list" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "add_effect_amount", + "color", + "35" + ], + "point": 2.36, + "desc": "문제 2/우리집/['3' 키]의 세부 동작 1/'색깔' 효과를 '35' 만큼 주기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].params[0]" + ], + "answer": [ + "wait_second", + "1" + ], + "point": 2.36, + "desc": "문제 2/우리집/['3' 키]의 세부 동작 2/'1' 초 기다리기", + "type": "list" + }, + { + "ele": "$[1][3].type", + "answer": "erase_all_effects", + "point": 2.36, + "desc": "문제 2/우리집/['3' 키]의 세부 동작 3/효과 모두 지우기" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_some_key_pressed" + ], + "sort": 116 + }, + "5-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'어린이')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 2.36, + "desc": "문제 2/어린이/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "30" + ], + "point": 2.36, + "desc": "문제 2/어린이/[시작]의 세부 동작 1/크기를 '30' 으로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-100", + "-100" + ], + "point": 2.36, + "desc": "문제 2/어린이/[시작]의 세부 동작 2/x: '-100' y: '-100' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[0][3].params[*].params", + "answer": [ + "야호! 출발!", + "1" + ], + "point": 2.36, + "desc": "문제 2/어린이/[시작]의 세부 동작 3/'야호! 출발!' 을 '1' 초 동안 '말하기'" + }, + { + "ele": [ + "$[1][0].type", + "$[1][0].params[1]" + ], + "answer": [ + "when_some_key_pressed", + "49" + ], + "point": 2.36, + "type": "list", + "desc": "문제 2/어린이/'1' 키/1' 키를 눌렀을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 2.36, + "desc": "문제 2/어린이/['1' 키]의 세부 동작 1/'2' 초 동안 '놀이동산' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][2].type", + "answer": "hide", + "point": 2.36, + "desc": "문제 2/어린이/['1' 키]의 세부 동작 2/모양 숨기기" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]" + ], + "answer": [ + "wait_second", + "1" + ], + "point": 2.36, + "desc": "문제 2/어린이/['1' 키]의 세부 동작 3/'1' 초 기다리기", + "type": "list" + }, + { + "ele": "$[1][4].type", + "answer": "show", + "point": 2.36, + "desc": "문제 2/어린이/['1' 키]의 세부 동작 4/모양 보이기" + }, + { + "ele": [ + "$[2][0].type", + "$[2][0].params[1]" + ], + "answer": [ + "when_some_key_pressed", + "50" + ], + "point": 2.36, + "type": "list", + "desc": "문제 2/어린이/'2' 키/'2' 키를 눌렀을 때" + }, + { + "ele": [ + "$[2][1].type", + "$[2][1].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 2.36, + "desc": "문제 2/어린이/['2' 키]의 세부 동작 1/'2' 초 동안 '백화점' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[2][2].type", + "answer": "hide", + "point": 2.36, + "desc": "문제 2/어린이/['2' 키]의 세부 동작 2/모양 숨기기" + }, + { + "ele": [ + "$[2][3].type", + "$[2][3].params[0].params[0]" + ], + "answer": [ + "wait_second", + "1" + ], + "point": 2.36, + "desc": "문제 2/어린이/['2' 키]의 세부 동작 3/'1' 초 기다리기", + "type": "list" + }, + { + "ele": "$[2][4].type", + "answer": "show", + "point": 2.36, + "desc": "문제 2/어린이/['2' 키]의 세부 동작 4/모양 보이기" + }, + { + "ele": [ + "$[3][0].type", + "$[3][0].params[1]" + ], + "answer": [ + "when_some_key_pressed", + "51" + ], + "point": 2.36, + "type": "list", + "desc": "문제 2/어린이/'3' 키/'3' 키를 눌렀을 때" + }, + { + "ele": [ + "$[3][1].type", + "$[3][1].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 2.36, + "desc": "문제 2/어린이/['3' 키]의 세부 동작 1/'2' 초 동안 '우리집' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[3][2].params[*].params", + "answer": [ + "다녀왔습니다!", + "1" + ], + "point": 2.36, + "desc": "문제 2/어린이/['3' 키]의 세부 동작 2/'다녀왔습니다!' 를 '1' 초 동안 '말하기'" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_some_key_pressed", + "when_some_key_pressed", + "when_some_key_pressed" + ], + "sort": 123 + } +} \ No newline at end of file diff --git a/logs/cat.log b/logs/cat.log index 162d595..71e7df3 100644 --- a/logs/cat.log +++ b/logs/cat.log @@ -3105,3 +3105,309 @@ Traceback (most recent call last): File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 78, in p_error raise JsonPathParserError('Parse error at %s:%s near token %s (%s)' jsonpath_ng.exceptions.JsonPathParserError: Parse error at 1:4 near token ? (?) +[2026-01-29 15:57:35] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project + block_elements = find_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element + parsed_expr = parse(jsonpath_expr) + ^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1063, in parseopt_notrack + lookahead = get_token() # Get the next token + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token + return next(self.iterator) + ^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize + new_lexer.input(string) + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input + raise ValueError('Expected a string') +ValueError: Expected a string +[2026-01-29 15:59:56] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project + block_elements = find_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element + parsed_expr = parse(jsonpath_expr) + ^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1063, in parseopt_notrack + lookahead = get_token() # Get the next token + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token + return next(self.iterator) + ^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize + new_lexer.input(string) + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input + raise ValueError('Expected a string') +ValueError: Expected a string +[2026-01-29 16:00:40] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project + block_elements = find_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element + parsed_expr = parse(jsonpath_expr) + ^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1063, in parseopt_notrack + lookahead = get_token() # Get the next token + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token + return next(self.iterator) + ^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize + new_lexer.input(string) + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input + raise ValueError('Expected a string') +ValueError: Expected a string +[2026-01-29 16:05:50] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project + block_elements = find_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element + parsed_expr = parse(jsonpath_expr) + ^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1063, in parseopt_notrack + lookahead = get_token() # Get the next token + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token + return next(self.iterator) + ^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize + new_lexer.input(string) + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input + raise ValueError('Expected a string') +ValueError: Expected a string +[2026-01-29 16:08:11] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project + block_elements = find_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element + parsed_expr = parse(jsonpath_expr) + ^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1063, in parseopt_notrack + lookahead = get_token() # Get the next token + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token + return next(self.iterator) + ^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize + new_lexer.input(string) + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input + raise ValueError('Expected a string') +ValueError: Expected a string +[2026-01-29 16:08:51] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project + block_elements = find_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element + parsed_expr = parse(jsonpath_expr) + ^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1063, in parseopt_notrack + lookahead = get_token() # Get the next token + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token + return next(self.iterator) + ^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize + new_lexer.input(string) + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input + raise ValueError('Expected a string') +ValueError: Expected a string +[2026-01-29 16:10:18] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project + block_elements = find_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element + parsed_expr = parse(jsonpath_expr) + ^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1063, in parseopt_notrack + lookahead = get_token() # Get the next token + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token + return next(self.iterator) + ^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize + new_lexer.input(string) + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input + raise ValueError('Expected a string') +ValueError: Expected a string +[2026-01-29 16:14:04] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project + block_elements = find_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element + parsed_expr = parse(jsonpath_expr) + ^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1063, in parseopt_notrack + lookahead = get_token() # Get the next token + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token + return next(self.iterator) + ^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize + new_lexer.input(string) + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input + raise ValueError('Expected a string') +ValueError: Expected a string +[2026-01-29 16:31:54] [ERROR] [main:414] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 409, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 287, in process_project + block_elements = find_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element + parsed_expr = parse(jsonpath_expr) + ^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1063, in parseopt_notrack + lookahead = get_token() # Get the next token + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token + return next(self.iterator) + ^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize + new_lexer.input(string) + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input + raise ValueError('Expected a string') +ValueError: Expected a string diff --git a/main.py b/main.py index db668a0..73baf43 100644 --- a/main.py +++ b/main.py @@ -192,13 +192,20 @@ def process_project(project_data, scoring_data): # - 복제본이 생성 되었을 때 : when_clone_start # - 장면이 시작 되었을 때 : when_scene_start # - 오브젝트를 클릭 했을 때 : when_object_click + # - 특정 키가 눌렸을 때 : when_some_key_pressed # 이벤트 블록이 존재하는지 여부 확인용 변수 + + # 2026-01-29 16:40:29 + # target_event_type 회차마다 추가 될 수 있으므로 + # 채점 기준표의 answer 키값과 비교하여 동적으로 처리하도록 수정 + # 2601회는 "when_some_key_pressed"가 필요해서 추가함 target_event_type = { "when_run_button_click", "when_message_cast", "when_clone_start", "when_scene_start", - "when_object_click" + "when_object_click", + "when_some_key_pressed" } for question_key, question_info in scoring_data.items(): @@ -215,9 +222,19 @@ def process_project(project_data, scoring_data): # block_event_order 리스트에 추가 if isinstance(block_list, list) and block_list: for block in block_list: - answer = block.get("answer") # answer 키값을 안전하게 가져오기 - if isinstance(answer, str) and answer in target_event_type: - block_event_order.append(answer) # 리스트에 추가 + answer = block.get("answer") + if isinstance(answer, str): + if answer in target_event_type: + block_event_order.append(answer) + + # 2026-01-29 16:39:48 + # answer가 리스트인 경우 리스트 요소들 모두를 확인 + # JSON채점 기준표에서 answer가 리스트인 경우가 생겨서 추가함 + elif isinstance(answer, list): + # answer 리스트 내에 target_event_type에 포함된 요소가 있으면 추가 + for ans_item in answer: + if ans_item in target_event_type: + block_event_order.append(ans_item) print(f"▶ Processing question: {question_key}") @@ -336,11 +353,11 @@ def normalize_path(path): def main(): timestamp = datetime.now().strftime("%y%m%d") - test_mode = False # 일반 채점 모드 - # test_mode = True # 테스트 모드 + # test_mode = False # 일반 채점 모드 + test_mode = True # 테스트 모드 - exam_round = "2512" - exam_names = ["CAS_2_A"] # 여러 시험명을 리스트로 설정 + exam_round = "2601" + exam_names = ["CAT_3_A"] # 여러 시험명을 리스트로 설정 # exam_names = ["CAS_2_A", "CAS_2_B"] # 여러 시험명을 리스트로 설정 excel_list = [] diff --git a/251226_2512_CAS_2_A_TEST.xlsx b/시험자료/2512/251226_2512_CAS_2_A_TEST.xlsx similarity index 100% rename from 251226_2512_CAS_2_A_TEST.xlsx rename to 시험자료/2512/251226_2512_CAS_2_A_TEST.xlsx diff --git a/251226_2512_CAS_2_A_채점결과.xlsx b/시험자료/2512/251226_2512_CAS_2_A_채점결과.xlsx similarity index 100% rename from 251226_2512_CAS_2_A_채점결과.xlsx rename to 시험자료/2512/251226_2512_CAS_2_A_채점결과.xlsx diff --git a/251226_2512_CAS_2_B_TEST.xlsx b/시험자료/2512/251226_2512_CAS_2_B_TEST.xlsx similarity index 100% rename from 251226_2512_CAS_2_B_TEST.xlsx rename to 시험자료/2512/251226_2512_CAS_2_B_TEST.xlsx diff --git a/251226_2512_CAS_2_B_채점결과.xlsx b/시험자료/2512/251226_2512_CAS_2_B_채점결과.xlsx similarity index 100% rename from 251226_2512_CAS_2_B_채점결과.xlsx rename to 시험자료/2512/251226_2512_CAS_2_B_채점결과.xlsx diff --git a/251229_2512_CAS_2_A_TEST.xlsx b/시험자료/2512/251229_2512_CAS_2_A_TEST.xlsx similarity index 100% rename from 251229_2512_CAS_2_A_TEST.xlsx rename to 시험자료/2512/251229_2512_CAS_2_A_TEST.xlsx diff --git a/251229_2512_CAS_2_A_채점결과.xlsx b/시험자료/2512/251229_2512_CAS_2_A_채점결과.xlsx similarity index 100% rename from 251229_2512_CAS_2_A_채점결과.xlsx rename to 시험자료/2512/251229_2512_CAS_2_A_채점결과.xlsx diff --git a/251229_2512_CAS_2_B_채점결과.xlsx b/시험자료/2512/251229_2512_CAS_2_B_채점결과.xlsx similarity index 100% rename from 251229_2512_CAS_2_B_채점결과.xlsx rename to 시험자료/2512/251229_2512_CAS_2_B_채점결과.xlsx diff --git a/시험자료/2601/제2601회 코딩활용능력 3급 A형 문제.hwp b/시험자료/2601/제2601회 코딩활용능력 3급 A형 문제.hwp new file mode 100644 index 0000000..563b986 Binary files /dev/null and b/시험자료/2601/제2601회 코딩활용능력 3급 A형 문제.hwp differ diff --git a/시험자료/2601/제2601회 코딩활용능력 3급 A형 정답.ent b/시험자료/2601/제2601회 코딩활용능력 3급 A형 정답.ent new file mode 100644 index 0000000..732860e Binary files /dev/null and b/시험자료/2601/제2601회 코딩활용능력 3급 A형 정답.ent differ diff --git a/시험자료/2601/제2601회 코딩활용능력 3급 A형 채점기준표.xlsx b/시험자료/2601/제2601회 코딩활용능력 3급 A형 채점기준표.xlsx new file mode 100644 index 0000000..ed45c91 Binary files /dev/null and b/시험자료/2601/제2601회 코딩활용능력 3급 A형 채점기준표.xlsx differ