2870 - 수학숙제

재찬·2023년 1월 27일
0

Algorithm

목록 보기
26/64

문제

오답 코드

#include <bits/stdc++.h>
using namespace std;

string s;
int n;
vector<string> v;

bool isNum(char c){
	return (c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' ||
	c == '7' || c == '8' || c == '9');
}

bool cmp(string a, string b){
	int c = stoi(a);
	int d = stoi(b);
	return c < d;
}

int main(){
	string ret;
	int idx = 0;
	cin >> n;
	for(int i = 0; i < n; i++){
		cin >> s;
		ret = "";
		for(int j = 0; j < s.size(); j++){
			char c = s[j];
			if(c == '0' && s[j+1] != '0' && !isNum(s[j+1]) && (j+1) <= s.size()){
				ret += c;
				v.push_back(ret), ret = "";
			}
			if(isNum(c) && !isNum(s[j+1]) && (j+1) <= s.size() ) ret += c, v.push_back(ret), ret = "";
			if(isNum(c) && isNum(s[j+1]) && (j+1) <= s.size() ) ret += c;
		
		}
	}
	sort(v.begin(), v.end(), cmp);
	
	for(auto it: v){
		cout << it << "\n";
	}	
	return 0;
}

오답 풀이

주어진 tc만 통과한다고 무조건 맞지 않는다. 범위, 오버플로우 등 생각해야할 것이 많다고 느꼈다.

정답 코드

#include <bits/stdc++.h>
using namespace std;
int n;
vector<string> v;
string s, ret;

void check(){
	while(1){
		if(ret.size() && ret.front() == '0') ret.erase(ret.begin());
		else break;
	}
	
	if(ret.size() == 0) ret = '0';
	v.push_back(ret);
	ret = "";
}

bool cmp(string a, string b){
	if(a.size() == b.size()) return a < b;
	return a.size() < b.size();
}

int main(){
	cin >> n;
	for(int i = 0; i < n; i++){
		cin >> s;
		ret = "";
		for(int j = 0; j < s.size(); j++){
			if(s[j] < 65) ret += s[j];
			else if(ret.size()) check();
		}
		if(ret.size()) check();
	}
	sort(v.begin(), v.end(), cmp);
	
	for(auto i : v) cout << i << "\n";
	return 0;
}

정답 풀이

결과

후기

조금 집중해서 코딩하면 구현할 수 있을만한 내용이라 생각했다.
저번에 풀었던 비밀번호 발음하기 - 4659번와 비슷한 유형이었는데 구현은 설계가 정말 중요한것 같다.
첫 번째 접근법은 숫자 판별이 핵심이라 생각하여 숫자 판별 함수를 만들었고
두 번째 접근법은 0을 제거하는 것이 핵심이라 생각하여 0을 제거하는 함수를 만들었다.
구현 난이도 자체는 크게 다르지 않았지만 결과는 달랐다.
문제를 해결하는데 핵심적인 key가 무엇인지를 잘 파악해야함을 배웠다.

0개의 댓글