일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Inventory
- 알고리즘
- Unity3d
- 해시
- FSM
- 언리얼엔진
- 내일배움캠프
- 유니티
- 워크플로
- 스파르타내일배움캠프TIL
- 스택
- UnrealEngine
- BFS
- Firebase
- Unity2D
- unityui
- 순열
- 유클리드호제법
- QueryDSL
- UE4
- Unity
- 프로그래머스
- 포톤
- Photon
- 이분탐색
- 구현
- 스파르타내일배움캠프
- C++
- 문자열
- c#
Archives
- Today
- Total
개발 낙서장
[프로그래머스][재귀][JAVA] 카드 뭉치 본문
문제 제목
https://school.programmers.co.kr/learn/courses/30/lessons/159994
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 방법
처음엔 되게 간단하게 생각했다.
left, right 인덱스를 나누어 cards1과 goal의 문자열이 같으면 left++, cards2와 goal의 문자열이 같으면 right++ 해주면서 차례차례 탐색해주는 방식으로 진행했는데 코드를 제출해보니 몇몇 테스트 케이스에서 실패가 나왔다.
그 이유를 고민해보니 모든 경우를 탐색하지 않아서 그런 것 같았다.
cards1 | i | want | coffee | ||
cards2 | want | to | |||
goal | i | want | to | want | coffee |
대충 이런 예제가 있다고 해보자.
내가 기존에 생각한 방법대로 풀면
- 먼저 cards1을 탐색해 i를 찾아낸다.
- 또 cards1을 탐색해 want를 찾아낸다.
- 그 다음 cards1을 탐색했지만 coffee와 to가 일치하지 않으므로 cards2로 넘어가 탐색했는데 역시 want와 to가 일치하지 않으므로 No라는 결과가 나오게 된다.
근데 cards1 -> cards2 차례로 탐색하는 것이 아니라 cards1도 탐색하고 cards2도 탐색하는 방식으로 풀면
- cards1을 탐색해 i를 찾아내고 cards2에서는 일치하지 않으므로 넘긴다.
- cards1을 탐색해 want를 찾아내고 cards2에서도 want를 찾아낸다.
- cards1을 먼저 탐색한 경우에서는 to를 찾아낼 수 없으므로 탐색을 종료한다
- cards2를 탐색한 경우에서는 to를 찾아낸다.
- 이후 want, coffee 모두 찾아내 Yes라는 결과가 나온다
말로 표현을 잘 못해서 해설이 중구난방 횡설수설이지만 중요한 건 모든 경우의 수를 탐색하는 것이 중요하다는 것이다.
그래서 나는 재귀 함수를 사용했다.
소스 코드
더보기
class Solution {
String[] cards1_global;
String[] cards2_global;
String[] goal_global;
public String solution(String[] cards1, String[] cards2, String[] goal) {
String answer = "No";
cards1_global = cards1;
cards2_global = cards2;
goal_global = goal;
int left = 0;
int right = 0;
int index = 0;
if(CheckCards(left, right, index)) {
answer = "Yes";
}
return answer;
}
public boolean CheckCards(int left, int right, int index) {
if (index == goal_global.length) {
return true;
}
if(left == cards1_global.length) {
if(!cards2_global[right].equals(goal_global[index])) {
return false;
}
}
else if(right == cards2_global.length) {
if(!cards1_global[left].equals(goal_global[index])) {
return false;
}
}
else {
if(!cards2_global[right].equals(goal_global[index]) && !cards1_global[left].equals(goal_global[index])) {
return false;
}
}
if(left < cards1_global.length && right < cards2_global.length) {
return (CheckCards(left + 1, right, index + 1) || CheckCards(left, right + 1, index + 1));
}
else if(left < cards1_global.length && right == cards2_global.length) {
return CheckCards(left + 1, right, index + 1);
}
else if(left == cards1_global.length && right < cards2_global.length) {
return CheckCards(left, right + 1, index + 1);
}
else {
return false;
}
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스][Java][효율성] 기사단원의 무기 (0) | 2024.01.12 |
---|---|
[프로그래머스][정렬][JAVA] 과일 장수 (0) | 2024.01.09 |
[프로그래머스][알고리즘][JAVA] 2016년 (0) | 2024.01.03 |
[프로그래머스][자료구조][JAVA] 명예의 전당 (1) (0) | 2024.01.02 |
[프로그래머스][수학][JAVA] 콜라 문제 (0) | 2023.12.28 |
Comments