알고리즘

[백준/Java]Q1316

  • -
반응형

백준 알고리즘 7단계 문자열 1316번 문제입니다.


Q. 단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

[입력]
- 첫째줄 단어의 개수 N개가 주어진다.
- 둘째줄 N개의 단어가 주어진다. 

[조건]
- N은 100보다 작거나 같은 자연수이다.
- 주어진 단어는 알파벳 소문자로만 되어있고 중복되지 않는다.
- 그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 
  Ex) ccazzzzbb => cazb 연속(그룹 단어) 
      abc => abc 연속(그룹 단어)
      test => t가 떨어져 나타남(그룹 단어X) 

 

풀이

이 문제의 접근은 그룹 단어의 정의에서 시작했다.

그룹 단어는 단어에 존재하는 모든 문자에 대해 각 문자가 연속해서 나타나는 경우만을 말한다.

결국 그룹 단어는 단어의 중복을 제거한 후에 마지막 문자를 비교해보면 되지 않을까 싶었다. 그룹 단어는 문자가 끝나고 난 이후에 또 같은 문자가 나오면 안되기 때문이다.

 

ccazzzzbb ☞ (중복 제거) cazb ☞ ccazzzzbb : cazb ☞ 마지막 문자 일치 ☞ 그룹 단어 O

abc ☞ (중복 제거) abc ☞ abc : abc ☞ 마지막 문자 일치 ☞ 그룹 단어 O

test ☞ (중복 제거) tes ☞ test : tes ☞ 마지막 문자 불일치 ☞ 그룹 단어 X

 

대략의 알고리즘을 그린 후 프로그램을 작성했다.

 

소스
package com.baek.algo; import java.util.Scanner; public class Q1316 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int cnt = 0; String wordArr[] = new String[n]; for(int seq = 0; seq < n; seq++) { wordArr[seq] = sc.next(); } for(int i = 0; i < wordArr.length; i++) { int pos = 0; String inputWord = wordArr[i].toLowerCase(); String newWord = ""; // 1. 입력받은 문자 중 중복 문자 제거 for(int j = 0; j < inputWord.length(); j++) { if(inputWord.indexOf(inputWord.charAt(j)) == j) { newWord = newWord + inputWord.charAt(j); } } // 2. 중복제거된 문자와 입력받은 문자 비교 String inputWordArr[] = inputWord.split(""); String newWordArr[] = newWord.split(""); for(int h = 0; h < newWordArr.length; h++) { String text = newWordArr[h]; for(int k = pos; k < inputWordArr.length; k++) { if(!text.equals(inputWordArr[k])) { pos = k; break; } } } if(newWordArr[newWordArr.length - 1].equals(inputWordArr[pos])) { cnt = cnt + 1; } } System.out.println(cnt); sc.close(); } }

 

반응형
Contents

포스팅 주소를 복사했습니다.

이 글이 도움이 되었다면 공감 부탁드립니다.