AtCoder Beginner Contest 386 문제 풀이

ABC386 문제 분석 및 풀이

A - Full House 2

주어진 네 개의 정수 A, B, C, D에 대해 추가로 하나의 정수 E를 선택하여 3+2 패턴을 만들 수 있는지 판단하는 문제입니다. 가능한 조합은 다음과 같습니다:

  • A = B, C = D, 그리고 B ≠ C인 경우
  • A = B = C, 그리고 C ≠ D인 경우

정렬 후 비교 로직을 통해 결과를 도출합니다. 아래는 구현 코드입니다:

// Problem: A - Full House 2
// Contest: AtCoder - AtCoder Beginner Contest 386
// URL: https://atcoder.jp/contests/abc386/tasks/abc386_a
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n';
#define rep(n) for(int i = 0;i < (n);i++)
const int N = 1e6 + 10,M = 2e6 + 10;
int a[4];
bool cmp(int x, int y)
{
	return x < y;
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    for(int i = 0;i < 4;i++)
    {
    	cin >> a[i];
    }
    sort(a , a + 4 ,cmp);
    if(a[0] == a[1] && a[2] == a[3] && a[1] != a[2])
    {
    	cout << "Yes" << endl;
    }else if(a[0] == a[1] && a[1] == a[2] && a[2] != a[3])
    {
    	cout << "Yes" << endl;
    }else if(a[1] == a[2] && a[2] == a[3] && a[0] != a[1])
    {
    	cout << "Yes" << endl;
    }else
    {
    	cout << "No" << endl;
    }
    return 0;
}

B - Calculator

계산기에서 입력된 숫자 문자열을 최소한의 키 입력으로 표현할 수 있는지를 계산하는 문제입니다. 핵심은 다음과 같습니다:

  • '0' 다음에 또 '0'이 오면 '00'으로 처리
  • '0'이 단독으로 나타나면 '0'으로 처리

코드는 다음과 같습니다:

// Problem: B - Calculator
// Contest: AtCoder - AtCoder Beginner Contest 386
// URL: https://atcoder.jp/contests/abc386/tasks/abc386_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n';
#define rep(n) for(int i = 0;i < (n);i++)
const int N = 1e6 + 10,M = 2e6 + 10;
int cnt;
string s;
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin >> s;
    for(int i = 0;i < s.size();i++)
    {
    	if(s[i] != '0')
    	{
    		cnt++;
    	}else if(s[i] == '0')
    	{
    		if(i + 1 < s.size())
    		{
    			if(s[i + 1] == '0')
    			{
    				cnt++;
    				i++;
    			}else
    			{
    				cnt++;
    			}
    		}else
    		{
    			cnt++;
    		}
    	}
    }
    cout << cnt << endl;
    return 0;
}

C - Operate 1

문자열 간의 차이를 하나만 허용하는지 확인하는 문제로, 두 문자열이 서로 얼마나 다른지를 체크하는 알고리즘을 적용합니다.

구현 방식은 다음과 같습니다:

// Problem: C - Operate 1
// Contest: AtCoder - AtCoder Beginner Contest 386
// URL: https://atcoder.jp/contests/abc386/tasks/abc386_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define rep(n) for(int i = 0; i < (n); i++)
const int N = 1e6 + 10, M = 2e6 + 10;

signed main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int k;
    string s, t;
    cin >> k;
    cin >> s >> t;

    if (k == 1) {
        int len_s = s.size();
        int len_t = t.size();
        if (abs(len_s - len_t) > 1) {
            cout << "No" << endl;
            return 0;
        }
        int diff = 0;
        int i = 0, j = 0;
        while (i < len_s && j < len_t) {
            if (s[i]!= t[j]) {
                diff++;
                if (diff > 1) {
                    cout << "No" << endl;
                    return 0;
                }
                if (len_s < len_t) {
                    j++;
                } else if (len_s > len_t) {
                    i++;
                } else {
                    i++;
                    j++;
                }
            } else {
                i++;
                j++;
            }
        }
        if (i < len_s || j < len_t) {
            diff++;
        }
        if (diff <= 1) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }
    return 0;
}

최종 점수

제출 기록

등급 변화 : 299 → 370

태그: AtCoder 알고리즘 문제풀이 프로그래밍 코딩테스트

8월 8일 11:53에 게시됨