[Study] lv.1 푸드 파이트 대회 (67%)

ayboori·2023년 8월 2일
0

Java Study

목록 보기
22/34

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/134240

풀이 로직

  1. i번째 음식 / 2 만큼 StringBuilder에 부착
  2. 0 부착
  3. 거꾸로 부착

내가 작성한 풀이

class Solution {
    public String solution(int[] food) {
        StringBuilder sb = new StringBuilder();
        
        // i번째 음식의 크기만큼 루프를 돌며
        for(int i = 1; i<food.length; i++){
        	// i번째 음식의 갯수 / 2 만큼 StringBuilder에 부착
            for(int j = 0 ; j < food[i]/2 ; j++){
                sb.append(i);       
            }
        }
        
        // 가운데에 0 부착
        sb.append(0);
        
        // 루프를 거꾸로 돌며
        for(int i = food.length-1; i > 0; i--){        
        	// i번째 음식의 갯수 / 2 만큼 StringBuilder에 부착
            for(int j = 0 ; j < food[i]/2 ; j++){
                sb.append(i);
            }
        }
        
        // String으로 반환 후 리턴
        return sb.toString();
    }
}

실행 시간

0.03ms ~ 2.16ms

테스트 1 〉	통과 (0.88ms, 78.8MB)
테스트 2 〉	통과 (0.61ms, 76.3MB)
테스트 3 〉	통과 (0.56ms, 82.6MB)
테스트 4 〉	통과 (0.99ms, 77.6MB)
테스트 5 〉	통과 (0.34ms, 72.1MB)
테스트 6 〉	통과 (0.66ms, 74.4MB)
테스트 7 〉	통과 (0.98ms, 78.1MB)
테스트 8 〉	통과 (0.72ms, 74.1MB)
테스트 9 〉	통과 (0.75ms, 75.8MB)
테스트 10 〉	통과 (0.76ms, 69.6MB)
테스트 11 〉	통과 (0.03ms, 71.4MB)
테스트 12 〉	통과 (0.05ms, 77.6MB)
테스트 13 〉	통과 (0.03ms, 79.3MB)
테스트 14 〉	통과 (2.16ms, 78.9MB)
테스트 15 〉	통과 (0.05ms, 72.3MB)
테스트 16 〉	통과 (0.09ms, 71.9MB)
테스트 17 〉	통과 (0.03ms, 73.3MB)
테스트 18 〉	통과 (0.05ms, 72.2MB)
테스트 19 〉	통과 (0.03ms, 77.5MB)
테스트 20 〉	통과 (0.06ms, 76.9MB)

Stack을 이용한 풀이

거꾸로 꺼낸다 > Stack이 생각나서 풀이해보았다!

import java.util.Stack;

class Solution {
    public String solution(int[] food) {
        StringBuilder sb = new StringBuilder();
        Stack<Integer> stack = new Stack<>();
        
        // StringBuilder에 부착 시 stack에도 값 넣기
        for(int i = 1; i<food.length; i++){
            for(int j = 0 ; j < food[i]/2 ; j++){
                sb.append(i);       
                stack.push(i);
            }
        }
        
        sb.append(0);
        
     	// Stack 크기 미리 지정
        int size = stack.size();
        
        // 거꾸로 꺼내면서 StringBuilder에 부착
        for(int i = 0 ; i < size; i++){
            sb.append(stack.pop());
        }       
        
        return sb.toString();
    }
}

실행 시간

테스트 1 〉	통과 (2.81ms, 74.4MB)
테스트 2 〉	통과 (2.08ms, 74.6MB)
테스트 3 〉	통과 (1.97ms, 77.8MB)
테스트 4 〉	통과 (2.60ms, 73.4MB)
테스트 5 〉	통과 (1.11ms, 72.7MB)
테스트 6 〉	통과 (2.42ms, 77.3MB)
테스트 7 〉	통과 (2.34ms, 78.1MB)
테스트 8 〉	통과 (2.47ms, 74.9MB)
테스트 9 〉	통과 (1.38ms, 77.7MB)
테스트 10 〉	통과 (1.54ms, 76MB)
테스트 11 〉	통과 (0.20ms, 75.4MB)
테스트 12 〉	통과 (0.21ms, 77.6MB)
테스트 13 〉	통과 (0.18ms, 73.9MB)
테스트 14 〉	통과 (3.57ms, 73.7MB)
테스트 15 〉	통과 (0.21ms, 77.4MB)
테스트 16 〉	통과 (0.19ms, 76.4MB)
테스트 17 〉	통과 (0.22ms, 79.4MB)
테스트 18 〉	통과 (0.14ms, 74.4MB)
테스트 19 〉	통과 (0.13ms, 72.1MB)
테스트 20 〉	통과 (0.27ms, 76.6MB)

다른 사람의 풀이

class Solution {
    public String solution(int[] food) {
        String answer = "0";

        for (int i = food.length - 1; i > 0; i--) {
            for (int j = 0; j < food[i] / 2; j++) {
            // 자기 자신 앞뒤로 i 부착
                answer = i + answer + i; 
            }
        }

        return answer;
    }
}

i를 앞뒤로 붙이는 방법을 사용했다!

다른 사람의 풀이 2

class Solution {
    public String solution(int[] food) {
        StringBuilder builder = new StringBuilder();
        
        for (int i=1 ; i<food.length ; i++) {
            int result = food[i] / 2;
            // repeat을 활용해 n번 반복하여 부착
            builder.append(String.valueOf(i).repeat(result));
        }
        
        String answer = builder + "0";
        return answer + builder.reverse(); // sb를 뒤집어서 부착하는 함수
    }
}

String repeat

참고
문자열a = 문자열.repeat(반복횟수)

StringBuilder.reverse()

참고
문자열a = 문자열.reverse()

profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글