https://school.programmers.co.kr/learn/courses/30/lessons/160586
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
하나의 자판 버튼을 몇번 누르느냐의 따라 문자가 바뀐다.
targets에 문자열이 여러개 주어졌을때 가장 최소로 자판을 눌러서 targets 문자열을 만들어야한다.
자판을 누른 횟수 배열을 반환하면 된다.
keymaps 에는 ["ABACD", "BCEFD"] 이런 문자열 배열이 있다면 2개의 자판 버튼이 있는 것이고 첫번째 버튼을 한번 누르면 A, 두번 누르면 B, 세번 누르면 A, 네 번 누르면 C를 만들 수 있다.
풀이
1. keymaps를 다 방문하여 A부터 Z까지 최소 몇 번 눌러야 작성할 수 있는지 abc에 저장해준다.
abc[0]에는 A를 만들기 위해 눌러야하는 최소 개수, abc[25]에는 Z를 만들기 위해 눌러야하는 최소 개수가 저장된다.
2. targets를 검사하면서 각 문자열을 만들기 위해 눌러야하는 최소 개수를 계산한다. 자판으로 만들수 없는 알파벳은 abc배열에 1000이 저장되어 있기 때문에 abc[targets[i][j]-'A']==1000라면 answer에 -1을 저장해준다.
#include <string>
#include <vector>
using namespace std;
int abc[26];
vector<int> solution(vector<string> keymap, vector<string> targets) {
vector<int> answer;
for(int i=0;i<26;i++)
{ abc[i]=1000; }
for(int i=0;i<keymap.size();i++){
for(int j=0;j<keymap[i].length();j++){
if(j+1<abc[keymap[i][j]-'A'])
{
abc[keymap[i][j]-'A']=j+1;
}
}
}
for(int i=0;i<targets.size();i++){
int cnt=0;
bool is_exist=false;
for(int j=0;j<targets[i].length();j++){
if(abc[targets[i][j]-'A']==1000)
{
answer.push_back(-1);
is_exist=true;
break;
}
cnt+=abc[targets[i][j]-'A'];
}
if(!is_exist)
answer.push_back(cnt);
}
return answer;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 타겟넘버 c++ (0) | 2023.09.28 |
---|---|
[프로그래머스] 교점에 별 만들기 c++ (0) | 2023.09.26 |
[프로그래머스] 소수 만들기 c++ (0) | 2023.09.26 |
[프로그래머스] 2022 KAKAO TECH INTERNSHIP - 성격 유형 검사하기 (0) | 2023.09.21 |
[프로그래머스] 이진 변환 반복하기 c++ (0) | 2023.05.14 |