코딩 테스트/C++

백준, C++) 2765, 11005, 2720, 2903,2292, 1193, 2869

나무늘보섬 2025. 4. 21. 20:42

2765

 

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main() {
    string s;
    int b, sum = 0;
    cin >> s >> b;
    for (int i=s.size()-1; i>=0; i--) {
        if (s[i] >= '0' && s[i] <= '9') {
            sum += (s[i]-'0')*pow(b,s.size()-1-i);
        }
        else
        {
            sum+= (s[i]-'A'+10) * pow(b,s.size()-1-i);
        }
    }
    cout << sum;
        return 0;
}

 

1. 0~9일때와, 알파벳일 때를 구분 

2. pow()를 통해 제곱근 설정 

3. 아스키 코드때문에 변환 ('0', 'A')

 

 


11005

#include <iostream>
#include<algorithm>
using namespace std;

int main() {
    int n,b,sum =0;
    string s;
    cin >> n >> b;
    while (n>0)
    {
        int temp = n%b;
        if(temp >= 0 && temp<10)
        {
            s += (temp+'0');
        }
        else s += (temp -10 + 'A');

        n/=b;
    }
    reverse(s.begin(),s.end());
    cout<< s;
}

 

temp가 s에 추가될 때, 자동적으로 문자로 변환됨 

-> s+=(char)(결과값) 에서 (char)가 생략된 거임

 

맨 뒤의 자리의 수를 먼저 계산해서 s의 맨 앞에 추가 했기 떄문에

-> reverse()함수를 써서 앞 뒤를 바꿔줘야 정상적인 출력이 가능함.

 

 


2720

 

#include <iostream>
using namespace std;

int main(){
    int t = 0;
    cin >> t;

    for(int i = 0; i < t; i++) {
        int change = 0;
        cin >> change;

        int coins[4];

        coins[0] = change / 25;
        change %= 25;

        coins[1] = change / 10;
        change %= 10;

        coins[2] = change / 5;
        change %= 5;

        coins[3] = change / 1;

        cout<< coins[0] << " " << coins[1] << " "  << coins[2] << " "  << coins[3] << " ";
       
        cout << '\n';
    }

    return 0;
}

 

나머지와 몫을 구분하는 문제

 


2903

 

#include <iostream>
#include <cmath>
using namespace std;

int main(){
    int count = 0;
    int numDot = 4;
    int numSquare = 1;
    int numSide = 4;

    cin >> count;
    for(int i=0; i<count; i++)
    {
        numSquare = pow(4,i);

        numDot = numDot + numSquare + numSide;

        numSide = numSquare*4 + numSide*2;
    }

    cout << numDot;

    return 0;
}

규칙 찾는데 조금 걸림

 

규칙 찾기 + Dot(점)의 업데이트를 square과 side의 사이에 위치하여 update하는 게 관건이었음

 

 


2292

#include <iostream>
using namespace std;
int main()
{
    int N=0;
    int side = 1;
    int count = 1;
    cin >> N;
   
    while(N>side)
    {
        side += 6*count;
        count++;
    }
    cout << count;
    return 0;
}

 

-> 의외로 간단한 문제 , 규칙을 나머지와 몫에 집중해서 긴 시간 끌었음.

 

 


 

1193

#include <iostream>
using namespace std;

int main()
{
    int N, count = 1;
    bool bigI = false;  
    cin >> N;

    int i = 1, j = 1;

    while (count < N)
    {
        if (bigI) {
            if (j == 1) {  
                i++;
                bigI=false;
            } else {
                i++;
                j--;
            }
        } else {
            if (i == 1) {  
                j++;
                bigI= true;
            } else {
                i--;
                j++;
            }
        }
        count++;
    }

    cout << i << "/" << j;
    return 0;
}

i가 증가하는 방향과 아닌 방향으로 설정 

방향이 꺾이는 타이밍 -> i또는 j가 1일 때 이므로 bool값을 설정 

 

 

 

다른 분들의 간단한 코드

#include <iostream>

using namespace std;

int main()
{

    int X;
    cin >> X;

    int i = 1;

    while (X > i)
    {
        X -= i;
        i++;
    }

    if (i % 2 == 0)
        cout << X << "/" << i - X + 1;
    else
        cout << i - X + 1 << "/" << X;

    return 0;
}

2869

#include <iostream>
using namespace std;

int main()
{
int a=0, b=0, v=0;
cin >> a >> b >> v;

int day = 0, dis = 0;

while (dis < v)
{
day++;
if(dis + a >= v)
    break;
dis += a-b;
}

cout << day;
return 0;
}

-> 시간 초과된 코드, 계속 반복하기 때문에 오래 걸림

 

 

-> 이 코드는 chatgpt의 코드 

(v-a)/(a-b) +1은 이해가 되는데 (v-b-1) / (a-b)???

#include <iostream>
using namespace std;

int main()
{
    int a, b, v;
    cin >> a >> b >> v;

    int day = (v - b - 1) / (a - b) + 1;
    cout << day;

    return 0;
}

 

 

 

 

-> 그렇다고 한다.... 

이해하기가 매우 어려움

 

관련 문서

https://stackoverflow.com/questions/2745074/fast-ceiling-of-an-integer-division-in-c-c