상세 컨텐츠

본문 제목

softeer : 비밀메뉴2

코테준비/하루한개도전~

by 움바둠바 2024. 9. 18. 15:21

본문

728x90

https://softeer.ai/class/devcrew/study/resource/detail/description/6259?id=280&resourceId=328

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

[21년 재직자 대회 본선] 비밀 메뉴2 난이도 3 단계 참가자 7 명 제출 14 명 정답률 50.00 % 언어별 시간/메모리 언어별 시간/메모리 표 언어 시간 메모리 JavaScript 2초 1024MB C 1초 1024MB C++ 1초 1024MB Java 2

softeer.ai

 

오늘도 열심히 삽질끝에 3일만에 해결했다!!!ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

비밀메뉴1을 string의 find(contain)을 이용해서 풀었던 기억을 바탕으로 해결하려 했지만... 못했다!!

일단 k의 범위가 늘어나서 냅다 수열을 string으로 보고 풀면 안되었고

    (10 22 33 이랑 10 2 2 3 3 이랑... string으로 만들면 똑같음)

뭔가,,, 이유가 있지 않을까?? 길이면에서 그런가?

n하고 m의 범위가 작지만 k의 범위가 늘어나서 이걸 연결해서 string하나로 보면 엄청엄청 길어질것같긴하다!

 

아무튼 그래서 이게뭔가,,, 했는데 LCS로 해결하는 문제였다

https://usowelcome.tistory.com/116

 

LCS : Longest common subsequence / substring

subsequence : 최장 공통 부분 수열 == 즉 연속이 아니어도 순서만 맞으면됨substring : 최장 공통 부분 무자열 == 무조건 연속이어야 한다!! 기본적으로 DP를 이용해서,, 해결한다.  ABCDCCDA 라는 두개의

usowelcome.tistory.com

작년에 알고리즘 수업 dp파트에서 배웠던 기억이 있는데,,,

완전 까먹고 있었다!!ㅋㅋㅋㅋ

아무튼 이번기회에 복습할 수 있었으니 오히려조아~~~ 럭키취준생이잔앙

 

그냥 LCS를 그대로 구현하면 되는 문제였다ㅎㅎㅎㅎ

다만 sequence가 아니라 string으로 봐야했을뿐!! (연속되어야 하니까)

 

#include<iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;


int n, m, k;

int main(int argc, char** argv)
{
    cin >> n >> m >> k;
    vector<int> str1;
    vector<int> str2;
    for(int i = 0; i<n; i++){
        int temp;
        cin >> temp;
        str1.push_back(temp);
    }
    for(int i = 0; i<m; i++){
        int temp;
        cin >> temp;
        str2.push_back(temp);
    }

    vector<vector<int>> dp(n+1, vector<int>(m+1, 0)); //[i][j]     index 1부터 시작하도록
                  // i : str1
                   // j : str2

    int answer = 0;

    for(int i = 1; i<=n; i++){
        for(int j = 1; j<=m; j++){
            if(str1[i-1] == str2[j-1]){
                dp[i][j] = dp[i-1][j-1] + 1;
            }else{
                dp[i][j] = 0;
            }
            answer = max(answer, dp[i][j]);
        }
    }


    cout << answer;
    
   return 0;
}

 

answer같은 경우는 dp를 완성하고 마지막에 구할 수 있었지만

난 그냥 저렇게 같이 구하고싶었당ㅎ

 

그리고 이렇게 길이숫자만 필요하다면...

dp배열을 저렇게 n*m 전체를 할게 아니라, 2*m으로 해서 당장 필요한 두줄만 써서 공간절약을 할 수도 있을것이다!

 

아무튼... 해결했으니까 다행이야~~

728x90

'코테준비 > 하루한개도전~' 카테고리의 다른 글

softeer : 코딩 테스트 세트  (1) 2024.10.03
softeer : 거리합 구하기  (0) 2024.09.27
백준 : 22942 - 데이터 체커  (1) 2024.09.17
백준 : 2493 - 탑  (0) 2024.09.17
softeer : 로드 밸런서 트래픽 예측  (2) 2024.09.14

관련글 더보기