본문 바로가기
알고리즘/프로그래머스

[프로그래머스] Lv2 튜플

by 오오오니 2023. 1. 1.

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

처음에 문제를 잘못 읽어서 나온 숫자만 중복을 제외해서 반환하면 되는 줄 알았다.

두 번째도 문제를 잘못 읽어서 나온 순서대로 중복을 제외해서 반환하면 되는 줄 알았다.

다시 한번 자세하게 읽어보니까

첫번쨰 원소, 첫번째 원소+ 두번째 원소....

만약에 튜플의 개수가 5개면 a1은 5번 a2는 4번 an은 1번 들어간다.

*문제를 꼼꼼히 읽자.

풀이

1.문자열중에서 숫자를 문자열로 추출하기

2. 추출한 문자열을 int 형으로 바꾸기

3. 나온 숫자들의 개수를 인덱스를 이용하여 저장    arr[2]++;
    ex) for 문을 돌 동안 2가 5번 나오면 arr[2]=5;가 된다.

4. answer 벡터의 '튜플의 개수-나온개수' 번째의 원소를 넣어준다.
   ex) 튜플의 개수가 5개이고 2가 5번, 3이 4번, 1이 3번, 7이 2번, 9가 1번 나오면
       answer[5-5]=2; answer[5-4]=3;  answer[5-3]= 1; ....이 된다.

(string을 int로 바꾸어줄때 stoi를 쓰거나 temp의 길이를 이용해서 할 수 있는데 (ex)  4253의 길이 4,   10^3*4 + 10^2*2 ....)

그러면 cstring이나 cmath헤더가 필요해서 그냥 위에 for문 돌때 각 자리수에 곱할 숫자를 계산해주었다.

계산해주고 10씩 나누어서 다음 자리수에 곱해서 더하면 int형으로 바뀐다.)

어렵지는 않았지만 복합적으로 생각할 것이 많은 문제였다.

#include <string>
#include <vector>
#include<iostream>

using namespace std;
 int arr[100002];
vector<int> solution(string s) {
   
   
    int size=s.size();
    string temp="";
    int m=1;
    int ansSize=0;
    for(int i=0;i<size;i++)
    {
        if(s[i]>='0'&&s[i]<='9')//숫자부분 추출
        {   
            temp+=s[i];
            m*=10;//1, 10, 100,1000 
        }
        else
        {
            if(s[i]=='}')
                ansSize++;
            if(temp.size()>0)
            {
               
                //int로 바꾸기
                int num=0;
                m/=10;
                for(int i=0;i<temp.size();i++)
                {
                    num+=((temp[i]-'0')*m);
                    m/=10;
                }
              
                arr[num]++;//몇번 나왔는지 체크
                m=1;
                temp="";
                
            }
        }
        
      
       
    }
    ansSize--;
    vector<int> answer(ansSize);
    
    for(int i=1;i<=100000;i++)
    {
        if(arr[i])
            answer[ansSize-arr[i]]=i;
    }
  
    return answer;
}