Skip to content

Conversation

@mj010504
Copy link
Collaborator

@mj010504 mj010504 commented Aug 22, 2025

πŸ”— 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/160585#qna

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

30λΆ„

✨ μˆ˜λ„ μ½”λ“œ

  • 문제 μžμ²΄λŠ” κ°„λ‹¨ν•œ λ¬Έμ œμž…λ‹ˆλ‹€. λ³΄λ“œνŒμ΄ μ£Όμ–΄μ§ˆ λ•Œ ν•΄λ‹Ή λ³΄λ“œνŒμ΄ 두 λͺ…μ΄μ„œ 틱택토λ₯Ό ν•  λ•Œ λ‚˜μ˜¬ 수 μžˆλŠ” 경우의 λ³΄λ“œνŒμΈμ§€λ₯Ό ꡬ해야 ν•©λ‹ˆλ‹€. λ°˜λ‘€λ₯Ό λͺ¨λ‘ 잘 생각해야 ν•œλ²ˆμ— ν’€ 수 μžˆλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.
  • μ €λŠ” μ΄ˆκΈ°κ°’μ„ 0으둜 두고 κ°€λŠ₯ν•œ λ³΄λ“œνŒμΈ κ²½μš°μ—λ§Œ 1둜 κ°±μ‹ ν•˜κ±°λ‚˜, μ΄ˆκΈ°κ°’μ„ 1둜 두고 κ°€λŠ₯ν•˜μ§€ μ•Šμ€ λ³΄λ“œνŒμΈ κ²½μš°μ—” 0으둜 κ°±μ‹ ν•˜λŠ” 방법 λ‘˜ 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜λ € ν–ˆκ³  λ‘λ²ˆμ§Έλ‘œ μ‹œλ„ν•˜λ‹€κ°€ 첫번째 λ°©λ²•μœΌλ‘œ ν’€μ΄ν–ˆμŠ΅λ‹ˆλ‹€.
  • O의 κ°œμˆ˜μ™€ X의 개수λ₯Ό κ³„μ‚°ν•˜κ³ , O의 λΉ™κ³  νšŸμˆ˜μ™€ X의 λΉ™κ³  횟수λ₯Ό κ΅¬ν•©λ‹ˆλ‹€.
  1. O와 X의 κ°œμˆ˜κ°€ 같을 λ•Œ O의 λΉ™κ³  νšŸμˆ˜κ°€ 0번인 경우
  2. O의 κ°œμˆ˜κ°€ X의 κ°œμˆ˜λ³΄λ‹€ 1개 λ§Žμ„ λ•Œ X의 λΉ™κ³  νšŸμˆ˜κ°€ 0번인 경우
    λ₯Ό μ œμ™Έν•œ λͺ¨λ“  κ²½μš°λŠ” λΆˆκ°€λŠ₯ν•œ 경우둜 μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
  • μ²˜μŒμ—λŠ” 1번과 2λ²ˆμ—μ„œ λΉ™κ³  νšŸμˆ˜κ°€ 각각 1개 μ΄ν•˜μΌ λ•Œλ‘œ 쑰건을 κ±Έμ—ˆλŠ”λ° 87점이 λ‚˜μ™”μŠ΅λ‹ˆλ‹€. λ™μ‹œμ— 2κ°œκ°€ λΉ™κ³ κ°€ λ˜λŠ” κ²½μš°λ„ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

  • κ°„λ‹¨ν•œ λ¬Έμ œμ§€λ§Œ μ—¬λŸ¬ λ°˜λ‘€λ₯Ό ν•œλ²ˆμ— μƒκ°ν•˜λŠ” λŠ₯λ ₯이 ν•„μš”ν•΄ λ³΄μž…λ‹ˆλ‹€.

Copy link
Collaborator

@flydongwoo flydongwoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

κ²Œμž„ κ·œμΉ™μ„ 이해λ₯Ό 잘λͺ»ν•΄μ„œ μ’€ λΉ™λΉ™ λŒλ©΄μ„œ ν•΄λ§Έλ„€μš” ν•˜ν•˜

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€λŠ” ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜λŠ” κ²ƒμ΄λ‹€λ³΄λ‹ˆ μ’€ 많이 λ²…μ°¨λ„€μš”

λ‹¨μˆœ κ΅¬ν˜„μœΌλ‘œ ν’€μ—ˆμŠ΅λ‹ˆλ‹€

νœ΄κ°€μ™€ μ‚¬μ΄λ“œ ν”Œμ  일정이 κ²ΉμΉ˜λ‹€λ³΄λ‹ˆ 제 PR이 λ„ˆλ¬΄ 많이 λ°€λ Έλ„€μš” μ—΄μ‹¬νžˆ μ˜¬λ €λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€!

ν˜Όμžμ„œ ν•˜λŠ” 틱택토
#include <vector>
#include <string>
using namespace std;

static bool win(const vector<string>& b, char ch) {
    for (int i = 0; i < 3; i++) {
        if (b[i][0] == ch && b[i][1] == ch && b[i][2] == ch) {
            return true;
        }
        if (b[0][i] == ch && b[1][i] == ch && b[2][i] == ch) {
            return true;
        }
    }
    if (b[0][0] == ch && b[1][1] == ch && b[2][2] == ch) {
        return true;
    }
    if (b[0][2] == ch && b[1][1] == ch && b[2][0] == ch) {
        return true;
    }
    return false;
}

int solution(vector<string> board) {
    int cntO = 0;
    int cntX = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[i][j] == 'O') {
                cntO++;
            } else if (board[i][j] == 'X') {
                cntX++;
            }
        }
    }

    if (!(cntO == cntX || cntO == cntX + 1)) {
        return 0;
    }

    bool winO = win(board, 'O');
    bool winX = win(board, 'X');

    if (winO && winX) {
        return 0;
    }
    if (winO && cntO != cntX + 1) {
        return 0;
    }
    if (winX && cntO != cntX) {
        return 0;
    }

    return 1;
}

@hyeokbini
Copy link
Collaborator

문제λ₯Ό 읽고 κ·œμΉ™μ„±μ„ νŒλ‹¨ν•œ λ’€ λ°˜λ‘€μ²˜λ¦¬ 쑰건을 잘 κ΅¬μƒν•˜λŠ” 법을 μ—°μŠ΅ν•˜λŠ” λ¬Έμ œλ„€μš”. μ €λŠ” λ¬Έμ œμ—μ„œ μ΄λ ‡κ²Œ 정보λ₯Ό λ½‘μ•„λƒˆμŠ΅λ‹ˆλ‹€.

  1. κ°€λŠ₯ν•œ κ°œμˆ˜λŠ” O == X ν˜Ήμ€ O - 1 == X
  2. Oκ°€ 이긴 경우 X의 κ°œμˆ˜κ°€ O - 1κ°œκ°€ μ•„λ‹ˆλ©΄ 0
  3. Xκ°€ 이긴 경우 O의 κ°œμˆ˜κ°€ Xκ°œκ°€ μ•„λ‹ˆλ©΄ 0
  4. λ‘˜ λ‹€ 이긴 경우둜 λ‚˜μ™€μžˆλ‹€λ©΄ Oκ°€ 이긴 경우둜 μ²˜λ¦¬ν•΄μ•Ό 함

3 * 3 λ³΄λ“œνŒμ΄λ‹ˆκΉŒ λ‹¨μˆœ λΉ‘κ΅¬ν˜„μœΌλ‘œ μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
μš”μ¦˜ ν΄λ¦°μ½”λ“œλ₯Ό μ λŠ” μ—°μŠ΅μ„ ν•˜κ³  μžˆλŠ”λ° μΌνƒˆ? μ‚Όμ•„ κΉ”λ”ν•œ 건 λ’·μ „μœΌλ‘œ 두고 μˆ˜λ„μ½”λ“œ μ λŠ” λŠλ‚ŒμœΌλ‘œ λΉ λ₯΄κ²Œ κ΅¬ν˜„ν•˜λŠ” μ—°μŠ΅μ„ ν•΄λ΄€μŠ΅λ‹ˆλ‹€. μ—„μ²­ λΉ λ₯΄κ²Œ κ΅¬ν˜„ν•˜κΈ΄ ν–ˆλŠ”λ° μ½”λ“œλŸ‰μ΄ μ–΄λ§ˆμ–΄λ§ˆν•΄μ‘Œλ„€μš”...

λ―Όμ€€λ‹˜ μ½”λ“œλ₯Ό λ³΄λ‹ˆ μ—„μ²­ κΉ”λ”ν•˜λ„€μš”. κ°€λŠ₯ν•œ 경우의 μˆ˜μ— λŒ€ν•΄μ„œ νƒμƒ‰ν•˜μ…”μ„œ λ§ˆμ§€λ§‰ 뢀뢄이 더 κΉ”λ”ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. μ €λŠ” λΆˆκ°€λŠ₯ν•œ 경우의 수λ₯Ό νƒμƒ‰ν•˜λ €λ‹€ λ³΄λ‹ˆ λ’€μͺ½ 쑰건뢀뢄도 λ‚œμž‘ν•΄μ§„ λŠλ‚Œμ΄ λ“œλ„€μš”.

μ•„λž˜λŠ” 제좜 μ½”λ“œμž…λ‹ˆλ‹€. κ³ μƒν•˜μ…¨μ–΄μš”!

ν˜Όμžμ„œ ν•˜λŠ” 틱택토 / c++
#include <string>
#include <vector>

using namespace std;

int solution(vector<string> board) {
    int answer = 1;
    int ocount = 0;
    int xcount = 0;
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            if(board[i][j] == 'O')
            {
                ocount++;
            }
            else if(board[i][j] == 'X')
            {
                xcount++;
            }
        }
    }
    if(!((ocount == xcount) || (ocount - 1 == xcount)))
    {
        answer = 0;
    }
    bool isowin = false;
    bool isxwin = false;
    // κ°€λ‘œλΆ€ν„° 검사
    for(int i = 0; i < 3; i++)
    {
        if(board[i][0] == board[i][1] && board[i][1] == board[i][2])
        {
            if(board[i][0] == 'O')
            {
                isowin = true;
            }
            else if(board[i][0] == 'X')
            {
                isxwin = true;
            }
        }
    }
    // μ„Έλ‘œ
    for(int i = 0; i < 3; i++)
    {
        if(board[0][i] == board[1][i] && board[1][i] == board[2][i])
        {
            if(board[0][i] == 'O')
            {
                isowin = true;
            }
            else if(board[0][i] == 'X')
            {
                isxwin = true;
            }
        }
    }
    // λŒ€κ°
    if(board[0][0] == board[1][1] && board[1][1] == board[2][2])
    {
        if(board[0][0] == 'O')
        {
            isowin = true;
        }
        else if(board[0][0] == 'X')
        {
            isxwin = true;
        }
    }
    if(board[0][2] == board[1][1] && board[1][1] == board[0][2])
    {
        if(board[0][2] == 'O')
        {
            isowin = true;
        }
        else if(board[0][2] == 'X')
        {
            isxwin = true;
        }
    }
    if(isowin && isxwin)
    {
        answer = 0;
    }
    if(isowin)
    {
        if(ocount - 1 != xcount)
        {
            answer = 0;
        }
    }
    else if(isxwin && !isowin)
    {
        if(xcount != ocount)
        {
            answer = 0;
        }
    }
    return answer;
}

Copy link
Collaborator

@Seol-Munhyeok Seol-Munhyeok left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ €λŠ” μ²˜μŒμ— μ˜¬λ°”λ₯Έ κ²½μš°κ°€ 더 λ§Žμ„κΉŒ, μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ κ²½μš°κ°€ 더 λ§Žμ„κΉŒλ₯Ό κ³ λ―Όν•˜λ‹€κ°€ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ 경우λ₯Ό μ°ΎλŠ” λ°©ν–₯으둜 ν’€μ—ˆλŠ”λ° λ™μ‹œμ— 두 쀄 λΉ™κ³ κ°€ λ‚˜μ˜€λŠ” 상황을 κ³ λ €ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

사싀 이 λ¬Έμ œλŠ” μ˜¬λ°”λ₯Έ 경우λ₯Ό μ°ΎλŠ” 게 더 κ°„λ‹¨ν•œλ° O β†’ X β†’ O β†’ X μˆœμ„œμ΄λ―€λ‘œ λ°˜λ“œμ‹œ O의 개수 >= X의 개수 μž„μ„ 잘 μƒκ°ν•˜λ©΄ λ‹€μŒκ³Ό 같이 μš”μ•½λ©λ‹ˆλ‹€.


  1. O κ°œμˆ˜κ°€ X κ°œμˆ˜μ™€ 같을 λ•Œ, O λΉ™κ³ κ°€ μ•„λ‹ˆλΌλ©΄ 성곡
  2. O κ°œμˆ˜κ°€ X κ°œμˆ˜λ³΄λ‹€ 1개 λ§Žμ„ λ•Œ, X λΉ™κ³ κ°€ μ•„λ‹ˆλΌλ©΄ 성곡
  3. μ΄μ™Έμ—λŠ” λͺ¨λ‘ μ‹€νŒ¨

μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

from collections import Counter
    
def solution(board):
    # O와 X 개수
    count = Counter("".join(board))
    # μ„Έλ‘œμ€„μ„ κ°€λ‘œμ€„λ‘œ λ°”κΎΌ λ°°μ—΄
    tranposed = []
    for j in range(3):
        new_row = ""
        for i in range(3):
            new_row += board[i][j]
        tranposed.append(new_row)
    tmp = board + tranposed
    # λŒ€κ°μ„ 
    dia1 = board[0][0] + board[1][1] + board[2][2]
    tmp.append(dia1)
    dia2 = board[0][2] + board[1][1] + board[2][0]
    tmp.append(dia2)
    # λΉ™κ³  개수
    o_win = tmp.count("OOO")
    x_win = tmp.count("XXX")
    
    # O κ°œμˆ˜κ°€ X κ°œμˆ˜μ™€ κ°™μ„λ•Œ, O λΉ™κ³ κ°€ μ•„λ‹ˆλΌλ©΄ 성곡
    if count['O'] == count['X'] and o_win == 0:
        return 1
    
    # O κ°œμˆ˜κ°€ X κ°œμˆ˜λ³΄λ‹€ 1개 λ§Žμ„λ•Œ, X λΉ™κ³ κ°€ μ•„λ‹ˆλΌλ©΄ 성곡
    if count['O'] - count['X'] == 1 and x_win == 0:
        return 1
    
    # μ΄μ™Έμ—λŠ” λͺ¨λ‘ μ‹€νŒ¨
    return 0

μ €λŠ” 전체 λ°°μ—΄μ—μ„œ O κ°œμˆ˜μ™€ X κ°œμˆ˜λŠ” Counter둜 κ΅¬ν•˜κ³ , λΉ™κ³  κ°œμˆ˜λŠ” λͺ¨λ“  μ„Έλ‘œμ€„μ„ κ°€λ‘œμ€„λ‘œ λ°”κΎΈκ³ , λŒ€κ°μ„ μ€ ν•˜λ“œμ½”λ”©μœΌλ‘œ μ²˜λ¦¬ν•œ λ’€, OOO와 XXX의 개수λ₯Ό κ΅¬ν•˜λŠ” λ°©λ²•μœΌλ‘œ ν’€μ—ˆμŠ΅λ‹ˆλ‹€.
λ©‹μžˆλŠ” 방법은 μ•„λ‹ˆμ§€λ§Œ... μΆ©λΆ„νžˆ 빨리 ν’€ 수 μžˆλŠ” λ°©λ²•μž…λ‹ˆλ‹€.


문제 ν‘Όλ‹€κ³  μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!
μ œκ°€ 이번 μ£Ό λ‚΄λ‚΄ 쑰금 λ°”λΉ μ„œ... 남은 PR 및 λ¦¬λ·°λŠ” λ‹€μŒμ£Όμ— λͺ°μ•„μ„œ λ‹€ μΉ˜μš°κ² μŠ΅λ‹ˆλ‹€!

@mj010504 mj010504 merged commit 4b92dda into main Aug 28, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants