[코드트리 조별과제 1주차 코딩테스트 연습] 문자열 순회하기 / Run Length 인코딩 문제 풀이 with 자바스크립트(Javascript) & 자바(Java)

Re_Go·2024년 7월 17일
0

코딩테스트연습

목록 보기
100/106
post-thumbnail

1. 첫번째 문제 풀이(2024-07-17)

해당 문제는 스택을 이용하여 제법 간단하게 문제를 풀 수 있었는데, 제가 저녁에 풀었던지라 너무 피곤해서 한 시간동안 머리를 싸맸던 것 같습니다. 그래도 아래 코드에 주석을 틈틈이 달아놨으니 이해하시는대에 그렇게 어려움은 없으실거라 사료됩니다.

그럼 해당 문제에 대한 JS 답안 코드를 소개해드리겠습니다!

  1. 자바스크립트 버전
const fs = require("fs");
let input = fs.readFileSync(0).toString().trim();

let rne = "";

// 각 알파벳을 보관할 스택
let alphaStack = [];

// 각 알파벳마다 등장 횟수를 보관할 스택
let encodingStack = [];

// state에 문자열의 첫번째를 넣고, 알파스택에도 첫번째 요소를 넣어준다.
let state = input[0];
let count = 0;
alphaStack.push(input[0]);

// for문을 돌리면서 현재 state와 i가 같으면 count를 증가
// 같지 않다면 지금까지 누적된 각 알파벳의 카운트 값을 스택에 저장하고
// state를 이전 알파벳과 같지 않는 현재의 알파벳으로 교체한 뒤
// 알파스택에 현재 알파벳을 담고 i를 감소하여 다시 현재 위치부터(i++를 한 번 하게 되므로 i--를 해야함) 돌게함
// count는 0으로 초기화
for(let i = 0 ; i <= input.length ; i++){
    if(state === input[i]){
        count++;
    }else{
        encodingStack.push(count);
        state = input[i];
        alphaStack.push(state);
        i--;
        count = 0;
    }
}
// alphastack에는 미리 하나의 값을 넣어놔서 for문을 다 돌고나면 alphastack에는 else문에 의해 undefined가 들어가 있음
//그래서 마지막 undefined를 제거해줄 필요가 있음
if(alphaStack[alphaStack.length - 1] === undefined) alphaStack.pop();

let result = "";
// result에 각 스택에 대응되는 값들을 이어붙여 result에 저장한 후
for (let i = 0; i < alphaStack.length; i++) {
    result += alphaStack[i] + encodingStack[i];
}

// result의 길이와 result를 차례대로 출력
console.log(`${result.length}\n${result}`);

그리고 자바 버전으로 구현한 코드는 다음과 같습니다.

  1. 자바 버전
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine().trim();

        List<Character> alphaStack = new ArrayList<>();
        List<Integer> encodingStack = new ArrayList<>();

        char state = input.charAt(0);
        alphaStack.add(state);
        int count = 1;

        for (int i = 1; i < input.length(); i++) {
            if (state == input.charAt(i)) {
                count++;
            } else {
                encodingStack.add(count);
                state = input.charAt(i);
                alphaStack.add(state);
                count = 1;
            }
        }
        encodingStack.add(count); // 마지막 문자의 등장 횟수 추가

        StringBuilder result = new StringBuilder();
        for (int i = 0; i < alphaStack.size(); i++) {
      result.append(alphaStack.get(i)).append(encodingStack.get(i));
        }

        System.out.println(result.length());
        System.out.println(result);
    }
}

2. 자바와 자바스크립트 풀이 차이점

  1. 코드트리에 JS는 입력을 받을 때 fs모듈로 파일을 읽어와야 했습니다. 뭐 익숙하진 않지만 그래도 양식이 있으니... 그리고 자바의 경우 편하게 스캐너를 받으면 이전에 사용하던 BufferedReader랑 InputStreadReader, StringTokenizer 조합을 사용해서 문자열을 받아왔습니다.

  2. JS의 경우 배열 접근이 쉬운 반면, 자바는 List 컬렉션으로 꽤나 번거롭게 문제를 풀어야 했습니다. 물론 어느정도 익숙해진 터라 큰 상관은 없었지만요. 추가로 자바의 경우 두 스택을 이어붙이는 작업을 빌더의 어펜드로 해봤는데 잘 동작되어서 다행이라고 생각되었습니다.

챌린지 3일차인데 아직까지는 건재하군요? ㅎ...

profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글