본문 바로가기
Coding Test/Java Coding Test

[프로그래머스 / 자바] - 코드 처리하기

by nam_ji 2024. 9. 26.

코드 처리하기 - LV.0

문제

  • 문자열 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를 출력하는 문제입니다.  
  • 단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.


테스트 (인텔리제이)

  • 우선 문자열의 문자 중에서 1에 따른 mode 변화와 인덱스 값에 따라 문자를 추가해야 하는 조건이 있기 때문에 for문을 이용하여 문자열의 문자를 하나씩 꺼내려고 합니다.
  • for문은 code의 크기만큼 반복하도록 설정하고
  • charAt() 메서드를 이용하여 code의 문자를 하나씩 꺼내줍니다. (charAt()은 괄호에 원하는 문자가 위치한 인덱스 번호를 넣어주면 해당 문자가 반환됩니다.)
  • 처음에는 mode에 따라 계산 방법이 달라지기 때문에 mode값 부터 결정할 수 있게 해줘야 합니다.
  • 그래서 if문으로 charAt의 값이 문자 1이면 mode를 0이면 1, 1이면 0로 변경시켜줍니다.
  • 대신 문자 1에 대한 연산은 하면 안되기 때문에 continue로 mode의 연산이 끝나면 for문의 다음으로 넘어가도록 해줍니다.
  • 이제 mode에 따른 연산에 대한 if문이 필요합니다. 첫 번째 if문에는 mode가 0이고 code의 인덱스 값이 짝수이면 answer에 code의 charAt 값을 더해주도록 하고
  • 두 번째 else if문에는 mode가 1이고 code의 인덱스 값이 홀수이면 answer에 code의 charAt 값을 더해주도록 해줍니다.
  • 마지막으로 반환되는 부분에 answer가 빈 문자열이면 EMPTY를 넣어주도록 하면 해결할 수 있습니다.
  • 두 번째 코드는 다른 사람 풀이 중에서 깔끔한 풀이가 있어 가져와 봤습니다.
  • for문은 동일하게 작성하고 그 안에서 code를 charAt으로 꺼낸 문자를 char타입 c에 저장하도록 합니다.
  • if문으로 c가 문자 1이면 mode를 0이면 1, 1이면 0으로 변경시켜주고 continue로 for문 다음 인덱스로 넘어가도록 해줍니다.
  • mode 연산을 위한 if문 다음으로 if문을 설정합니다. 해당 if문은 for문의 현재 인덱스 번호를 2로 나눴을 때 mode와 일치하면 answer에 c를 담아주도록 해주면 해결할 수 있습니다.
package com.namji.codingtest;

public class 코드_처리하기 {
  public static void main(String[] args) {
    /*
    문자열 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를 출력하는 문제입니다.
    단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.

    제한사항
    - 1 ≤ code의 길이 ≤ 100,000
      - code는 알파벳 소문자 또는 "1"로 이루어진 문자열입니다.

    입출력 예
    code	          result
    "abc1abc1abc"	  "acbac"
    "abcdef"        "ace"
    "abc11abc"      "acb"
    "11111"         "EMPTY"
    "1a1b1c"        "abc"

    입출력 설명
    #1
    code의 각 인덱스 i에 따라 다음과 같이 mode와 ret가 변합니다.
    i	  code[i]	mode	ret
    0	  "a"	    0	    "a"
    1	  "b"	    0	    "a"
    2	  "c"	    0	    "ac"
    3	  "1"	    1	    "ac"
    4	  "a"	    1	    "ac"
    5	  "b"	    1	    "acb"
    6	  "c"	    1	    "acb"
    7	  "1"	    0	    "acb"
    8	  "a"	    0	    "acba"
    9	  "b"	    0	    "acba"
    10  "c"	    0	    "acbac"
    따라서 "acbac"를 return 합니다.
     */
//    String code = "1a1b1c";
//    int mode = 0;
//    StringBuilder answer = new StringBuilder();
//
//    for (int i = 0; i < code.length(); i++) {
//      if (code.charAt(i) == '1') {
//        mode = mode == 0 ? 1 : 0;
//        continue;
//      }
//      if (mode == 0 && i % 2 == 0) {
//        answer.append(code.charAt(i));
//      } else if (mode == 1 && i % 2 != 0) {
//        answer.append(code.charAt(i));
//      }
//    }
//    if (answer.isEmpty()) {
//      answer.append("EMPTY");
//    }
//
//    System.out.println(answer);

    String code = "abc1abc1abc";
    int mode = 0;
    StringBuilder answer = new StringBuilder();

    for (int i = 0; i < code.length(); i++) {
      char c = code.charAt(i);
      if (c == '1') {
        mode = mode == 0 ? 1 : 0;
        continue;
      }
      if (i % 2 == mode) {
        answer.append(c);
      }
    }

    System.out.println(answer.isEmpty() ? "EMPTY" : answer);
  }
}

프로그래머스 코드

// class Solution {
//     public StringBuilder solution(String code) {
//         int mode = 0;
//         StringBuilder answer = new StringBuilder();
        
//         for (int i = 0; i < code.length(); i++) {
//             if (code.charAt(i) == '1') {
//                 mode = mode == 0 ? 1 : 0;
//                 continue;
//             }
//             if (mode == 0 && i % 2 == 0) {
//                 answer.append(code.charAt(i));
//             } else if (mode == 1 && i % 2 != 0) {
//                 answer.append(code.charAt(i));
//             }
//         }
//         if (answer.length() == 0) {
//             answer.append("EMPTY");
//         }
        
//         return answer;
//     }
// }

// class Solution {
//     public String solution(String code) {
//         int mode = 0;
//         StringBuilder answer = new StringBuilder();
        
//         for (int i = 0; i < code.length(); i++) {
//             char c = code.charAt(i);
//             if (c == '1') {
//                 mode = mode == 0 ? 1 : 0;
//                 continue;
//             }
            
//             if (i % 2 == mode) {
//                 answer.append(c);
//             }
//         }
        
//         return answer.length() == 0 ? "EMPTY" : answer.toString();
//     }
// }

class Solution {
    public StringBuilder solution(String code) {
        int mode = 0;
        StringBuilder answer = new StringBuilder();
        
        for (int i = 0; i < code.length(); i++) {
            char c = code.charAt(i);
            if (c == '1') {
                mode = mode == 0 ? 1 : 0;
                continue;
            }
            
            if (i % 2 == mode) {
                answer.append(c);
            }
        }
        
        return answer.length() == 0 ? answer.append("EMPTY") : answer;
    }
}