본문 바로가기
알고리즘/SWEA

[SWEA / 간단한 압축 풀기 / JAVA]

by KDW999 2023. 4. 4.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PmkDKAOMDFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제 접근

값 입력받고 인덱스당 10개씩 문자를 담아주면 되겠다 생각

처음엔 배열로 만들었으나 배열은 크기가 지정되있기 때문에 추가해야할 단어들이 한 줄에 10개가 넘어가면 다음 인덱스를 추가 해줄 수가 없었다. → 크기 1의 배열에 B 20인 경우면 인덱스 초과

그래서 List를 사용하여 한 줄의 크기가 10이 넘어가면 다음 인덱스를 만들고 거기에다가 단어를 계속 넣어주었다.

 

buffer랑 tokenizer를 오랜만에 써서 쓰는 방법을 헷갈렸다.

처음엔 scanner로 했으나 nextLine이 엔터를 잡아먹으면서 또 다시 nextLine를 적어주고 해야되서 그냥 속도 빠른 buffer 쓰기로 하였음

import java.util.*;
import java.io.*;

public class Solution {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
	    int T = Integer.valueOf(br.readLine()); 

		for(int i=0; i<T; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());

			List<String> strList = new ArrayList<>();
			int count = 0;
			strList.add(""); // List 첫 인덱스
			
			for(int j=0; j<N; j++) {
				st = new StringTokenizer(br.readLine());
				String C = st.nextToken();
				int K = Integer.parseInt(st.nextToken());
				
				for(int m=0; m<K; m++) {
					if(strList.get(count).length() >= 10) {
						count++;
						strList.add("");
					}
					strList.set(count, strList.get(count)+C);
				}
			}
			System.out.println("#"+(i+1));
			for(String s : strList) System.out.println(s);
		}
	}
}

 

다른 사람 풀이

이 사이트는 왜 문제를 풀어도 사이트 내에 다른 사람 코드를 볼 때 점수를 차감하는 걸까?

 

이 분은 배열과 스캐너로 풀었는데, 난 배열의 크기를 처음에 지정해놓고 풀려고 했기 때문에 도중에 크기가 안맞아서 List로 우회했던 것관 다르게 이 분은 문자들의 갯수만큼 아예 배열의 크기를 잡아서 모자랄 일이 없게 만들었다.

문자들의 총 갯수 크기의 배열을 만들고 모든 인덱스에 문자들의 각 갯수만큼 집어넣었다.

이후 배열 크기만큼 반복문을 돌면서 10개씩 인덱스를 출력  

import java.util.*;

public class Solution {
	public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
		
		int T = sc.nextInt();
		
		for(int tc = 1; tc <= T; tc++) {
			int N = sc.nextInt(); // 문자와 숫자 쌍
			int idx = 0;
			String[] s = new String[N];
			int total = 0;
			int[] num = new int[N];
			for(int i = 0; i < N; i++) {
				s[i] = sc.next(); // 문자
				num[i] = sc.nextInt(); // 숫자
				total += num[i]; // 숫자들의 총합
			}
			String [] arr = new String[total]; // 숫자 총합 크기의 배열
			for(int i = 0; i < N; i++) {
				for(int j = 0; j < num[i]; j++) {
					arr[idx] = s[i]; // arr[0] = A, arr[1] = A, arr[2] = A ... 
					idx++;
				}
			}

			System.out.println("#" +tc);
			for(int i = 0; i < idx; i++){
				if(i != 0 && i%10 == 0) { // i !=0 안해주면 처음에 바로 줄이 넘어간다.
					System.out.println();
				}
				System.out.print(arr[i]);
			}
		}
    }
}

 

 

댓글