@@ -258,119 +258,6 @@ ${truncatedContent}
258258 } ;
259259}
260260
261- /**
262- * 여러 솔루션 파일의 접근법 일치 여부를 한 번의 API 호출로 일괄 분석.
263- * subrequest 수를 줄이기 위해 파일당 개별 호출 대신 배치로 처리한다.
264- *
265- * @param {Array<{problemName: string, fileContent: string, problemInfo: object}> } items
266- * @param {string } apiKey - OpenAI API 키
267- * @returns {Promise<{results: Array<{matches: boolean, explanation: string}>, usage: object|null}> }
268- */
269- export async function generateBatchApproachAnalysis ( items , apiKey ) {
270- if ( items . length === 0 ) return { results : [ ] , usage : null } ;
271-
272- // 단건이면 기존 함수 위임
273- if ( items . length === 1 ) {
274- const { fileContent, problemName, problemInfo } = items [ 0 ] ;
275- const result = await generateApproachAnalysis ( fileContent , problemName , problemInfo , apiKey ) ;
276- return {
277- results : [ { matches : result . matches , explanation : result . explanation } ] ,
278- usage : result . usage ?? null ,
279- } ;
280- }
281-
282- const systemPrompt = `You are an algorithm analysis expert. You will receive multiple problems. For each one, determine if the submitted code matches the intended approach.
283-
284- Respond with a JSON object containing a "results" array with exactly ${ items . length } entries, in the same order as the input:
285- {
286- "results": [
287- { "matches": true, "explanation": "한국어 1문장, 80자 이내" },
288- ...
289- ]
290- }
291-
292- Rules:
293- - matches=true if the core data structure or algorithm matches the intended approach
294- - matches=false if brute force was used when an optimized approach was intended
295- - Keep each explanation to 1 sentence in Korean, 80 characters or fewer
296- - You MUST return exactly ${ items . length } results` ;
297-
298- const MAX_BATCH_FILE_SIZE = 5000 ;
299-
300- const problemSections = items . map ( ( { problemName, fileContent, problemInfo } , i ) => {
301- const truncated = fileContent . slice ( 0 , MAX_BATCH_FILE_SIZE ) ;
302- return `## 문제 ${ i + 1 } : ${ problemName }
303- - 난이도: ${ problemInfo . difficulty }
304- - 카테고리: ${ ( problemInfo . categories || [ ] ) . join ( ", " ) }
305- - 의도된 접근법: ${ problemInfo . intended_approach }
306-
307- \`\`\`
308- ${ truncated }
309- \`\`\`` ;
310- } ) ;
311-
312- const userPrompt = problemSections . join ( "\n\n" ) +
313- `\n\n위 ${ items . length } 개 코드가 각각 의도된 접근법과 일치하는지 분석해주세요.` ;
314-
315- const response = await fetch ( "https://api.openai.com/v1/chat/completions" , {
316- method : "POST" ,
317- headers : {
318- Authorization : `Bearer ${ apiKey } ` ,
319- "Content-Type" : "application/json" ,
320- } ,
321- body : JSON . stringify ( {
322- model : "gpt-4.1-nano" ,
323- messages : [
324- { role : "system" , content : systemPrompt } ,
325- { role : "user" , content : userPrompt } ,
326- ] ,
327- response_format : { type : "json_object" } ,
328- max_tokens : 200 * items . length ,
329- temperature : 0.2 ,
330- } ) ,
331- } ) ;
332-
333- if ( ! response . ok ) {
334- const error = await response . text ( ) ;
335- throw new Error ( `OpenAI batch API error: ${ error } ` ) ;
336- }
337-
338- const data = await response . json ( ) ;
339- const content = data . choices [ 0 ] ?. message ?. content ;
340-
341- if ( ! content ) {
342- throw new Error ( "Empty response from OpenAI batch analysis" ) ;
343- }
344-
345- let parsed ;
346- try {
347- parsed = JSON . parse ( content ) ;
348- } catch {
349- throw new Error ( `OpenAI returned invalid JSON: ${ content . slice ( 0 , 200 ) } ` ) ;
350- }
351-
352- const rawResults = parsed . results ;
353- if ( ! Array . isArray ( rawResults ) ) {
354- throw new Error ( `OpenAI did not return a results array` ) ;
355- }
356-
357- if ( rawResults . length !== items . length ) {
358- console . warn (
359- `[generateBatchApproachAnalysis] Expected ${ items . length } results, got ${ rawResults . length } `
360- ) ;
361- }
362-
363- const results = items . map ( ( _ , i ) => {
364- const r = rawResults [ i ] ;
365- return {
366- matches : r ?. matches === true ,
367- explanation : typeof r ?. explanation === "string" ? r . explanation : "" ,
368- } ;
369- } ) ;
370-
371- return { results, usage : data . usage ?? null } ;
372- }
373-
374261/**
375262 * 솔루션의 시간/공간 복잡도 분석.
376263 * 사용자가 코드 어딘가에 자유 포맷으로 남긴 TC/SC 주석을 함께 추출하여
0 commit comments