백준 20437 문자열 게임 2 JAVA

hyeon·2022년 5월 4일
0

알고리즘 연습

목록 보기
6/23

문제 문자열 게임2

문제 링크
골드 5
문자열

  1. 어떤 문자를 K개 포함하는 가장 짧은 연속 문자열의 길이를 구하고
  2. 어떤 문자를 K개 포함하고, 문자열의 첫번째와 마지막 글자가 해당 어떤 문자인 가장 긴 연속 문자열의 길이를 구한다.

입력

테스트케이스 갯수
문자열 W
정수 K

출력

1번 2번 결과 출력
만족하는 문자열이 없을 시 -1

풀이

0. 리스트를 생성
=> 인접리스트로 알파벳 개수인 26개로 생성해준다.
실수했던부분(ArrayList 초기화)
바깥 리스트를 static으로 생성해두고 안쪽 리스트만 테스트케이스 for문에서 초기화해줬는데 그러면 테스트케이스가 생길때마다 계속 26개가 생성되기 때문에 결과값이 이상하게 나올것이다.
예제 테스트케이스에서는 첫번째테스트케이스도 5개가 안되기때문에 -1이 출력되서 맞게 보이는것 뿐이였다!! 도움을 주신 알고리즘방의 menborong님 정말 감사드립니다!!

1. a~z까지 리스트로 문자열 w의 인덱스를 저장한다.
=> solve 함수의 첫 for문
주의할 부분은 w.charAt(idx)를 한값이 a라고 나오는게 아니라 get안에 있기때문에 숫자로 return되게된다. 그래서 a의 아스키코드값인 97을 빼주거나 -'a'를 해줘야한다.

2. arr[i]-a[i+k]가 가장 작은 것과 큰것을 구한다.
=>a~z까지 해당하는 문자가 있는 위치(index)를 기록한 list 에서 최대 최소를 구한다.
size가 k보다 작으면 볼필요없이 탐색하지않고 넘어간다.
인덱스값을 하나더하거나 하나빼야하는 경우들이 많으니 잘생각해서 짜야한다.

코드

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

public class 백준20437 {
	static int T,k;
	static String W;
	static int[][] arr;
	static Integer a;
	static Scanner scan=new Scanner(System.in);
	static int min,max;
	static StringBuilder sb=new StringBuilder();
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		T=scan.nextInt();
		for(int i=0;i<T;i++) {
			min=Integer.MAX_VALUE;
			max=Integer.MIN_VALUE;
			W=scan.next();
			k=scan.nextInt();
			//인접리스트 생성
			ArrayList<ArrayList<Integer>> list=new ArrayList<>();
			for(int m=0;m<26;m++) {
				list.add(new ArrayList<>());
			}
			solve(list);
			if(min==Integer.MAX_VALUE) {
				sb.append(-1+"\n");
			}
			else sb.append(min+" "+max+"\n");

		}
		System.out.print(sb);
	}
	public static void solve(ArrayList<ArrayList<Integer>> list) {
		// a~z까지 생성된 list에 문자열 wㅔ 해당하는 index들을 기록한다.
		for(int idx=0;idx<W.length();idx++) {
				list.get(W.charAt(idx)-97).add(idx);
		}
		
		int i = 0;
		//a~z까지 해당하는 문자가 있는 위치(index)를 기록한 list 에서 최대 최소를 구한다 
		while(i<26) {
			int size= list.get(i).size();
			if(size>=k) {
				for(int m=0;size>=m+k;m++) {
					min=Math.min(min,list.get(i).get(m+k-1)-list.get(i).get(m)+1);
					max=Math.max(max, list.get(i).get(m+k-1)-list.get(i).get(m)+1);
				}
			}
			i++;
		}

	}

	}

처음에 짜려고했던 광기의 코드 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

//미완성 코드입니다!!!---------------------------
	public static void solve() {
		int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;
		// 2차원 배열로 인덱스를 저장한다.
		for(int idx=0;idx<W.length();idx++) {
			if(W.charAt(idx)=='a') {
				arr[0][a]=idx;
			}
			else if(W.charAt(idx)=='b') {
				arr[1][b]=idx;
			}
			else if(W.charAt(idx)=='c') {
				arr[2][c]=idx;
			}
			else if(W.charAt(idx)=='d') {
				arr[3][d]=idx;
			}
			else if(W.charAt(idx)=='e') {
				arr[4][e]=idx;
			}
			else if(W.charAt(idx)=='f') {
				arr[5][f]=idx;
			}
			else if(W.charAt(idx)=='g') {
				arr[6][g]=idx;
			}
			else if(W.charAt(idx)=='h') {
				arr[7][h]=idx;
			}
			else if(W.charAt(idx)=='i') {
				arr[8][i]=idx;
			}
			else if(W.charAt(idx)=='j') {
				arr[9][j]=idx;
			}
			else if(W.charAt(idx)=='k') {
				arr[10][k]=idx;
			}
			else if(W.charAt(idx)=='l') {
				arr[11][l]=idx;
			}
			else if(W.charAt(idx)=='m') {
				arr[12][m]=idx;
			}
			else if(W.charAt(idx)=='n') {
				arr[13][n]=idx;
			}
			else if(W.charAt(idx)=='o') {
				arr[14][o]=idx;
			}
			else if(W.charAt(idx)=='p') {
				arr[15][p]=idx;
			}
			else if(W.charAt(idx)=='q') {
				arr[16][q]=idx;
			}
			else if(W.charAt(idx)=='r') {
				arr[17][r]=idx;
			}
			else if(W.charAt(idx)=='s') {
				arr[18][s]=idx;
			}
			else if(W.charAt(idx)=='t') {
				arr[19][t]=idx;
			}
			else if(W.charAt(idx)=='u') {
				arr[20][u]=idx;
			}
			else if(W.charAt(idx)=='v') {
				arr[21][v]=idx;
			}
			else if(W.charAt(idx)=='w') {
				arr[22][w]=idx;
			}
			else if(W.charAt(idx)=='x') {
				arr[23][x]=idx;
			}
			else if(W.charAt(idx)=='y') {
				arr[24][y]=idx;
			}
			else if(W.charAt(idx)=='z') {
				arr[25][z]=idx;
			}
		}
		
		check();
	}
profile
남기고 싶은 개발자입니다 :>

0개의 댓글