조건문 - 코드 처리하기

2dean·2023년 5월 27일
0

Algorithm

목록 보기
1/17
post-thumbnail

문제 1

문자열 code가 주어집니다.
code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.

mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.

  • mode가 0일 때
    - code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
    - code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.
  • mode가 1일 때
    - code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
    - code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.

문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.

단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.

틀렸던 코드

static String solution(String code) {
        String result = "";
        int mode = 0;
        char[] codeArr = code.toCharArray();


        for (int idx = 0; idx < codeArr.length; idx++) {

            System.out.println("mode : " + mode);
            if(mode == 0){
                 if (!"1".equals(codeArr[idx])) {
                     System.out.println("codeArr[idx] : " + idx +  " : "+ codeArr[idx]);
                     if(idx > 0 && idx % 2 == 0){
                         result += String.valueOf(codeArr[idx]);
                     }
                 } else if("1".equals(codeArr[idx])){
                      mode = 1;
                 }
            }
            if(mode == 1) {
                if (!"1".equals(codeArr[idx])) {
                   System.out.println("setMode 0 : " + mode);
                   if(idx % 2 != 0){
                       result += String.valueOf(codeArr[idx]);
                   }
               } else if("1".equals(codeArr[idx])){
                   mode = 0;
               }
            }
        }

        if (result.length() == 0) {
            return "EMPTY";
        } else {
            return result;
        }
    }

로직은 맞는 것 같은데 자꾸 오류가 나서 GPT에게 물어봤다

원인

GPT : 주어진 조건에 따라 문자열을 생성하는 방식에서 일부 오류가 있을 수 있습니다.
나 : 그렇구나.

(코드1) 수정한 코드

 String solution(String code) {
        String result = "";
        int mode = 0;
        char[] codeArr = code.toCharArray();
        for (int idx = 0; idx < codeArr.length; idx++) {
            if (mode == 0) {
                if (!"1".equals(String.valueOf(codeArr[idx]))) {
                    if (idx % 2 == 0) {
                        result += String.valueOf(codeArr[idx]);
                    }
                } else {
                    mode = 1;
                }
            } else if (mode == 1) {
                if (!"1".equals(String.valueOf(codeArr[idx]))) {
                    if (idx % 2 != 0) {
                        result += String.valueOf(codeArr[idx]);
                    }
                } else {
                    mode = 0;
                }
            }
        }
        if (result.length() == 0) {
            return "EMPTY";
        } else {
            return result;
        }
    }

(코드2) 좀더 간결하게 바꿔봄

다른사람들이 쓴 코드를 보니 내 코드 너무길어 길어도 너무길어 중복을 좀 배제(?)하고 간결하게 써보기로함

  • 문자열을 -> 문자 배열로 고치기 무조건 .toCharArray() 로 썼는데
    인덱스 번호만을 위해서라면 굳이 배열로 안고쳐도 될 듯하다.
  • 문자열을 추가할 때 result += String.valueOf(codeArr[idx])로 처리하고 있었는데, 이는 문자열을 불필요하게 매번 재할당하는 것이므로 성능이 좋지 않다고 한다. 대신, StringBuilder를 사용하여 문자열을 효율적으로 추가
 public String solution(String code) {
   int mode = 0;
        StringBuilder ret = new StringBuilder();
        for (int idx = 0; idx < code.length(); idx++) {
            // code[idx]가 "1"인가?
            if(code.charAt(idx) == '1'){
                //code[idx] == '1' mode 를 바꿈;
                if (mode == 0) {
                    mode = 1;
                } else {
                    mode = 0;
                }
            } else if (mode == 0 && idx % 2 == 0 ){
                //아니면 mode == 0 이고  idx가 짝수일때 ret에 code[idx]추가
                ret.append(code.charAt(idx));
            } else if (mode == 1 && idx % 2 != 0 ){
                //아니면 mode == 1 이고  idx가 홀수일때 ret에 code[idx]추가
                ret.append(code.charAt(idx));
            }
        }
        if (ret.length() == 0) {
            return "EMPTY";
        } else {
            return ret.toString();
        }
    }

효율 따져보기

  • 코드 1

    테스트 1 〉 통과 (315.68ms, 373MB)
    테스트 2 〉 통과 (307.51ms, 384MB)
    테스트 3 〉 통과 (30.52ms, 85.6MB)
    테스트 4 〉 통과 (14.40ms, 90.9MB)
    테스트 5 〉 통과 (62.12ms, 136MB)
    테스트 6 〉 통과 (98.79ms, 216MB)
    테스트 7 〉 통과 (57.84ms, 148MB)
    테스트 8 〉 통과 (248.13ms, 391MB)
    테스트 9 〉 통과 (125.65ms, 254MB)
    테스트 10 〉 통과 (330.41ms, 404MB)
    테스트 11 〉 통과 (235.27ms, 386MB)
    테스트 12 〉 통과 (0.06ms, 77.8MB)
    테스트 13 〉 통과 (0.04ms, 76.3MB)
  • 좀더 간결하게 바꿨던 코드2

    테스트 1 〉 통과 (9.93ms, 77.9MB)
    테스트 2 〉 통과 (9.05ms, 75.7MB)
    테스트 3 〉 통과 (2.09ms, 75.9MB)
    테스트 4 〉 통과 (1.43ms, 81.3MB)
    테스트 5 〉 통과 (4.68ms, 77.4MB)
    테스트 6 〉 통과 (6.38ms, 78MB)
    테스트 7 〉 통과 (4.36ms, 77.2MB)
    테스트 8 〉 통과 (7.53ms, 82.4MB)
    테스트 9 〉 통과 (5.64ms, 73.8MB)
    테스트 10 〉 통과 (8.29ms, 80.6MB)
    테스트 11 〉 통과 (6.98ms, 78.9MB)
    테스트 12 〉 통과 (0.04ms, 74.9MB)
    테스트 13 〉 통과 (0.02ms, 77.2MB)

오 진짜 성능이 좋아졌당!

profile
냅다 써보는 공부의 흔적😇

0개의 댓글