-
프로그래머스 연습 - 카드 뭉치 [C++]개발 일기/문제 일기 2023. 3. 25. 23:52728x90
티스토리 만들고 나름 컴공과라고...^^ 개발 일지를 쓰려고 백준을 켰습니다. 그렇게 대충 쉬운 문제 풀어 올려야지^^ 했다가 다 틀리고 멘탈이 털린 채 그만뒀었죠. 나름 실버 2인데 브론즈 2짜리 문제를? 틀린다? 제가 백준 실버의 수치입니다...
여튼 그렇게 짱나서 문제 안 풀어! 했다가 심심해서 푼 문제가 잘 맞았네요. 다행입니다. 백준 실버의 가오를 쪼끔이나마 챙겼습니다. 쉬운 문제인 거 맞지만 여하튼 맞은 건 맞은 겁니다.
카드뭉치
https://school.programmers.co.kr/learn/courses/30/lessons/159994
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 요약
문제를 간략히 요약해보자면, 두 카드 뭉치(cards1, cards2)가 쌓여있는데 가장 앞에 있는 단어만을 사용할 수 있다고 가정했을 때 주어진 문장(goal)을 만들 수 있을까?입니다. 예를 들자면
cards1의 단어들 -> "b" "c"
cards2의 단어들 -> "a" "k"
goal의 단어들 -> "b" "a" "c" "k"
일 때, goal의 단어로 만들 수 있을까? 입니다. 문제는 가장 앞에(왼쪽) 있는 단어만 사용할 수 있다는 거죠. 이 예시 같은 경우
(cards1는 c1, cards2는 c2)
c1 -> c2 -> c1 -> c2
순서로 하면 됩니다. 그런데 goal의 단어들이 "b" "k" "a" "c" 라면 곧바로 c2의 c 전에 k를 사용할 수 없으니 불가능합니다. 그러면 어떻게 풀 수 있을까요?
2. 풀이 방법
알고리즘을 간단히 설명해보자면 goal의 가장 앞에 있는 단어가 c1이나 c2에 있으면 그다음 단어로 넘어가는 형식을 선택했습니다. 다음 단어로 넘어가게 하는 방식은 인덱스 +1을 하거나, 아님 그 단어를 제거하는 방식이 있겠죠.
<인덱스 +1>
#include <string> #include <vector> using namespace std; string solution(vector<string> cards1, vector<string> cards2, vector<string> goal) { // 일단 가능하다고 가정함 string answer = "Yes"; // 현재 구하는 or 현재 가장 앞에 있는 단어의 인덱스 // c1 = cards1, c2 = cards2, g = goal int c1 = 0, c2 = 0, g = 0; while(1){ // g가 goal의 끝까지 갔다면 남은 단어가 없으므로 빠져나옴 if(g == goal.size()){ break; } // 아직 끝이 아니라면 else{ // goal의 단어가 cards1에 있다면 if(goal[g] == cards1[c1]){ // g와 c1을 하나 늘림 g++; c1++; } // cards1에 없고 cards2에 있다면 else if(goal[g] == cards2[c2]){ // g와 c2을 하나 늘림 g++; c2++; } // 둘 다 없다면 만들 수 없음 else{ answer = "No"; break; } } } return answer; }
근데 이거 큐 방식으로도 풀 수 있지 않을까요? 가장 먼저 들어온 걸 제외한다는 방식으로 한다면 큐로 할 수 있을 것 같습니다. 언젠가 기력이 있다면 해보는 걸로... ^^b
728x90'개발 일기 > 문제 일기' 카테고리의 다른 글
[백준 25206] 너의 평점은 [C++] (0) 2024.01.10 [백준 15649] N과 M(1) [C++] (0) 2023.07.06 [백준 27982] 큐브 더미 [C++] (0) 2023.06.20 [백준 1003] 피보나치 함수 [C++] (0) 2023.05.20 [백준 2775] 부녀회장이 될테야 [C++] (0) 2023.05.10