코깽이의 코딩일기

Java 백준 2866 문자열 잘라내기 본문

PS/백준

Java 백준 2866 문자열 잘라내기

코깽이 2024. 2. 5. 12:17
반응형

백준 링크

https://www.acmicpc.net/problem/2866

 

2866번: 문자열 잘라내기

첫 번째 줄에는 테이블의 행의 개수와 열의 개수인 R과 C가 주어진다. (2 ≤ R, C ≤ 1000) 이후 R줄에 걸쳐서 C개의 알파벳 소문자가 주어진다. 가장 처음에 주어지는 테이블에는 열을 읽어서 문자

www.acmicpc.net


문제

입력

출력

입출력 예시

 


제출한 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static StringBuilder sb;
	static int R, C;

	static StringBuilder[] StringData;

	static char[] charData;

	static HashSet<String> answer = new HashSet<>();

	public static void main(String[] args) throws NumberFormatException, IOException {
		
		// R, C 입력받기
		st = new StringTokenizer(br.readLine());
		
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		// 데이터를 저장할 Char[] 선언
		StringData = new StringBuilder[C];
		charData = new char[C];
		// 각 열의 데이터를 저장할 StringBuilder를 각각 초기화
		for (int i = 0; i < C; i++) {
			StringData[i] = new StringBuilder();
		}
		// 1행의 데이터를 각 열에 해당하는 index의 StringBuilder에 추가
		for (int x = 0; x < R; x++) {
			charData = br.readLine().toCharArray();
			for (int y = 0; y < C; y++) {
				StringData[y].append(charData[y]);
			}
		}

		int cnt = 0;
		int start = 0;
		// 로직 수행
		while (start++ < R) {
			
			for (int i = 0; i < C; i++) {
				// 0번재 index의 데이터 삭제
				StringData[i] = StringData[i].deleteCharAt(0);
				// 존재하는지 비교
				// 존재하는 경우 return
				if (answer.contains(StringData[i].toString())) {
					System.out.println(cnt);
					return;
				}
				// 존재하지 않는 경우 제일 처음 위치하는 데이터를 삭제하고 다시 저장
				else {
					answer.add(StringData[i].toString());
				}

			}
			answer.clear();
			cnt += 1;	
		}
		
		System.out.println(cnt);

	}

}

 

 

각 데이터를 열단위로 쪼개서 저장하고 비교해보는 방식으로 해결했다.

 

1. 입력받는 행의 데이터를 열 단위로 저장하기 위한 StringBuilder[]를 열의 길이만큼 할당한다.

2. 입력받는 데이터를 Char단위로 쪼개서 해당하는 위치의 StringBuilder에 저장한다.

3. 기본적으로 행의 개수만큼 while문을 반복하면서 로직을 수행한다.

4. StringBuilder[]에 저장된 StringBuilder의 첫번째 char를 제거한다.

5. 해당 데이터가 존재하지 않으면 빠른 속도로 존재하는지 확인하기 위한 HashSet에 저장하고 Hashset에 존재하는 경우 return한다.

반응형

'PS > 백준' 카테고리의 다른 글

Java 백준 1342 행운의 문자열  (0) 2024.02.05
Java 백준 16165 걸그룹 마스터  (0) 2024.02.05
Java 백준 13305 주유소  (0) 2024.02.05
Java 백준 14675 단절점과 단절선  (2) 2024.01.27
Java 백준 12927 배수 스위치  (0) 2024.01.27