-
[프로그래머스/JAVA] 카드 뭉치Algorithm/Java 2024. 11. 24. 17:08
https://school.programmers.co.kr/learn/courses/30/lessons/159994
📌 문제 요약
코니는 두 개의 카드 뭉치를 사용해 원하는 단어 배열(goal)을 만들 수 있는지 확인하려고 합니다. 각 카드 뭉치의 카드는 순서대로만 사용할 수 있고, 한 번 사용한 카드는 다시 사용할 수 없습니다.
주어진 카드 뭉치와 단어 배열로 목표 배열을 만들 수 있으면 "Yes", 그렇지 않으면 "No"를 반환해야 합니다.
[ 오답 노트 ]
❌ 기존 오답 코드class Solution { public String solution(String[] cards1, String[] cards2, String[] goal) { String answer = ""; // 만약 goal[0]이 cards1이나 cards2의 원소와 같다면, for(int i = 0; i < goal.length; i++) { for(int j = 0; j < cards1.length; j++) { if(goal[i] == cards1[j]) { i = i + 1; }else { // 같지않다면 break; } } for(int z = 0; z < cards2.length; z++) { if(goal[i] == cards2[z]) { i = i + 1; }else { // 같지않다면 break; } } } if(goal[goal.length - 1] == cards1[cards1.length -1] || goal[goal.length - 1] == cards2[cards2.length -1]) { answer = "Yes"; }else { answer = "No"; } return answer; } }
📌 기존 코드의 문제점
1. cards1과 card2 배열 원소들을 각각 for문을 사용해 돌리는 부분을 효율적으로 바꿀 필요가 있다.
2. 기존 코드에서는 아래 if문만 가지고 답이 도출된다 즉, 위에 for문 부분은 주석 처리를 해도 아래처럼 결과가 나오므로 위에 for문의 로직 수정이 필요하다.
[ 정답 코드 & 올바른 풀이 ]
📌 올바른 풀이
1. 문자열 비교 방식 오류 수정
문자열 비교시 ==이 아닌 .equals()를 사용해야 한다. ==는 문자열의 값을 비교하는게 아니라, 주소를 비교하기 때문이다.
2. cards1과 cards2의 불필요한 중첩 반복문 제거
인덱스를 별도로 관리하여 순서대로 비교한다.
3. 로직 오류 해결
i는 반복문 외부에서 이미 관리되고 있는데 내부 중첩 반복문에서 이를 강제로 증가시키면 문제가 될 수 있으므로,
외부 반복문의 i를 별도로 변경하지 않고 카드 뭉치의 현재 위치를 별도로 추적하는 방식으로 수정한다.
📌 정답 코드
class Solution { public String solution(String[] cards1, String[] cards2, String[] goal) { int index1 = 0; // cards1의 인덱스 int index2 = 0; // cards2의 인덱스 for(int i = 0; i < goal.length; i++) { if(index1 < cards1.length && cards1[index1].equals(goal[i])) { index1++; }else if(index2 < cards2.length && cards2[index2].equals(goal[i])) { index2++; }else { return "No"; } } return "Yes"; } }
반응형'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/JAVA] 예상 대진표 (0) 2024.11.30 [프로그래머스/JAVA] 귤 고르기 (0) 2024.11.24 [프로그래머스/JAVA] 시저암호 (0) 2024.11.17 [백준/JAVA] 18311번 : 큰 수 구성하기 (0) 2024.11.10 [프로그래머스/JAVA] 점프와 순간 이동 (0) 2024.10.31