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

[SWEA / String / JAVA]

by KDW999 2023. 7. 13.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14P0c6AAUCFAYi&categoryId=AV14P0c6AAUCFAYi&categoryType=CODE&problemTitle=String&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

 

문제 접근

찾는 단어와 문장을 char형 배열로 변환

 

문장 배열을 돌면서 찾는 단어의 첫 문자와 같게 될 경우 cnt와 goalNum의 숫자를 증가시켜가며 원하는 문자와 같게 되는지 쭉 비교

 

sum = 찾는 단어가 나온 횟수

cnt = 찾는 단어 배열의 인덱스 증감을 위한 변수

goalNum = 찾는 단어와 문자 길이가 같은지 비교하기 위한 변수

 

★ 찾는 문자가 ti일 때 문장에서 tti가 나올 경우 t일 때 cnt, goalNum를 +1 시키고 다음 t때 두 변수가 초기화 되는데 이러면 그 다음 i차례 때 찾는 ti가 완성되지 않는 어려움이 있었음

→현재 문장의 문자와 이전 문자가 동일하다면 cnt, goalNum을 유지시키는 걸로 해결

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));
         
        for(int tc=0; tc<10; tc++) {
        int t = Integer.parseInt(br.readLine());
        
        // 찾는 단어
        String str = br.readLine();
        char[] wordArr = str.toCharArray();
         
        // 문장
        String sentence = br.readLine();
        char[] sentenceArr = sentence.toCharArray();
         
        int sum = 0;
        int cnt = 0;
        int goalNum = 0;
         
        for(int i=0; i<sentenceArr.length; i++) {
             
            if(sentenceArr[i] == wordArr[cnt]) {
                cnt++;
                goalNum++;
            }
            else {
            	if(i > 0 && sentenceArr[i] == sentenceArr[i-1]) {
            		cnt = cnt;
            		goalNum = goalNum;
            	}
            	else {
            		cnt = 0;
            		goalNum = 0;
            	}
            }
             
            if(goalNum == str.length()) {
                sum++;
                cnt = 0;
                goalNum = 0;
            }
        }
         
        System.out.println("#"+t+" "+sum);
        }
    }
}

 

다른 사람 풀이

이런 문제에 유용한 indexOf() 메서드와 substring()으로 문자열을 잘라가며 탐색

import java.util.*;
 
public class Solution {
    public static void main(String[] args)  {
       Scanner sc = new Scanner(System.in);
       
       for(int t= 1; t<=10; t++) {
    	   
    	   int answer = 0;
    	   int x = sc.nextInt();
    	   String findString = sc.next();
    	   String str = sc.next();
    	   
    	   int tmp = -2;
    	   
    	   while(true) {
    		   if(tmp == -1) break;
    		   
    		   tmp = str.indexOf(findString); // 원하는 문자의 문자열 위치 인덱스 반환, 없으면 -1 반환
    		   
    		   if(tmp >= 0) {
    			   answer++;
    			   str = str.substring(tmp + findString.length()); // 찾은 문자까지 자르고 다시 탐색
    		   }
    	   }
    	   System.out.println("#"+t+" "+ answer);
       }
    }
}

댓글