[프로그래머스] 대충 만든 자판

gcoco·2023년 5월 5일
0

안녕하세요! 밀린 숙제가 너무 많은 GCOCO 입니다!

뭔가...뭔가입니다!😂😂😂😀😂😂😂
게으르게 산 죄일까요 ?
막상 하나 둘 씩 밀린 과제와 개인 숙제들을 해결하고 있다보니 생각보다 양이 굉장히 많음을 뼈저리게 느끼고 있습니다!!

아아,,,,,,,GCOCO선수 쵸!!!!!!비!!!!!!!!상!!!!!!!!


잡설 한 COOKIE🍪

아무리 포스팅을 해야하고 바빠도? 잡설 쿠키 한 접 싀 해야죠,,
최근 졸업하시고 취업하신 선배님들의 직무특강들을 듣는다고 말씀드렸었습니다.
많은 직무특강을 들은것은 아니지만, 공통적으로 말씀해주셨던 부분은 바로..

자신만의 무기를 만드는 것이었습니다!

진짜로 전투에 사용하는 무기가 아닌 정말 스스로 부끄럼 없이 잘하고, 잘할 수 있다고 말할 수 있는.
자신만의 고유한 강점을 말하는 것이지요.

생각해보면 저는 저만의 강력한 장점이라고 말할 수 있는것이 있나 싶더군요.

누구보다 이것만큼은 굉장히 잘한다!

뭔가 드는 생각이 제가 하는것들 모두 그냥 다들 이정도는 하지 않나... 평범하지 않나... 라는 생각이 듭니다.

앗! 잘하는것이 있을지도 모르겠습니다!

그것은... 혼자서도 잡설 한 COOKIE🍪를 참 잘한다는 것이지요!😀😀😀

참 그리고 또 중요한 포인트를 말해주셨는데, 이것은 다음 쿠키에서 공개하도록 하겠습니다😎

가시죠. 본론으로!


문제링크:

이 문제는 keymap과 target이 주어지는데요, 즉 keymap 자판을 이용해 target을 만들수 있겠냐!
아니면 만들수있으면 키를 최소 몇 번 눌러야 하는지, 못만든다면 -1을 반환해라! 가 포인트입니다.

코드를 보실까욘~

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<string> keymap, vector<string> targets) {
    //정답반환용 벡터! 사이즈는 keymap의 사이즈만큼 할당~
    vector<int> answer(targets.size(),0);
    //만들기 가능한지 확인용 flag
    bool check;
    int z =0;//정답을 기록할 answer의 인덱스 변수
    //타겟을 순회
    for(auto i: targets){
        int count=0;
        //for문으로 타켓의 알파벳 하나씩 확인해보기
        for(auto j:i){
            int m=0;//keymap의 자판중 최소값을 기록하기 위한 변수
            check = false;
            //keymap을 순회하며 어떤 자판이 최소값인지 찾아보자
            for(auto k:keymap){
            	//keymap으로 target의 글자를 만들수 있다면
                if(k.find(j)!=string::npos){
                	//만들기 가능하다고 표시
                    check = true;
                    //자판을 몇번 눌러야 하는지
                    int a=k.find(j)+1;
                    if(m==0){
                        m=a;//처음엔 m에 대입
                    }
                    else{
                        m=min(m,a);//다른 자판에서도 찾을수 있다면 더 작은값을 사용
                    }
                }
            }
            //만들수 있는 알파벳이라면 정답에 넣어주기
            if(check){
                answer[z]+=m;
            }
            //못만드는 알파벳이라면 -1 넣어주기
            else{
                answer[z]=-1;
                break;
            }
        }
        //정답을 기록할 answer의 인덱스 증가
        z++;
    }
    return answer;
}

아이디어는 다음과 같습니다!

  1. target vector를 하나씩 순회한다.
  2. for문을 이용해, target의 글자를 하나씩 순회한다.
  3. 해당 target의 하나의 글자가 만들수 있는 글자인지 확인하기 위해 keymap을 순회한다.
  4. 만들수 있다면 몇번 눌러야 하는지 기록한다.
  5. 이때 keymap의 여러 자판들 중에서 최소값을 찾아 m에 기록한다.
  6. 만들수 있는 글자라면, answer vector에 누적해서 m값을 더해준다.
  7. 만들수 없는 글자가 나온다면, answer vector에 -1을 대입, 바로 순회를 종료하고 다음 target으로 넘어간다.

이 정도가 되겠습니다!

정말 제목 그대로, 대충 만든 자판인것 같습니다.
새삼 원하는 글자를 찾아 한번만 탁 누르면 되는 키보드가 참 편리하다고 느껴지네요 😄😀😁

이상입니다!

profile
그코코 입니다.

0개의 댓글