본문 바로가기
프로그래머스 C++/Level.0

프로그래머스 C++ Level. 0 배열의 유사도

by yeni_0224 2023. 4. 10.
728x90
반응형

두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.

#include <string>
#include <vector>

using namespace std;

int solution(vector<string> s1, vector<string> s2) {
    int answer = 0;
    vector<string> a = s1.size() <= s2.size() ? s1 : s2;
    for(int i = 0; i < a.size(); i++){
        s1[i] == s2[i] ? answer++ : return;
    }
    return answer;
}

처음에 작성했던 식이다.

요즘 삼항연산자식을 사용하는 것이 매우 흥미로워서 이번엔 이렇게 작성해보았다. 하지만 답은 틀렸다. 틀릴만 하다. 사실 이중 for문을 사용하는 것을 지양해보고자 했다. 그 이유는 정말 별거없다. 예전에 프로그래머스 풀 때 이중 for문을 사용했다가 연산 갯수?가 너무 많아 통과되지 못했다는 글을 봤기 때문이다. 어차피 이중 for문 써도 안될텐데 다른 방법을 생각해봐야겠다. 라고 생각했지만 크나 큰 오산이었다. 나의 코딩 공부를 도와주시는 요정님께서 힌트로 이중for문을 말씀하셨기 때문이다. 허허허허..

 

이중for문을 고민하며 적었던 식을 싹 머릿속에서 지우고 처음부터 다시 생각해주었다.

1. s1 원소 하나와 s2의 원소 하나를 s2의 갯수만큼 비교해준다
2. 이 행위를 s1 원소 갯수만큼 반복해준다

 

생각해보니 두 배열의 사이즈를 비교하는 변수를 만들었던 이유는 이중for문을 쓰지 않게 하기 위함이었기 때문에 필요가 없어져서 지웠다. 역시 글로 직접 적으면서 정리해주니까 조금씩 문제가 풀린다.

#include <string>
#include <vector>

using namespace std;

int solution(vector<string> s1, vector<string> s2) {
    int answer = 0;
    for(int i = 0; i < s1.size(); i++){
        for(int j = 0; j < s2.size(); j++){
            if(s1[i] == s2[j]){
             answer++;   
            }            
        }        
    }
    return answer;
}

다른 사람들의 풀이도 봐보자

#include <string>
#include <vector>
#include <set>

using namespace std;

int solution(vector<string> s1, vector<string> s2) {
    int answer = 0;
    set<string> s3(s1.begin(), s1.end());
    for(int i = 0; i < s2.size(); i ++)
    {
        if(s3.find(s2[i])!=s3.end())
        {
            answer++;
        }
    }


    return answer;
}

find 함수라는 것도 있나보다 세상에

#include <string>
#include <vector>

using namespace std;

int solution(vector<string> s1, vector<string> s2) {
    int answer = 0;
    for(const auto v : s1)
    {
        for(const auto v2 : s2)            
        {
            if( v==v2)
            {
                answer++;
            }
        }
    }
    return answer;
}

: 연산자에 적응하는거 노력해야겠다. 이렇게 간단해질수가..

#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<string> s1, vector<string> s2) {
    int answer = 0;
    for (auto i : s1)
        if (find(s2.begin(), s2.end(), i) != s2.end())
            answer++;
    return answer;

역시 활용하기 나름이다. find 함수에 begin, end 함수까지 같이 사용해주면서...쓰니까 이렇게 단순할수가.. 

역시 늦게 코딩공부를 시작한 만큼 알아가야할게 태산이다.

#include <string>
#include <vector>
#include <map>

using namespace std;

int solution(vector<string> s1, vector<string> s2)
{
    int answer=0;
    map<string,int> m;
    for(string e : s1) m[e]++;
    for(string e : s2) m[e]++;
    map<string,int>::iterator it;
    for(it=m.begin(); it!=m.end(); it++)
        if((*it).second==2) answer++;
    return answer;
}

이 답안은 너무너무 깔끔한것같다. 진짜 잘하면 식 길이가 그렇게 길지도 않고

한줄 한줄 딱 깔끔하게 정리된다고 했다.

참 to the 고

#include <string>
#include <vector>

using namespace std;

int solution(vector<string> s1, vector<string> s2) {
    int answer = 0;
    for(auto c : s1) for(auto s : s2) c == s ? answer++ : 0;
    return answer;
}

키야..... 깔 끔하다

 

이렇게 감탄하며 이번 포스트 마무리

노션으로 언리얼엔진 공부 내용을 정리하고 있는데

옮기려면 정말 오랜 시간이 걸릴 것 같다...

세상에나..

T스토리의 치명적인? 단점? 사실 내가 검색을 해봐야겠지만

노션처럼 바로바로 단축키 사용해서 코드블럭 생성할 수 있지가 않더라. 현재 내가 알고 있는 범위 내에선.

꼭 단축키가 있길 바라며... 검색해서 알아내고만다...

728x90
반응형