Skip to content

Conversation

@kokeunho
Copy link
Collaborator

πŸ”— 문제 링크

[PCCP 기좜문제] 4번 μˆ˜μ‹ 볡원
https://school.programmers.co.kr/learn/courses/30/lessons/340210

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

3h? (ν’€μ΄λŠ” μ‰¬μš΄λ° κ΅¬ν˜„ μ—­λŸ‰μ΄ μ’€ λΆ€μ‘±ν•΄μ„œ...)

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

ν•΄λ‹Ή 문제 ν’€μ΄λŠ” κ°„λ‹¨ν•©λ‹ˆλ‹€.
μž…λ ₯ 받은 μ‹μ—μ„œ κ°€λŠ₯ν•œ 진법 λ²”μœ„λ₯Ό μ°Ύμ•„λ‚Έ ν›„
식을 성립 μ‹œν‚€λŠ” μ§„λ²•λ“€λ§Œ μΆ”λ €λƒ…λ‹ˆλ‹€.
그리고 ν•΄λ‹Ή μ§„λ²•λ“€λ‘œ Xλ₯Ό κ΅¬ν•˜κ³  좜λ ₯을 κ΅¬ν•˜λ©΄ λ©λ‹ˆλ‹€.

κ΅¬ν˜„ μ—­λŸ‰μ΄ λΆ€μ‘±ν•΄μ„œ 헀맨 λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.
λ‹€λ₯Έ 뢄듀은 μ–΄λ ΅μ§€ μ•Šκ²Œ ν’€ 수 μžˆμ„ 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

더 μžμ„Έν•œ ν’€μ΄λŠ” λΈ”λ‘œκ·Έ ν¬μŠ€νŒ…μœΌλ‘œ μž‘μ„±ν•΄λ΄€μŠ΅λ‹ˆλ‹€.
https://velog.io/@kokangsik65/PCCP-기좜-4번-κ΅¬ν˜„μ„-ν•˜μ§€-λͺ»ν•˜λŠ”-λ‚˜μ—κ²Œ

μ½”λ“œ 리뷰든 포슀트 리뷰든 λ‹¬κ²Œ λ°›κ² μŠ΅λ‹ˆλ‹€!

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

Copy link
Collaborator

@kangrae-jo kangrae-jo left a comment

Choose a reason for hiding this comment

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

μ•½ 2μ‹œκ°„λ™μ•ˆμ˜ gpt와 claudeλ₯Ό κ³ λ¬Έν•œ 끝에 정닡을 μ–»μ–΄λƒˆμŠ΅λ‹ˆλ‹€.

μ²˜μŒμ— ν•œ 30-40뢄은 문제λ₯Ό 잘 λͺ» μ΄ν•΄ν•΄μ„œ 고생을 μ’€ ν–ˆλ„€μš”.
μ €κΈ° λ‚˜μ™€μžˆλŠ” μˆ˜κ°€ 10μ§„μˆ˜μΈμ€„ μ•Œμ•˜μŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” μˆ˜λ“€μ€ λͺ¨λ‘ nμ§„μˆ˜ λ”λΌκ΅¬μš”.
14 + 3 = 17을 보고 ν•œμ°Έ λ©λ•Œλ Έλ„€μš”.

문제λ₯Ό ν‘ΈλŠ” 방식은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  1. 식 tokenize ν•˜λ©΄μ„œ Xκ°€ ν¬ν•¨λœ 식 뢄리
  2. 2진법 λΆ€ν„° 9진법 κΉŒμ§€ 적절히 μ μš©μ‹œμΌœλ³΄κΈ°( expsλ₯Ό ν•˜λ‚˜μ”© κΊΌλ‚΄κ°€λ©° 식이 λ§žλŠ”μ§€ν™•μΈ)
  3. 후보에 μžˆλŠ” 진법듀 μ μš©μ‹œ 값이 λ‹¬λΌμ§€λŠ” 녀석은 ?둜 λ„£κ³ , μ•ˆλ‹¬λΌμ§€λŠ” 녀석은 κ·Έ 값을 λ„£μŠ΅λ‹ˆλ‹€.

μ΄λ•Œ μ •λ‹΅ 배열에 λ„£μ„λ•Œλ„ 진법을 μœ μ§€ν•΄μ•Όν•΄μš”.
λ”°λΌμ„œ 증감 연산은
Nμ§„λ²•μ—μ„œ 10μ§„λ²•μœΌλ‘œ λ°”κΎΈκ³ ,
κ³„μ‚°ν•˜κ³ ,
10μ§„λ²•μ—μ„œ Nμ§„λ²•μœΌλ‘œ λ°”κΏ”μ•Ό ν•©λ‹ˆλ‹€.
μ½”λ“œμ— μ •μ˜λ˜μ–΄μžˆλŠ” + - λŠ” 10진법 기반 계산이기 λ•Œλ¬Έμ΄μ£ .

그리고 또 거의 1μ‹œκ°„μ„ μ“΄ 뢀뢄이 μžˆλŠ”λ°, 이거 ν•˜λ‚˜ κ³ μ³μ£Όλ‹ˆκΉŒ μ •λ‹΅μ΄λ”λΌκ΅¬μš”.
그건 λ°”λ‘œ λͺ¨λ“  자릿수λ₯Ό ν™•μΈν•˜λ©΄μ„œ μ΅œμ†Œ 진법? 을 μ°ΎλŠ” κ±°μ—μš”.
진법이 적용이 λ˜λƒ μ•ˆλ˜λƒλ‘œ νŒλ‹¨ν•  수 μžˆμ„ 거라 μƒκ°ν–ˆλŠ”λ°, μ•„λ‹ˆμ—ˆλ‚˜λ΄μš”...

μ˜€λžœλ§Œμ— 맀우맀우 μ–΄λ ΅κ³  νž˜λ“€μ—ˆλ„€μš”.

κ·Όν˜Έλ‹˜ μ½”λ“œλ„ 많이 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€.

CPP CODE
#include <string>
#include <sstream>
#include <vector>
#include <iostream>

using namespace std;

int nToTen(const string& s, int base, bool& ok) {
    int val = 0;
    ok = true;
    for (char ch : s) {
        if (ch < '0' || ch > '9') { 
            ok = false; 
            return 0; 
        }
        
        int d = ch - '0';
        if (d >= base) { 
            ok = false; 
            return 0; 
        }
        val = val * base + d;
    }
    return val;
}

string tenToN(int val, int base) {
    if (val == 0) return "0";
    string result = "";
    while (val > 0) {
        result = char('0' + val % base) + result;
        val /= base;
    }
    return result;
}

struct Exp {
    string a, s, b, c;
    Exp(string a_, string s_, string b_, string c_) : a(a_), s(s_), b(b_), c(c_) {}
    
    bool isCollectAry(int ary) {
        bool okA, okB, okC;
        int A = nToTen(a, ary, okA);
        int B = nToTen(b, ary, okB);
        int C = nToTen(c, ary, okC);
        if (!okA || !okB || !okC) return false;
        if (s == "+") return (A + B) == C;
        else          return (A - B) == C;
    }
    
    string getResult(int ary) {
        bool okA, okB;
        int A = nToTen(a, ary, okA);
        int B = nToTen(b, ary, okB);
        if (!okA || !okB) return "";
        
        int result;
        if (s == "+") result = A + B;
        else          result = A - B;
        
        return tenToN(result, ary);
    }
    
    string toString(string result) {
        return a + " " + s + " " +  b + " = " + result;
    }
    
    // 식에 ν¬ν•¨λœ λͺ¨λ“  μˆ«μžμ—μ„œ κ°€μž₯ 큰 자릿수 μ°ΎκΈ°
    int getMaxDigit() {
        int maxDigit = 0;
        for (char ch : a) {
            if (ch >= '0' && ch <= '9') maxDigit = max(maxDigit, ch - '0');
        }
        for (char ch : b) {
            if (ch >= '0' && ch <= '9') maxDigit = max(maxDigit, ch - '0');
        }
        if (c == "X") return maxDigit;
        for (char ch : c) {
            if (ch >= '0' && ch <= '9') maxDigit = max(maxDigit, ch - '0');
        }
        return maxDigit;
    }
};

vector<string> solution(vector<string> expressions) {
    vector<Exp> xs, exps;
    for (int i = 0; i < expressions.size(); i++) {
        stringstream ss(expressions[i]);
        string a, sign, b, equal, c;
        ss >> a >> sign >> b >> equal >> c;
        
        if (c == "X") xs.push_back(Exp(a, sign, b, c));
        else exps.push_back(Exp(a, sign, b, c));
    }
    
    // λͺ¨λ“  μ‹μ—μ„œ μ΅œλŒ€ 자릿수 μ°ΎκΈ°
    int maxDigit = 0;
    for (Exp exp : exps) {
        maxDigit = max(maxDigit, exp.getMaxDigit());
    }
    for (Exp exp : xs) {
        maxDigit = max(maxDigit, exp.getMaxDigit());
    }
    
    // μ΅œλŒ€ 자릿수 + 1진법뢀터 μ‹œμž‘
    vector<int> arys;
    for (int ary = maxDigit + 1; ary <= 9; ary++) {
        bool flag = true;
        for (Exp exp : exps) {
            if (!exp.isCollectAry(ary)) {
                flag = false;
                break;
            }    
        }
        if (flag) arys.push_back(ary);
    }
    
    vector<string> answer;
    for (Exp exp : xs) {
        vector<string> results;
        for (int ary : arys) {
            string result = exp.getResult(ary);
            if (!result.empty()) {
                results.push_back(result);
            }
        }
        
        bool allSame = true;
        if (results.size() > 1) {
            for (int i = 1; i < results.size(); i++) {
                if (results[i] != results[0]) {
                    allSame = false;
                    break;
                }
            }
        }
        
        if (allSame && !results.empty()) answer.push_back(exp.toString(results[0]));
        else answer.push_back(exp.toString("?"));
    }
    
    return answer;
}

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.

3 participants