늦은 프로그래밍 이야기

230125 TIL (KPT회고, 알고리즘) 본문

내일배움캠프/TIL, WIL

230125 TIL (KPT회고, 알고리즘)

한정규 2023. 1. 25. 21:18

KPT 회고

오늘 1주일과 연휴까지 진행했던 팀프로젝트를 발표하고 KPT회고를 작성함으로써 이번 프로젝트가 완전하게 종료되었다. 프로젝트는 종료 되었지만, 프로젝트를 진행하면서 아쉬웠던 부분들을 리팩토링 해보아야 할 것이다.

KPT 회고

 

KPT 회고

Spring A반 4조 대박징조 KPT 회고

www.notion.so


알고리즘

푸드 파이트 대회

코딩테스트 연습 - 푸드 파이트 대회

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://github.com/jk891113/java-algorithm/blob/main/src/main/java/foodfight/Solution.java

 

GitHub - jk891113/java-algorithm

Contribute to jk891113/java-algorithm development by creating an account on GitHub.

github.com

나의 풀이

처음 문제 예시만 보고 food의 길이가 4로 고정인줄 알고 food1~3 까지 하나하나 지정해 준뒤 3개의 반복문만 사용해서 코드를 작성하였는데 입출력 예시는 모두 맞았으나 정답을 확인 했을 때 10%만 맞고 모두 실패하였다.

public class Solution {
    public String solution(int[] food) {
        String answer = "0";
        int food1 = food[1];
        int food2 = food[2];
        int food3 = food[3];

        for (int i = 0; i < food3 / 2; i++) answer = "3" + answer + "3";
        for (int i = 0; i < food2 / 2; i++) answer = "2" + answer + "2";
        for (int i = 0; i < food1 / 2; i++) answer = "1" + answer + "1";
        return answer;
    }

그래서 다시 문제를 읽어보니 food의 길이는 2 ~ 9 였다. 오랜만에 풀어서 그런지 제한사항을 읽는 것을 깜빡하였다. 역시 알고리즘은 계속하여 꾸준히 조금씩 풀어야 하는 것 같다.

public 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++) answer = i + answer + i;
        }
        return answer;
    }

결국에는 이중 반복문은 쓰기 싫었지만, 이중 반목문을 사용해서 할 수 밖에 없었다. 첫번째 반복문은 가운데 0을 기준으로 마지막 음식부터 배치해야 하기 때문에 마지막 인덱스부터 1까지 반복해주었다. 두번째 반복문은 food의 i번째 인덱스에 있는 수량의 절반은 앞에 절반은 뒤에 둬야 하기 때문에 2로 나눠주었고, answer 앞뒤로 하나씩 놓아주며 반복하였다.

문제를 풀었지만 점수를 낮게 받아서 뭔가 다른 방법이 있을까 하고 다른 사람 풀이를 찾아보았다.

다른 사람의 풀이

거의 비슷한 방식의 풀이들이 많았는데 그 중 눈에 들어오는 풀이 방법이 한가지 있었다. StringBuilder를 사용한 방법이었다.

class Solution {
    public String solution(int[] food) {
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i < food.length; i++) {
            sb.append(Integer.toString(i).repeat(food[i] / 2));
        }
        return sb.toString() + "0" + sb.reverse();
    }

}

repeat 메소드를 사용하여 첫번째 부터 마지막 음식의 수를 반복하여 붙여주고 StringBuilder의 append 메소드를 사용하여 0의 앞부분을 만들어주고, reverse 메소드를 사용하여 뒤집은 문자열을 붙여주는 방식으로 작성을 한듯 하다.

왜 그럴까 고민하다가 동료 수강생과 함께 생각해 보면서 얻은 결론은 reverse 메소드는 sb에 저장되어 있는 데이터를 반전 시키는 것이고 sb를 호출하면 그 저장 되어 있는 데이터의 주소를 호출하기 때문에 reverse가 된 상태의 sb를 호출하게 되고, toString 메소드를 사용해주면 다른 주소에 sb에 있는 데이터를 옮겨 담고 reverse로 바꾼 sb와의 주소가 다르게 되어 반전이 안된 문자열을 가져오게 되는 것 같았다.


'내일배움캠프 > TIL, WIL' 카테고리의 다른 글

230127 TIL (알고리즘, 리팩토링)  (0) 2023.01.28
230126 TIL (알고리즘, 테스트코드)  (0) 2023.01.26
230124 TIL (Refresh Token, Redis)  (0) 2023.01.25
12주차 WIL  (0) 2023.01.23
230120 TIL (팀프로젝트)  (0) 2023.01.22
Comments