2023. 10. 11. 22:02, 알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/120886
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int a[200];
int b[200];
int solution(string before, string after) {
for(auto c: before) a[c]++;
for(auto c: after) b[c]++;
for(auto c: before){
if(a[c]!=b[c]) return 0;
}
return 1;
}
등장배열을 따로 선언해서, 두 문자에 대해서 등장 배열에 대한 체크를 하고, 등장 배열의 수가 같은지를 비교하는 형태로 코드를 작성하였는데, 일단 먼저 생각난 방법에 대한 구현이어서 비효율적인 방향으로 설정했다는 생각이 드는 코드였다.
다른 사람의 풀이를 보니까 아주 깔끔하고 간결하게 푸는 풀이가 있어서 첨부해보겠다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(string before, string after) {
sort(before.begin(), before.end());
sort(after.begin(),after.end());
if(after == before) return 1;
else return 0;
}
sort() 를 통해서 순서를 정렬시키고,
그리고 정렬된 두 문자열이 서로 같다면, 동일한 글자들로 만들 수 있는 string 이기 때문에 return 1을 하는 형태의 코드인데
아주 깔끔하고 간결한것 같다. 마음에 드는 코드이다.
다음에는 이런식의 코드를 생각해서 풀어보도록 하자.
또는 map 자료구조를 통해서 문제를 해결하는 코드도 있었는데,
#include <string>
#include <vector>
#include <map>
using namespace std;
int solution(string before, string after) {
int answer = 0;
map<char, int> m1;
map<char, int> m2;
for(auto i: before) m1[i]++;
for(auto i : after) m2[i]++;
for(auto i : m1){
if(i.second!=m2[i.first])return 0;
}
return 1;
}
위와 같은 풀이도 짧고 간결한 코드라고 생각된다.
내가 풀이한 방식을 조금 더 타이트하게 만들어낸 풀이가 있어서 첨부해보면,
#include <string>
#include <vector>
using namespace std;
int solution(string before, string after) {
vector<int> b(26,0);
vector<int> a(26,0);
for(int i=0; i<before.size(); i++) {
b[(int)before[i] - 97]++;
a[(int)after[i] - 97]++;
}
for(int i=0; i<26; i++) {
if(b[i] != a[i]) return 0;
}
return 1;
}
이와 같은 형태로 작성한 풀이를 만들어낼 수 있을 것이다.
괜찮은 형태이다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Lv 0. 문자열 밀기. (0) | 2023.10.12 |
---|---|
Lv 0. k의 개수 (0) | 2023.10.12 |
Lv 0. 이진수 더하기. *다시 풀어보기* (0) | 2023.10.11 |
Lv 0. 치킨 쿠폰. *다시 풀어보기* (0) | 2023.10.11 |
Lv 0. 로그인 성공? (0) | 2023.10.11 |
Comments, Trackbacks