Ollama/qwen3-coder-next/80b/GGUF
애플 맥 스튜디오 M3 Ultra 512GB 모델과 Ollama를 통해 LocalLLM 을 구성해 사용하다보니 이런저런 모델을 사용해보곤 합니다. 따로 특별히 기록을 하지 않고 그냥 그때그때 막 바꿔 쓰다보니 전에 사용하던 모델이랑 어떤 차이가 나는지 알기가 힘들어서 기록 차원에서 정보를 좀 공유해보겠습니다.
qwen3-coder-next 모델에 대한 정보는 아래 링크에서 확인하시구요.
https://ollama.com/library/qwen3-coder-next
에이전틱 코딩 워크플로과 로컬 개발에 최적화된 모델이라 해서 사용해보고 있습니다.
Ollama의 Models 사이트에서는 q4_K_M, q8_0 2가지 양자화 모델을 제공중이구요, 저는 그 둘을 다 받아 사용중이긴 합니다만 최근에는 q8_0 모델을 더 많이 사용한것 같긴 합니다.
pirogom@pirogom-Mac-Studio Desktop % ollama show qwen3-coder-next:q4_K_M
Model
architecture qwen3next
parameters 79.7B
context length 262144
embedding length 2048
quantization Q4_K_M
requires 0.15.5
Capabilities
completion
tools
Parameters
temperature 1
top_k 40
top_p 0.95
License
Apache License
Version 2.0, January 2004
…pirogom@pirogom-Mac-Studio Desktop % ollama show qwen3-coder-next:q8_0
Model
architecture qwen3next
parameters 79.7B
context length 262144
embedding length 2048
quantization Q8_0
requires 0.15.5
Capabilities
completion
tools
Parameters
top_k 40
top_p 0.95
temperature 1
License
Apache License
Version 2.0, January 2004
…이렇게 2가지 양자화 버전을 제공합니다. 맥을 쓰는데 왜 MLX 모델을 쓰지 않느냐 물으신다면 우선 아직 mlx 관련 솔루션들 안정성이 좀 아쉽고 LM Studio는 업데이트가 더딘 느낌이고 성향에 안 맞아서 ollama를 사용중입니다. 언젠가 ollama에도 mlx 백엔드를 쓸 수 있는 날이 오겠지요 ..

우선 ollama 를 구동하기 전의 메모리 사용량입니다.
우선 q4_K_M 양자화 모델을 먼저 돌려보겠습니다.
구동 후 첫 요청시에 모델을 로드하는데 시간이 꽤 걸림으로.. 처음엔 간단히 hi 정도로 ㅎㅎ
pirogom@pirogom-Mac-Studio Desktop % ollama run qwen3-coder-next:q4_K_M "hi" –verbose
Hello! How can I help you today? 😊
total duration: 7.504174875s
load duration: 6.554922583s
prompt eval count: 9 token(s)
prompt eval duration: 622.734042ms
prompt eval rate: 14.45 tokens/s
eval count: 12 token(s)
eval duration: 316.805375ms
eval rate: 37.88 tokens/s
pirogom@pirogom-Mac-Studio Desktop % ollama run qwen3-coder-next:q4_K_M "hi" –verbose
Hello! 😊 How can I help you today?
total duration: 999.43025ms
load duration: 64.577209ms
prompt eval count: 9 token(s)
prompt eval duration: 614.886875ms
prompt eval rate: 14.64 tokens/s
eval count: 12 token(s)
eval duration: 317.202626ms
eval rate: 37.83 tokens/s첫번째 요청은 load diration이 6.5초 정도, 이후에는 64ms 정도입니다. prompt eval 값들은 입력한 프롬프트에 대한 통계이고 출력 토큰에 대한부분은 eval 값을 보시면 됩니다. 37.83 정도네요..

pirogom@pirogom-Mac-Studio Desktop % ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3-coder-next:q4_K_M ca06e9e4087c 61 GB 100% GPU 262144 Forever메모리 사용량은 이정도 됩니다. 기본 컨텍스트 크기를 256k로 잡아논 상태입니다.
간단한 숫자야구 게임을 만들어 보겠습니다.
pirogom@pirogom-Mac-Studio Desktop % ollama run qwen3-coder-next:q4_K_M "간단한 숫자야구 게임을 go언어로 작성해줘" –verbose
물론입니다! Go 언어로 간단한 숫자 야구 게임을 구현해드릴게요.
### 📌 게임 규칙 (3자리 숫자 야구)
- 컴퓨터는 중복되지 않는 3자리 난수(1~9)를 생성합니다. (예: 123, 456, 789 등)
- 사용자는 3자리 숫자를 입력합니다.
- 스트라이크(S): 숫자와 위치가 모두 같음
- 볼(B): 숫자는 같지만 위치가 다름
- 아웃(O): 숫자도 틀림
- 입력이 정확할 때까지 반복 (3스트라이크면 종료)
—
### ✅ Go 소스 코드 (main.go)
</span><span style="color: #88C0D0">go</span></span>
<span class="line"><span style="color: #88C0D0">package</span><span style="color: #A3BE8C"> main</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">import</span><span style="color: #A3BE8C"> (</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"bufio"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"fmt"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"math/rand"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"os"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"strconv"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"strings"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"time"</span></span>
<span class="line"><span style="color: #A3BE8C">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> generateSecretNumber</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> []int </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">numbers</span><span style="color: #A3BE8C"> := []int{</span><span style="color: #88C0D0">1,</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">2</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">4</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">5</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">6</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">7</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">8</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">9</span><span style="color: #A3BE8C">}</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">rand.Shuffle(len(numbers</span><span style="color: #A3BE8C">), func</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">i,</span><span style="color: #A3BE8C"> j int</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">numbers[i],</span><span style="color: #A3BE8C"> numbers[j] = numbers[j], numbers[i]</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> numbers[:3]</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> parseInput</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">input</span><span style="color: #A3BE8C"> string</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> ([]int, error) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">len(input</span><span style="color: #A3BE8C">) </span><span style="color: #81A1C1">!</span><span style="color: #A3BE8C">= </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> nil, fmt.Errorf</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">"3자리 숫자만 입력 가능합니다."</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">digits</span><span style="color: #A3BE8C"> := []int{}</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">_,</span><span style="color: #A3BE8C"> ch := range input {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">digit,</span><span style="color: #A3BE8C"> err := strconv.Atoi</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">string(ch</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">err</span><span style="color: #A3BE8C"> != nil {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> nil, fmt.Errorf</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">"숫자만 입력 가능합니다."</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">digit</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1"><</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">||</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">digit</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">></span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">9</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> nil, fmt.Errorf</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">"1~9 범위의 숫자만 사용 가능합니다."</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">digits</span><span style="color: #A3BE8C"> = append</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">digits,</span><span style="color: #A3BE8C"> digit</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> 중복 확인</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">len(digits</span><span style="color: #A3BE8C">) </span><span style="color: #81A1C1">!</span><span style="color: #A3BE8C">= len</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">unique(digits</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> nil, fmt.Errorf</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">"중복되지 않는 숫자를 입력하세요."</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> digits, nil</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> unique</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">intSlice</span><span style="color: #A3BE8C"> []int</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> []int </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">keys</span><span style="color: #A3BE8C"> := make</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">map[int]bool</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">list</span><span style="color: #A3BE8C"> := []int{</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> _, entry := range intSlice </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">_,</span><span style="color: #A3BE8C"> ok := keys[entry]</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">ok</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">keys[entry]</span><span style="color: #A3BE8C"> = </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">list</span><span style="color: #A3BE8C"> = append</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">list,</span><span style="color: #A3BE8C"> entry</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> list</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> calculateResult</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">guess,</span><span style="color: #A3BE8C"> secret []int</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> (strike, ball int) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> i := 0</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">i</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1"><</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">3</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">i++</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">guess[i]</span><span style="color: #A3BE8C"> == secret[i] {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strike++</span></span>
<span class="line"><span style="color: #A3BE8C"> } </span><span style="color: #81A1C1">else</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">contains(secret,</span><span style="color: #A3BE8C"> guess[i]) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">ball++</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> contains</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">slice</span><span style="color: #A3BE8C"> []int, val int</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> bool {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> _, v := range slice </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">v</span><span style="color: #A3BE8C"> == val {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">false</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> main</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">rand.Seed(time.Now(</span><span style="color: #A3BE8C">).UnixNano())</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">secret</span><span style="color: #A3BE8C"> := generateSecretNumber</span><span style="color: #ECEFF4">()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("🔢 숫자 야구 게임을 시작합니다! (1~9, 중복 없는 3자리 숫자)"</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("정답은 중복되지 않는 1~9 범위의 3자리 숫자입니다."</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("입력 예: 123, 789, 456 등"</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("quit 입력 시 게임 종료"</span><span style="color: #A3BE8C">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">scanner</span><span style="color: #A3BE8C"> := bufio.NewScanner</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">os.Stdin</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">attempts</span><span style="color: #A3BE8C"> := </span><span style="color: #B48EAD">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Print("\n>> "</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">!scanner.Scan</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">break</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">input</span><span style="color: #A3BE8C"> := strings.TrimSpace</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">scanner.Text</span><span style="color: #ECEFF4">())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">input</span><span style="color: #A3BE8C"> == </span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C">quit</span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">||</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">input</span><span style="color: #A3BE8C"> == </span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C">q</span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("게임을 종료합니다. 정답:",</span><span style="color: #A3BE8C"> secret)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">guess,</span><span style="color: #A3BE8C"> err := parseInput</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">input</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">err</span><span style="color: #A3BE8C"> != nil {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("⚠️",</span><span style="color: #A3BE8C"> err)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">continue</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strike,</span><span style="color: #A3BE8C"> ball := calculateResult</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">guess,</span><span style="color: #A3BE8C"> secret</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">out</span><span style="color: #A3BE8C"> := </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C"> - (strike + ball)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">attempts++</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Printf("📊 결과: %dS %dB %dO\n",</span><span style="color: #A3BE8C"> strike, ball, out)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strike</span><span style="color: #A3BE8C"> == </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Printf("🎉 정답입니다! %d회 만에 성공!\n",</span><span style="color: #A3BE8C"> attempts)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"><span style="color: #ECEFF4">
—
### 🚀 실행 방법
1. </span><span style="color: #88C0D0">main.go</span><span style="color: #ECEFF4"> 파일로 저장
2. 터미널에서:
</span><span style="color: #88C0D0">bash</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">go</span><span style="color: #A3BE8C"> run main.go</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">
—
### 💡 예시 실행 화면
</span></span>
<span class="line"><span style="color: #88C0D0">🔢</span><span style="color: #A3BE8C"> 숫자 야구 게임을 시작합니다! (1~9, 중복 없는 </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">자리 숫자)</span></span>
<span class="line"><span style="color: #88C0D0">정답은</span><span style="color: #A3BE8C"> 중복되지 않는 </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">~9 범위의 </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">자리 숫자입니다.</span></span>
<span class="line"><span style="color: #88C0D0">입력</span><span style="color: #A3BE8C"> 예: </span><span style="color: #B48EAD">123</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">789</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">456</span><span style="color: #A3BE8C"> 등</span></span>
<span class="line"><span style="color: #88C0D0">quit</span><span style="color: #A3BE8C"> 입력 시 게임 종료</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">>></span><span style="color: #A3BE8C"> 123</span></span>
<span class="line"><span style="color: #88C0D0">📊</span><span style="color: #A3BE8C"> 결과: </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">S </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">B </span><span style="color: #B48EAD">2</span><span style="color: #A3BE8C">O</span></span>
<span class="line"><span style="color: #81A1C1">>></span><span style="color: #A3BE8C"> 145</span></span>
<span class="line"><span style="color: #88C0D0">📊</span><span style="color: #A3BE8C"> 결과: </span><span style="color: #B48EAD">2</span><span style="color: #A3BE8C">S </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">B </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">O</span></span>
<span class="line"><span style="color: #81A1C1">>></span><span style="color: #A3BE8C"> 142</span></span>
<span class="line"><span style="color: #88C0D0">⚠️</span><span style="color: #A3BE8C"> 중복되지 않는 숫자를 입력하세요.</span></span>
<span class="line"><span style="color: #81A1C1">>></span><span style="color: #A3BE8C"> 165</span></span>
<span class="line"><span style="color: #88C0D0">📊</span><span style="color: #A3BE8C"> 결과: </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">S </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">B </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">O</span></span>
<span class="line"><span style="color: #88C0D0">🎉</span><span style="color: #A3BE8C"> 정답입니다! </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">회 만에 성공!</span></span>
<span class="line"><span style="color: #ECEFF4">
—
필요시 규칙 변경(4자리, 0~9 포함 등)도 도와드릴 수 있어요 😊
궁금한 부분 있으면 알려주세요!
total duration: 35.760818959s
load duration: 68.150167ms
prompt eval count: 25 token(s)
prompt eval duration: 642.200666ms
prompt eval rate: 38.93 tokens/s
eval count: 1212 token(s)
eval duration: 34.830003762s
eval rate: 34.80 tokens/s34.80 tps 정도네요..
이번에는 q8_0 양자화 모델을 사용해 보겠습니다.
pirogom@pirogom-Mac-Studio Desktop % ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3-coder-next:q8_0 3f68e12b44ee 94 GB 100% GPU 262144 Forever
대량 30기가 정도 램을 더 차지하는군요 ㄷㄷㄷ;; 제가 512g 모델을 쓰고 있어서 그렇지;;; 양자화 정도차이에 따라 ;; 5090 급 vram 이 왔다갔다 거립니다 ㅎㅎ(용량만 놓고 말하는 겁니다 5090 같은 놈은 용량을 떠나서 대역폭이 어마무시 합니다. 제 맥 스튜디오는 덩치로 승부하는 놈이구요..)
pirogom@pirogom-Mac-Studio Desktop % ollama run qwen3-coder-next:q8_0 "간단한 숫자야구 게임을 go언어로 작성해줘" –verbose
Go 언어로 간단한 숫자야구 게임(3자리 기준, 중복 없음, 0~9 숫자 사용)을 구현한 예제입니다.
—
### ✅ 게임 규칙 요약:
- 컴퓨터는 중복되지 않는 3자리 숫자를 랜덤으로 생성합니다.
- 플레이어는 3자리 숫자를 입력하여 추측합니다.
- 입력 후, Strike(자리와 숫자가 일치), Ball(숫자는 일치하지만 자리 다름), Out(아무것도 일치하지 않음)을
알려줍니다.
- 3 Strike가 나면 게임이 종료되고, 재시작 여부를 묻습니다.
—
### 📜 main.go
</span><span style="color: #88C0D0">go</span></span>
<span class="line"><span style="color: #88C0D0">package</span><span style="color: #A3BE8C"> main</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">import</span><span style="color: #A3BE8C"> (</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"bufio"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"fmt"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"math/rand"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"os"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"strconv"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"strings"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"time"</span></span>
<span class="line"><span style="color: #A3BE8C">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">const</span><span style="color: #A3BE8C"> digitCount = </span><span style="color: #B48EAD">3</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> main</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">rand.Seed(time.Now(</span><span style="color: #A3BE8C">).UnixNano())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">playGame</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #A3BE8C"> if !askPlayAgain</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">break</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("게임을 이용해주셔서 감사합니다! 👋"</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> playGame</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> 랜덤 </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">자리 숫자 생성 (중복 X)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">secret</span><span style="color: #A3BE8C"> := generateSecretNumber</span><span style="color: #ECEFF4">()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("=== 숫자야구 게임 ==="</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Printf("0~9의 숫자로 구성된 중복 없는 %d자리 숫자를 맞춰보세요!\n",</span><span style="color: #A3BE8C"> digitCount)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("예: 123, 456, 901 (각 자리 수는 중복 불가)"</span><span style="color: #A3BE8C">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">scanner</span><span style="color: #A3BE8C"> := bufio.NewScanner</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">os.Stdin</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">attempts</span><span style="color: #A3BE8C"> := </span><span style="color: #B48EAD">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Print("\n예상하는 숫자를 입력하세요: "</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">!scanner.Scan</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">break</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">input</span><span style="color: #A3BE8C"> := strings.TrimSpace</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">scanner.Text</span><span style="color: #ECEFF4">())</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">attempts++</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> 유효성 검사</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">isValidInput(input</span><span style="color: #A3BE8C">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("❌ 유효한 입력이 아닙니다. (",</span><span style="color: #A3BE8C"> digitCount, </span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C">자리의 숫자, 중복 없어야 함)</span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">continue</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> 결과 계산</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strike,</span><span style="color: #A3BE8C"> ball := calculateScore</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">input,</span><span style="color: #A3BE8C"> secret</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strike</span><span style="color: #A3BE8C"> == digitCount {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Printf("🎉 정답입니다! 숫자는 %s였습니다.\n",</span><span style="color: #A3BE8C"> secret)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Printf("총 %d번 시도하셨습니다.\n",</span><span style="color: #A3BE8C"> attempts)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">break</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">out</span><span style="color: #A3BE8C"> := digitCount - strike - ball</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Printf("✅ 결과: %d Strike, %d Ball, %d Out\n",</span><span style="color: #A3BE8C"> strike, ball, out)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> generateSecretNumber</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> string {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">nums</span><span style="color: #A3BE8C"> := []int{</span><span style="color: #88C0D0">0,</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">2</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">4</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">5</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">6</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">7</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">8</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">9</span><span style="color: #A3BE8C">}</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">rand.Shuffle(len(nums</span><span style="color: #A3BE8C">), func</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">i,</span><span style="color: #A3BE8C"> j int</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">nums[i],</span><span style="color: #A3BE8C"> nums[j] = nums[j], nums[i]</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span><span style="color: #A3BE8C">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">result</span><span style="color: #A3BE8C"> := </span><span style="color: #ECEFF4">""</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> i := 0</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">i</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1"><</span><span style="color: #A3BE8C"> digitCount</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">i++</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">result</span><span style="color: #A3BE8C"> += strconv.Itoa</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">nums[i]</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> result</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> isValidInput</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">input</span><span style="color: #A3BE8C"> string</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> bool {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">len(input</span><span style="color: #A3BE8C">) </span><span style="color: #81A1C1">!</span><span style="color: #A3BE8C">= digitCount {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">false</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">seen</span><span style="color: #A3BE8C"> := make</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">map[rune]bool</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> _, r := range input </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">r</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1"><</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">0</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">||</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">r</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">></span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">9</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">false</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">seen[r]</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">false</span><span style="color: #A3BE8C"> // 중복 감지</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">seen[r]</span><span style="color: #A3BE8C"> = </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> calculateScore</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">guess,</span><span style="color: #A3BE8C"> secret string</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> (strike, ball int) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> i := 0</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">i</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1"><</span><span style="color: #A3BE8C"> digitCount</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">i++</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">guess[i]</span><span style="color: #A3BE8C"> == secret[i] {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strike++</span></span>
<span class="line"><span style="color: #A3BE8C"> } </span><span style="color: #81A1C1">else</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> 자리가 다를 때, 숫자가 포함되어 있으면 Ball</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strings.Contains(secret,</span><span style="color: #A3BE8C"> string</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">guess[i]</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">ball++</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> askPlayAgain</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> bool {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Print("\n다시 하시겠습니까? (y/n): "</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">scanner</span><span style="color: #A3BE8C"> := bufio.NewScanner</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">os.Stdin</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">scanner.Scan</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #A3BE8C"> resp := strings.TrimSpace</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">strings.ToLower(scanner.Text(</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">))</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> resp == </span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C">y</span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">||</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">resp</span><span style="color: #A3BE8C"> == </span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C">yes</span><span style="color: #ECEFF4">"</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"><span style="color: #ECEFF4">
—
### ▶ 실행 방법
</span><span style="color: #88C0D0">bash</span></span>
<span class="line"><span style="color: #88C0D0">go</span><span style="color: #A3BE8C"> run main.go</span></span>
<span class="line"><span style="color: #ECEFF4">
—
### ✅ 예시 실행 화면
</span></span>
<span class="line"><span style="color: #A3BE8C">=== 숫자야구 게임 ===</span></span>
<span class="line"><span style="color: #88C0D0">0~9의</span><span style="color: #A3BE8C"> 숫자로 구성된 중복 없는 </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">자리 숫자를 맞춰보세요!</span></span>
<span class="line"><span style="color: #88C0D0">예:</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">123</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">456</span><span style="color: #A3BE8C">, </span><span style="color: #B48EAD">901</span><span style="color: #A3BE8C"> (각 자리 수는 중복 불가)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">예상하는</span><span style="color: #A3BE8C"> 숫자를 입력하세요: </span><span style="color: #B48EAD">123</span></span>
<span class="line"><span style="color: #88C0D0">✅</span><span style="color: #A3BE8C"> 결과: </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C"> Strike, </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C"> Ball, </span><span style="color: #B48EAD">2</span><span style="color: #A3BE8C"> Out</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">예상하는</span><span style="color: #A3BE8C"> 숫자를 입력하세요: </span><span style="color: #B48EAD">456</span></span>
<span class="line"><span style="color: #88C0D0">✅</span><span style="color: #A3BE8C"> 결과: </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C"> Strike, </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C"> Ball, </span><span style="color: #B48EAD">2</span><span style="color: #A3BE8C"> Out</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">예상하는</span><span style="color: #A3BE8C"> 숫자를 입력하세요: </span><span style="color: #B48EAD">476</span></span>
<span class="line"><span style="color: #88C0D0">🎉</span><span style="color: #A3BE8C"> 정답입니다! 숫자는 </span><span style="color: #B48EAD">476</span><span style="color: #A3BE8C">였습니다.</span></span>
<span class="line"><span style="color: #88C0D0">총</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">번 시도하셨습니다.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">다시</span><span style="color: #A3BE8C"> 하시겠습니까? (y/n): n</span></span>
<span class="line"><span style="color: #88C0D0">게임을</span><span style="color: #A3BE8C"> 이용해주셔서 감사합니다! 👋</span></span>
<span class="line"><span style="color: #ECEFF4">
—
필요에 따라 난이도 조절(자리수 증가), 힌트 제공, 시도 횟수 제한 등을 추가할 수 있어요! 😊
원하시면 확장 기능도 알려드릴게요.
total duration: 38.475538209s
load duration: 66.668375ms
prompt eval count: 25 token(s)
prompt eval duration: 835.311584ms
prompt eval rate: 29.93 tokens/s
eval count: 1217 token(s)
eval duration: 37.353103146s
eval rate: 32.58 tokens/s코드를 보면 q4_K_M 양자화의 경우 한번 게임이 끝나면 종료되는 반면 Q8_0이 작성한 코드는 한판 끝난 후에 다시 하겠는지를 묻는 처리가 추가되었네요.. 미묘한 차이이긴 하지만 q4_K_M 대비 Q8이 조금 섬세?? 한 결과를 만드는 편이고 메모리 사용량 대비 TPS 감소는 상대적으로 크지 않아서 제 경우 Q8_0 양자화 모델을 주로 사용했던 모델입니다.
하지만 .. 비슷한 규모의 모델들 대비 상대적으로 속도가 좀 아쉽긴 합니다.
물론 모델명에 coder 가 들어간 놈이고 에이전틱 코딩에 맞춰서 최적화 해둔놈이고 최신 모델이라 끌린점도 있긴 하지만 전반적으로 다른 모델 대비 속도가 좀 아쉬운데.. 지금까지는 제가 클로드 코드 같은 에이전틱 툴보다 채팅 기반의 보조수단으로 좀더 활용을 많이하다보니 .. gpt-oss:120b 같은 모델보다 훨씬 느린건 좀 고민이 되네요 ..
pirogom@pirogom-Mac-Studio Desktop % ollama run gpt-oss:120b "간단한 숫자야구 게임을 go언어로 작성해줘" –verbose Thinking…
The user wants a simple number baseball game (숫자야구) implemented in Go language. Provide code with explanation.
Probably need to explain rules: 3-digit number, no duplicate digits, guess feedback strikes and balls. Provide
full Go program, with input handling, random number generation, loop until 3 strikes. Also maybe mention edge
cases, testing. Provide instructions on running.
Write in Korean. Provide code with comments. Possibly also show go.mod optional. Provide final answer.
...done thinking.
## 간단한 숫자야구(숫자 맞추기) 게임 – Go 구현
아래 코드는 3자리 숫자 야구(Strike & Ball) 게임을 콘솔에서 즐길 수 있게 만든 Go 프로그램입니다.
### 게임 규칙
1. 컴퓨터가 0~9 사이의 서로 다른 숫자 3개를 무작위로 만든다. (예: 527)
2. 사용자는 3자리 숫자를 입력한다.
- 각 자리의 숫자는 중복되지 않아야 한다.
3. 프로그램은 Strike와 Ball을 알려준다.
- Strike : 같은 자리·같은 숫자
- Ball : 다른 자리이지만 같은 숫자
4. </span><span style="color: #88C0D0">3</span><span style="color: #A3BE8C"> Strike</span><span style="color: #ECEFF4">가 나오면 정답! 프로그램이 종료된다.
—
## 1. 전체 코드
</span><span style="color: #88C0D0">go</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> 파일명: main.go</span></span>
<span class="line"><span style="color: #88C0D0">package</span><span style="color: #A3BE8C"> main</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">import</span><span style="color: #A3BE8C"> (</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"bufio"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"fmt"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"math/rand"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"os"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"strconv"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"strings"</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">"time"</span></span>
<span class="line"><span style="color: #A3BE8C">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> -----------------------------------------------------</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">) 컴퓨터가 만든 무작위 3자리 숫자 </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">중복</span><span style="color: #A3BE8C"> 없음</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> 반환</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> -----------------------------------------------------</span></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> generateNumber</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> []int </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">rand.Seed(time.Now(</span><span style="color: #A3BE8C">).UnixNano())</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">num</span><span style="color: #A3BE8C"> := make</span><span style="color: #ECEFF4">([]</span><span style="color: #A3BE8C">int, 0, 3</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> len</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">num</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1"><</span><span style="color: #A3BE8C"> 3 </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">n</span><span style="color: #A3BE8C"> := rand.Intn</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">10</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> // </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">~9</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> 중복 검사</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">dup</span><span style="color: #A3BE8C"> := </span><span style="color: #81A1C1">false</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> _, v := range num </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">v</span><span style="color: #A3BE8C"> == n {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">dup</span><span style="color: #A3BE8C"> = </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">break</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">dup</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">num</span><span style="color: #A3BE8C"> = append</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">num,</span><span style="color: #A3BE8C"> n</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> num</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> -----------------------------------------------------</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">2</span><span style="color: #A3BE8C">) 사용자가 입력한 문자열을 3자리 정수 슬라이스로 변환</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> - 길이, 숫자, 중복 체크</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> -----------------------------------------------------</span></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> parseInput</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">input</span><span style="color: #A3BE8C"> string</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> ([]int, error) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">input</span><span style="color: #A3BE8C"> = strings.TrimSpace</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">input</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">len(input</span><span style="color: #A3BE8C">) </span><span style="color: #81A1C1">!</span><span style="color: #A3BE8C">= </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> nil, fmt.Errorf</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">"3자리 숫자를 입력해주세요"</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> 문자열이 모두 숫자인지 확인</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">_,</span><span style="color: #A3BE8C"> err := strconv.Atoi</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">input</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">err</span><span style="color: #A3BE8C"> != nil {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> nil, fmt.Errorf</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">"숫자만 입력 가능합니다"</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">res</span><span style="color: #A3BE8C"> := make</span><span style="color: #ECEFF4">([]</span><span style="color: #A3BE8C">int, 3</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">seen</span><span style="color: #A3BE8C"> := make</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">map[int]bool</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> i, ch := range input </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">d</span><span style="color: #A3BE8C"> := int</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">ch</span><span style="color: #A3BE8C"> - </span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">0</span><span style="color: #ECEFF4">')</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">seen[d]</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> nil, fmt.Errorf</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">"숫자는 중복될 수 없습니다"</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">seen[d]</span><span style="color: #A3BE8C"> = </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">res[i]</span><span style="color: #A3BE8C"> = d</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span><span style="color: #A3BE8C"> res, nil</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> -----------------------------------------------------</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">) Strike </span><span style="color: #ECEFF4">&</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">Ball</span><span style="color: #A3BE8C"> 계산</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> -----------------------------------------------------</span></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> countStrikeBall</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">answer,</span><span style="color: #A3BE8C"> guess []int</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> (strike, ball int) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> i := 0</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">i</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1"><</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">3</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">i++</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">guess[i]</span><span style="color: #A3BE8C"> == answer[i] {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strike++</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">continue</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> 다른 자리에 같은 숫자가 있는지 확인</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> j := 0</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">j</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1"><</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">3</span><span style="color: #81A1C1">;</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">j++</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">guess[i]</span><span style="color: #A3BE8C"> == answer[j] {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">ball++</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">break</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> -----------------------------------------------------</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">4</span><span style="color: #A3BE8C">) 메인 루프</span></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> -----------------------------------------------------</span></span>
<span class="line"><span style="color: #88C0D0">func</span><span style="color: #A3BE8C"> main</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">answer</span><span style="color: #A3BE8C"> := generateNumber</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> fmt.Println</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">"DEBUG:",</span><span style="color: #A3BE8C"> answer</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C"> // 디버그용: 정답을 확인하고 싶다면 주석 해제</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("=== 숫자 야구 (3자리) ==="</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("0~9 사이의 서로 다른 숫자 3개를 맞춰보세요."</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("입력 형식: 예) 527"</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("각 자리마다 같은 숫자는 중복될 수 없습니다.\n"</span><span style="color: #A3BE8C">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">scanner</span><span style="color: #A3BE8C"> := bufio.NewScanner</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">os.Stdin</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">attempt</span><span style="color: #A3BE8C"> := </span><span style="color: #B48EAD">0</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">for</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">attempt++</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Printf("%d번째 시도 > ",</span><span style="color: #A3BE8C"> attempt)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">!scanner.Scan</span><span style="color: #ECEFF4">()</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">//</span><span style="color: #A3BE8C"> EOF 혹은 오류 발생</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("\n입력이 종료되었습니다."</span><span style="color: #A3BE8C">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">return</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">line</span><span style="color: #A3BE8C"> := scanner.Text</span><span style="color: #ECEFF4">()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">guess,</span><span style="color: #A3BE8C"> err := parseInput</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">line</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">err</span><span style="color: #A3BE8C"> != nil {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Println("입력 오류:",</span><span style="color: #A3BE8C"> err)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">attempt--</span><span style="color: #A3BE8C"> // 유효하지 않은 입력은 시도 횟수에 포함하지 않음</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">continue</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strike,</span><span style="color: #A3BE8C"> ball := countStrikeBall</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">answer,</span><span style="color: #A3BE8C"> guess</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">if</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">strike</span><span style="color: #A3BE8C"> == </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C"> {</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Printf("축하합니다! %d번만에 정답을 맞추셨습니다. 정답: %s\n",</span><span style="color: #A3BE8C"> attempt, line)</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">break</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">fmt.Printf("=> %d Strike, %d Ball\n",</span><span style="color: #A3BE8C"> strike, ball)</span></span>
<span class="line"><span style="color: #A3BE8C"> }</span></span>
<span class="line"><span style="color: #A3BE8C">}</span></span>
<span class="line"><span style="color: #ECEFF4">
### 코드 흐름 요약
| 단계 | 수행 내용 |
|——|———–|
| 1️⃣ | generateNumber</span><span style="color: #ECEFF4">() : 중복 없는 3자리 숫자를 랜덤 생성 |
| 2️⃣ | parseInput</span><span style="color: #ECEFF4">() : 사용자가 입력한 문자열을 검증·변환 |
| 3️⃣ | countStrikeBall</span><span style="color: #ECEFF4">() : 정답과 추측을 비교해 Strike, Ball 개수 계산 |
| 4️⃣ | main</span><span style="color: #ECEFF4">() : 게임 루프, 입력·출력·시도 횟수 관리 |
—
## 2. 실행 방법
1. Go 설치 (버전 1.18 이상 권장)
</span><span style="color: #88C0D0">bash</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">go</span><span style="color: #A3BE8C"> version</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">
2. 프로젝트 디렉터리 생성
</span><span style="color: #88C0D0">bash</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">mkdir</span><span style="color: #A3BE8C"> number-baseball </span><span style="color: #ECEFF4">&&</span><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">cd</span><span style="color: #A3BE8C"> number-baseball</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">
3. 위 코드를 </span><span style="color: #88C0D0">main.go</span><span style="color: #ECEFF4"> 파일에 저장
4. 빌드 및 실행
</span><span style="color: #88C0D0">bash</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">go</span><span style="color: #A3BE8C"> run main.go</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">
혹은 실행 파일을 만들고 싶다면:
</span><span style="color: #88C0D0">bash</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">go</span><span style="color: #A3BE8C"> build -o baseball main.go</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #88C0D0">./baseball</span></span>
<span class="line"><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">
—
## 3. 커스터마이징 아이디어
| 기능 | 구현 방법 |
|——|———–|
| 자리수 변경 (예: 4자리) | </span><span style="color: #88C0D0">generateNumber</span><span style="color: #ECEFF4">, </span><span style="color: #88C0D0">parseInput</span><span style="color: #ECEFF4">, </span><span style="color: #88C0D0">countStrikeBall</span><span style="color: #ECEFF4"> 에서 </span><span style="color: #88C0D0">3</span><span style="color: #ECEFF4">을 원하는 자리수
(</span><span style="color: #88C0D0">digitCount</span><span style="color: #ECEFF4">) 변수로 교체 |
| 힌트 제한 (예: 최대 10번) | </span><span style="color: #88C0D0">attempt</span><span style="color: #ECEFF4"> 변수를 체크하고 </span><span style="color: #88C0D0">attempt</span><span style="color: #A3BE8C"> </span><span style="color: #81A1C1">></span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">10</span><span style="color: #ECEFF4">이면 게임 오버 처리 |
| 정답 공개 옵션 | 디버그용 </span><span style="color: #88C0D0">fmt.Println("DEBUG:",</span><span style="color: #A3BE8C"> answer)</span><span style="color: #ECEFF4"> 주석 해제 |
| 다른 언어와의 비교 | </span><span style="color: #88C0D0">strconv.Atoi</span><span style="color: #ECEFF4"> 대신 </span><span style="color: #88C0D0">fmt.Sscanf</span><span style="color: #ECEFF4"> 등 사용해 보기 |
| GUI/웹 | </span><span style="color: #88C0D0">fyne</span><span style="color: #ECEFF4">, </span><span style="color: #88C0D0">gioui</span><span style="color: #ECEFF4"> 같은 GUI 라이브러리 혹은 </span><span style="color: #88C0D0">net/http</span><span style="color: #ECEFF4"> 로 웹 버전 구현 |
—
## 4. 동작 예시
</span></span>
<span class="line"><span style="color: #A3BE8C">=== 숫자 야구 (3자리) ===</span></span>
<span class="line"><span style="color: #88C0D0">0~9</span><span style="color: #A3BE8C"> 사이의 서로 다른 숫자 </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C">개를 맞춰보세요.</span></span>
<span class="line"><span style="color: #88C0D0">입력</span><span style="color: #A3BE8C"> 형식: 예) 527</span></span>
<span class="line"><span style="color: #88C0D0">각</span><span style="color: #A3BE8C"> 자리마다 같은 숫자는 중복될 수 없습니다.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">1번째</span><span style="color: #A3BE8C"> 시도 </span><span style="color: #81A1C1">></span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">123</span></span>
<span class="line"><span style="color: #A3BE8C">=> </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C"> Strike, </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C"> Ball</span></span>
<span class="line"><span style="color: #88C0D0">2번째</span><span style="color: #A3BE8C"> 시도 </span><span style="color: #81A1C1">></span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">456</span></span>
<span class="line"><span style="color: #A3BE8C">=> </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C"> Strike, </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C"> Ball</span></span>
<span class="line"><span style="color: #88C0D0">3번째</span><span style="color: #A3BE8C"> 시도 </span><span style="color: #81A1C1">></span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">789</span></span>
<span class="line"><span style="color: #A3BE8C">=> </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C"> Strike, </span><span style="color: #B48EAD">2</span><span style="color: #A3BE8C"> Ball</span></span>
<span class="line"><span style="color: #88C0D0">4번째</span><span style="color: #A3BE8C"> 시도 </span><span style="color: #81A1C1">></span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">527</span></span>
<span class="line"><span style="color: #A3BE8C">=> </span><span style="color: #B48EAD">3</span><span style="color: #A3BE8C"> Strike, </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C"> Ball</span></span>
<span class="line"><span style="color: #88C0D0">축하합니다!</span><span style="color: #A3BE8C"> </span><span style="color: #B48EAD">4</span><span style="color: #A3BE8C">번만에 정답을 맞추셨습니다. 정답: </span><span style="color: #B48EAD">527</span></span>
<span class="line"><span style="color: #ECEFF4">
—
### 🎉 마무리
위 코드만 복사해서 </span><span style="color: #88C0D0">main.go</span><span style="color: #ECEFF4">에 붙여넣고 </span><span style="color: #88C0D0">go</span><span style="color: #A3BE8C"> run</span><span style="color: #ECEFF4"> 하면 바로 숫자 야구를 즐길 수 있습니다.
게임 로직이 간단하기 때문에 스스로 변형해 보면서 Go의 입출력, 슬라이스, 난수 생성 등을 연습해 보세요!
궁금한 점이나 추가 기능이 필요하면 언제든 물어봐 주세요. Happy coding! 🚀
total duration: 35.042592792s
load duration: 8.077597209s
prompt eval count: 83 token(s)
prompt eval duration: 940.770625ms
prompt eval rate: 88.23 tokens/s
eval count: 1826 token(s)
eval duration: 25.64118875s
eval rate: 71.21 tokens/sMXFP4로 양자화한 gpt-oss 120b 모델의 결과입니다. tps 가 2배;; 차이가 나는 상황이라 ㅎㅎㅎ
pirogom@pirogom-Mac-Studio Desktop % ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
gpt-oss:120b a951a23b46a1 92 GB 100% GPU 131072 Forever
qwen3-coder-next:q8_0 3f68e12b44ee 94 GB 100% GPU 262144 Forever
qwen3-coder-next q8 + gpt-oss:120b 둘 다 올리면 213기가 정도 램을 씁니다? ㅎㅎㅎㅎ
이렇게 qwen3-coder-next 모델에 대한 간단한 실행정보?에 대한 글을 마무리 해보겠습니다.
LocalLLM을 사용해 가면서 이런류의 정보는 계속 지속적으로 남겨 보도록 하겠습니다.