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;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [1차] 캐시 c++ (0) | 2023.01.06 |
---|---|
[프로그래머스] Lv. 1 로또의 최고 순위와 최저 순위 c++ (0) | 2023.01.03 |
[프로그래머스] 디펜스 게임 c++ (0) | 2023.01.01 |
[프로그래머스] 두 큐 합 같게 만들기 c++ (0) | 2022.12.08 |
[프로그래머스] 문자열 압축 c++ (0) | 2022.12.03 |