[프로그래머스] 12: 푸드 파이트 대회 | 콜라 문제 | 명예의 전당(1) | 2016년 | 카드 뭉치

서예진·2024년 1월 24일
0

목차 💻

▸ 푸드 파이트 대회
▸ 콜라 문제
▸ 명예의 전당(1)
▸ 2016년
▸ 카드 뭉치


💡 푸드 파이트 대회 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 푸드 파이트 대회

✓ 문제 이해
food = [1, 3, 4, 6] 이면, 물(0)이 1개, 1번 음식 3개, 2번 음식 4개, 3번 음식 6개

▼ 내 풀이

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;


class Solution {
    public String solution(int[] food) {
        String answer = "";
        int length = food.length;
        List<Integer> result = new ArrayList<>();
        
        for(int i = 1; i < food.length; i++){
            if(food[i]%2 == 1){
                food[i] = food[i] -1;
            }
            food[i] = food[i]/2;
        }
        
        int a = 1;
        
        for(int i = 1; i < food.length; i++){
            int n = food[i];
            for(int j = 0; j < n; j++){
                result.add(a);
            }
            a++;
        }
        
        List<Integer> combinedList = new ArrayList<>();
        combinedList.addAll(result);
        combinedList.add(0);
        
        Collections.reverse(result);
        
        combinedList.addAll(result);
        
        for(int i : combinedList){
            String s = String.valueOf(i);
            answer += s;
        }
        return answer;
    }
}
  • 우선 물을 제외하고 배열 내의 수를 짝수로 만들어야 한다.
  • 물인 0 전까지를 리스트에 저장하고 이를 거꾸로 뒤집어서 붙이는 방식으로 접근 했다.
  • 리스트를 합칠 때 새로운 리스트를 만들어 먼저 기존 리스트를 추가하고 0을 추가하고 기존 리스트를 거꾸로 정렬하여 추가했다.
  • 결과를 String으로 변환하기 위해 for문을 활용했다.

💡 콜라 문제 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 콜라 문제

▼ 내풀이

  • 문제를 보니 계속해서 a로 나누는 것처럼 보였다.
  • 우선, 주어진 빈 병의 수를 a로 나누었을 때 나머지를 다른 변수에 저장한다.
  • 계속해서 a로 나누는 연산을 거치면서 몫이 a보다 작으면 나누기 연산을 중지한다.
  • 나누기 연산을 하면서 몫을 answer에 더한다.
  • 그러면 나누기 연산이 중지되었을 때의 몫과 나머지를 더하고 한번 더 a로 나눈다.
  • 이렇게 만든 코드를 실행하니까 테스트 1,2는 통과됐지만 제출하니까 하나의 테스트를 제외하고 다 실패가 떴다.
[오답 코드]
class Solution {
    public int solution(int a, int b, int n) {
        int answer = 0;
        int remain = 0;
        
        while(a <= n){
            int temp = n/a;
            remain += n%a;
            answer += temp;
            n = temp;
        }
        if(n + remain >= a){
            answer += (n + remain)/a;
        }
        
        return answer;
    }
}
  • 코드를 다시 보니 내가 푼 방식은 b가 1인 경우, 즉 빈병 a개를 가져다주면 콜라 1병만 주는 경우이다. 따라서 그 부분을 수정했다.
  • 또한, 몫과 나머지를 더한게 다시 n이 되기 때문에 나머지를 다른 변수에 저장하는 방식은 적합하지 않았다.
[수정 코드]
class Solution {
    public int solution(int a, int b, int n) {
        int answer = 0;
        
        while(a <= n){
            int coke = (n/a)*b;
            int remain = n%a;
            answer += coke;
            n = coke + remain;
        }
        
        return answer;
    }
}

💡 명예의 전당(1) : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 명예의 전당(1)

▼ 내 풀이

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int[] solution(int k, int[] score) {
        int length = score.length;
        int[] answer = new int[length];
        
        List<Integer> scores = new ArrayList<>();
        List<Integer> minscore = new ArrayList<>();
        
        for(int i = 0; i < length; i++){
            scores.add(score[i]);
            if(scores.size() <= k){
                int min = Collections.min(scores);
                minscore.add(min);
            } else {
                Collections.sort(scores);
                List<Integer> sublist = scores.subList(scores.size()-k,scores.size());
                int min = sublist.get(0);
                minscore.add(min);
            }
            
        }
        for(int i = 0; i < answer.length; i++){
            answer[i] = minscore.get(i);
        }
        return answer;
    }
}
  • 우선, 가변적인 길이를 가진 리스트를 선택했다.
  • 리스트를 활용하여 for문을 돌면서 각 점수에 접근한다.
  • 값을 저장하고 if-else문을 활용하여 이 리스트의 사이즈가 k 이하인 경우와 아닌 경우를 나누었다.
  • k 이하인 경우는 리스트의 최솟값을 구하면 됐다.
  • k 초과인 경우에는 리스트를 오름차순으로 정렬하고 sublist를 k 크기에 맞게 만들어 0번째 값을 가져왔다.

💡 2016년 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 2016년

▼ 내 풀이

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        int[] lastday = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        
        if(a > 1){
            for(int i = 1; i < a; i++){
                b += lastday[i-1];
            }
        }
        
        int remain = b%7;
        switch(remain){
            case 0:
                answer = "THU";
                break;
            case 1:
                answer = "FRI";
                break;
            case 2:
                answer = "SAT";
                break;
            case 3:
                answer = "SUN";
                break;
            case 4:
                answer = "MON";
                break;
            case 5:
                answer = "TUE";
                break;
            case 6:
                answer = "WED";
                break;
        }
        
        return answer;
    }
}
  • 우선, 월마다 요일이 정해지는 것이 다르기 때문에 switch문을 선택했다.
  • 1월 1일은 금요일이므로 해당 날짜를 7로 나누었을 때, 1이면 금요일, 2이면 토요일,,,6이면 수요일, 0이면 목요일이다.
  • 또한, 날짜를 예를 들어 2월 5일이면 이 5를 31+5 = 36 으로 바꿔서 로직을 수행한다. 3월 4일이면 4 -> 31+29+4 = 64로 바꾸기.
  • 이렇게 바꾸는 건 2월부터 이므로 if문을 활용하여 조건을 걸었다.

💡 카드 뭉치 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 카드 뭉치

▼ 내 풀이

  • 일단 card1의 "i"를 가져오고 이것이 goal과 일치하는지 확인하는 방식으로 접근해야겠다고 생각했다.
  • 여기서 goal과 일치하는 부분까지 card1에서 가져오면 되겠다고 생각했다. 예를 들어 goal의 0번째 요소가 "i" 이므로 card1에서 "i"만 가져오면 된다.
  • 그럴려면 goal과 일치하는 것을 우선 card1에서 찾아야한다.
  • 이러한 방식으로 코드를 작성하고 싶었지만 너무 복잡하고 어려워서 goal에서 해당 문자열을 삭제하는 것은 어떨지 생각했다.
  • 3개의 배열을 리스트로 만들고 for문을 돌면서 goal과 일치하는 부분이 있으면 두 개의 리스트에서 모두 지운다. 이렇게 하면 지울 요소에 접근하기 위해서는 index 0으로 접근 가능하다.
  • 또한, if-else if 문을 통해서 cards1과 cards2로 경우를 나누었다.
[오류 코드]
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        String answer = "";
        int length = goal.length;
        📍List<String> removegoal = Arrays.asList(goal);
        📍List<String> cards1List = Arrays.asList(cards1);
        📍List<String> cards2List = Arrays.asList(cards2);
        
        
        for(int i = 0; i < length; i++){
            if(removegoal.get(0).equals(cards1List.get(0))){
                removegoal.remove(0);
                cards1List.remove(0);
            } else if(removegoal.get(0).equals(cards2List.get(0))){
                removegoal.remove(0);
                cards1List.remove(0);
            }
        }
        if(removegoal.size() != 0){
            answer = "No";
        } else {
            answer = "Yes";
        }
        
        return answer;
    }
}
  • 위와 같이 작성하여 실행을 돌리니 "java.lang.UnsupportedOperationException"라는 오류가 떴다.
  • 찾아보니, 수정할 수 없는 컬렉션에서 변경 작업을 수행하려고 할 때 발생하는 예외이다.
  • 따라서 수정하기 위해서는 Arrays.asList()된 리스트를 복사해서 작업해야했다. 위의 코드를 아래와 같이 수정했다.
		List<String> removegoal = new ArrayList<>(Arrays.asList(goal));
        List<String> cards1List = new ArrayList<>(Arrays.asList(cards1));
        List<String> cards2List = new ArrayList<>(Arrays.asList(cards2));
  • 또한, 리스트가 비어있는 경우 get을 해서 오류가 발생했다.
  • 따라서, if문에 리스트가 비어있는지 확인하는 조건문도 달았다.
[수정 코드]
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        String answer = "";
        int length = goal.length;
        List<String> removegoal = new ArrayList<>(Arrays.asList(goal));
        List<String> cards1List = new ArrayList<>(Arrays.asList(cards1));
        List<String> cards2List = new ArrayList<>(Arrays.asList(cards2));
        
        for(int i = 0; i < length; i++){
            if(!removegoal.isEmpty() && !cards1List.isEmpty() && removegoal.get(0).equals(cards1List.get(0))){
                removegoal.remove(0);
                cards1List.remove(0);
            } else if(!removegoal.isEmpty() && !cards2List.isEmpty() && removegoal.get(0).equals(cards2List.get(0))){
                removegoal.remove(0);
                cards2List.remove(0);
            }
        }
        if(removegoal.isEmpty()){
            answer = "Yes";
        } else {
            answer = "No";
        }
        
        return answer;
    }
}
profile
안녕하세요

0개의 댓글