Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 정처기
- 자료구조
- 프로그래머스
- 인프런
- CS
- 자바
- java
- MySQL
- 알고리즘
- 카카오코테
- groupby
- 안드로이드
- SQL
- select
- 기술면접
- 티스토리챌린지
- 혼공단
- 스터디
- Android
- 코틀린
- 정보처리기사
- 혼공파
- join
- 코테
- 혼공챌린지
- 안드로이드스튜디오
- Til
- Kotlin
- doitandroid
- 오블완
Archives
- Today
- Total
Welcome! Everything is fine.
[프로그래머스/Lv.1] 카드뭉치 - Java 본문
728x90
📌 문제
📌 풀이
카드 뭉치의 순서대로 단어 배열을 만들 수 있는지 확인하는 문제이다. 나는 ArrayList 2개를 이용하여 풀었는데, 다른 사람들의 코드를 보니 그냥 주어진 배열로도 풀 수 있고, 큐를 사용한 답안도 있었다.
내가 푼 방식에 대해 설명하자면, ArrayList를 2개 만들고 각각의 리스트에 cards1, cards2 배열을 옮겨 담았다. 그리고나서 goal 배열을 돌면서 goal[i] 번째 요소가 cards1과 cards2에 순서대로 있는지 확인한다. 여기서 for문을 2개를 만들어 각각 돌았는데 ArrayList를 이용한 다른 코드를 보니 굳이 안돌아도 되는 것이었다..🙄 if - else if - else 문으로 적절하게 조건을 나눠주면 된다. 다른 답안을 보고 고친 답안으로 설명하자면 다음과 같다.
- arr가 비어있지 않고, arr의 0번째 요소가 goal[i] 번째와 같다면
- arr의 0번째 요소를 지운다.
- arr2가 비어있지 않고, arr2의 0번째 요소가 goal[i] 번째와 같다면
- arr2의 0번째 요소를 지운다.
- 위 2가지 경우에 해당하지 않으면 answer에 "No"를 넣은 후 빠져나온다.
📌 전체 코드
처음 작성한 답안
처음 작성한 답안도 정답이기는 했지만, 좀 더 간단하게 작성할 수 있을 것 같다.
import java.util.ArrayList;
class Solution {
public String solution(String[] cards1, String[] cards2, String[] goal) {
String answer = "Yes";
ArrayList<String> arr = new ArrayList<>();
ArrayList<String> arr2 = new ArrayList<>();
for (int i = 0; i < goal.length; i++) {
arr.add(goal[i]);
arr2.add(goal[i]);
}
for (int i = 0; i < goal.length; i++) {
for (int j = 0; j < cards1.length; j++) {
if (goal[i].equals(cards1[j])) arr.remove(goal[i]);
}
for (int k = 0; k < cards2.length; k++) {
if (goal[i].equals(cards2[k])) arr2.remove(goal[i]);
}
}
for (int i = 0; i < arr.size(); i++) {
if (!cards2[i].equals(arr.get(i))) answer = "No";
}
for (int i = 0; i < arr2.size(); i++) {
if (!cards1[i].equals(arr2.get(i))) answer = "No";
}
return answer;
}
}
다른 코드를 보고 고친 답안
새로 고친 답안은 ArrayList에 배열을 넣는 방식을 고친 점이나 for문을 개수를 줄인 점에서 가독성이 더 좋다.
import java.util.*;
class Solution {
public String solution(String[] cards1, String[] cards2, String[] goal) {
String answer = "Yes";
ArrayList<String> arr = new ArrayList<>(Arrays.asList(cards1));
ArrayList<String> arr2 = new ArrayList<>(Arrays.asList(cards2));
for (int i = 0; i < goal.length; i++) {
if (!arr.isEmpty() && arr.get(0).equals(goal[i])) {
arr.remove(0);
} else if (!arr2.isEmpty() && arr2.get(0).equals(goal[i])) {
arr2.remove(0);
} else {
answer = "No";
break;
}
}
return answer;
}
}
📌 다른 코드
다른 코드들을 보니 인덱스만을 이용해서 훨씬 간단하게 풀 수 있었다. 내가 for문을 마구 사용한 것도 cards1과 cards2의 길이가 다를 수 있기 때문이었는데, 각각의 인덱스를 만들어 놓고 사용한다면 그 문제를 해결할 수 있었다. 또한 다른 배열을 사용하는 것보다 시간도 빨랐다.
import java.io.*;
class Solution {
public String solution(String[] cards1, String[] cards2, String[] goal) {
int cardIdx1 = 0;
int cardIdx2 = 0;
for(int i=0; i<goal.length; i++){
String target = goal[i];
if(cardIdx1 < cards1.length && target.equals(cards1[cardIdx1]))
cardIdx1 ++;
else if (cardIdx2 < cards2.length && target.equals(cards2[cardIdx2]))
cardIdx2++;
else
return "No";
}
return "Yes";
}
}
'프로그래머스 > Lv.1' 카테고리의 다른 글
[프로그래머스/Lv.1] 2016년 - Java (0) | 2024.04.18 |
---|---|
[프로그래머스/Lv.1] 바탕화면 정리 - Java (0) | 2024.04.16 |
[프로그래머스/Lv.1] 개인정보 수집 유효기간(2023 KAKAO BLIND RECRUITMENT) - Java (0) | 2024.04.15 |
[프로그래머스/Lv.1] 달리기 경주 - Java (0) | 2024.04.12 |
[프로그래머스/Lv.1] 비밀지도(2018 KAKAO BLIND RECRUITMENT) - Java (0) | 2024.04.12 |