실습/백준

크로아티아 알파벳 - 2941번 (Java 풀이)

chobyeonggyu03 2024. 7. 20. 21:46
반응형

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

 

 

크로아티아 알파벳변경

 

 

č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

 

 

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

 

 

 

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

 

 

 

출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

 

 

예제 입력 1 

ljes=njak

예제 출력 1 

6

예제 입력 2 

ddz=z=

예제 출력 2 

3

예제 입력 3 

nljj

예제 출력 3 

3

예제 입력 4 

c=c=

예제 출력 4 

2

예제 입력 5 

dz=ak

예제 출력 5 

3

 

 

 

 

나는 이 문제를 처음봤을 때 배열을 활용해 풀이하고 싶다는 생각이 가장 컸기에 배열을 어떻게 활용하면 좋을 지 고민하다 배열에 알바펫단위를 하나씩 넣는다면 배열의 길이가 곧, 전체 알파벳 갯수일거라는 생각이 떠올랐다. 그렇기에 c,d,l,n,s,z를 입력받았을 경우엔 바로 배열에 넣지않고 다음 문자가 -,=,l인지 케이스에 맞게 판별한 후 크로아티아 알파벳과 일치하는 단어가 이어져 온다면 해당 단어를 한덩어리로 배열에 추가하고, 다른 문자가 온다면 int형 배열에 2개를 카운팅하는 형식으로 풀이를 진행보았다.  (+길이를 지정하지 않아도 되는 ArrayList로 배열을 대신함)

 

 

 

package BAEKJOON_2941;

/*
날짜: 2024.07.20.토요일
내용: 백준 2941번 (크로아티아 알파벳)
 */

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class BAEKJOON_2941 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
		
		String str = br.readLine();				// 문자열 입력받기
	
		ArrayList<Integer> arr = new ArrayList<Integer>();			// ArrayList를 활용하여 전체 알파벳 갯수 카운팅하기
		
		for (int i=0; i<str.length(); i++) {
			char ch = str.charAt(i);
			if( ch == 'c') {
//				System.out.println("c를 입력받음, c=, c- 알파벳인지 확인하기");			// 'c' 다음 문자열이 '=', '-'인지 확인후 맞으면 단어 1개로 카운팅 아니면 문자 2개로 카운팅
				if( str.charAt(i+1) == '=') {
					arr.add(1);
					i++;											// 2개 한꺼번에 처리한거니까 i++해서 중복해서 카운팅하지 않게하기
				}else if( str.charAt(i+1) == '-'){
					arr.add(1);
					i++;											// 2개 한꺼번에 처리한거니까 i++해서 중복해서 카운팅하지 않게하기
				} else {
					arr.add(1);
					arr.add(2);
					i++;											// 2개 한꺼번에 처리한거니까 i++해서 중복해서 카운팅하지 않게하기
				}
			}else if(ch == 'd') {
//				System.out.println("d를 입력받음, dz=, d- 알파벳인지 확인하기");			// 'd' 다음 문자열이 'z=', '-'인지 확인후 'dz='이 맞으면 각각 문자3개와 2개를 1개로 카운팅 아니면 문자 2개로 카운팅
				if( str.charAt(i+1) == 'z') {
//					System.out.println("dz를 입력받음, dz= 알파벳인지 확인하기");			
					if( str.charAt(i+2) == '=') {
						arr.add(1);
						i += 2;										// 3개를 한꺼번에 처리한거니까 중복해서 카운팅하지 않게하기
					} else {
						arr.add(1);
						arr.add(2);
						i++;										// 3개를 한꺼번에 처리한거니까 중복해서 카운팅하지 않게하기
					}	
				}else if( str.charAt(i+1) == '-'){					// d- 알파벳인지 확인하기
//					System.out.println("d를 입력받음, d- 알파벳인지 확인하기");			
					arr.add(1);
					i++;											// 2개 한꺼번에 처리한거니까 i++해서 중복해서 카운팅하지 않게하기
				} else {
					arr.add(1);
				}
			}else if(ch == 'l') {
//				System.out.println("l을 입력받음, lj 알파벳인지 확인하기");				// lj 알파벳인지 확인하기	
				if(str.charAt(i+1) == 'j') {
					arr.add(1);
					i++;											// 2개 한꺼번에 처리한거니까 i++해서 중복해서 카운팅하지 않게하기
				} else {
					arr.add(1);
					i++;
				}
			}else if(ch == 'n') {
//				System.out.println("n을 입력받음, nj 알파벳인지 확인하기");				// nj 알파벳인지 확인하기		
				if(str.charAt(i+1) == 'j') {
					arr.add(1);
					i++;											// 2개 한꺼번에 처리한거니까 i++해서 중복해서 카운팅하지 않게하기
				} else {
					arr.add(1);
				}
			}else if(ch == 's') {
//				System.out.println("s를 입력받음, s= 알파벳인지 확인하기");				// s= 알파벳인지 확인하기		
				if(str.charAt(i+1) == '=') {
					arr.add(1);
					i++;											// 2개 한꺼번에 처리한거니까 i++해서 중복해서 카운팅하지 않게하기
				} else {
					arr.add(1);
				}
			}else if(ch == 'z') {
//				System.out.println("z를 입력받음, z= 알파벳인지 확인하기");				// z= 알파벳인지 확인하기		
				if(str.charAt(i+1) == '=') {
					arr.add(1);
					i++;											// 2개 한꺼번에 처리한거니까 i++해서 중복해서 카운팅하지 않게하기
				} else {
					arr.add(1);
				}
			}else {
				arr.add(3);
			}
		}
	
		System.out.println(arr.size());
		
		
		br.close();
	}

}

 

 

 

 

 

 

 

 

테스트했던 println부분들은 모두 주석처리를 하고 제출했기에 결과값 자체는 같았지만 왜 인지 틀렸다고 나오길래 다른 사람의 코드를 참고해 다시 풀어보았다. 오늘도 결국 직접 대X리를 깨지며 indexOf와 replace 메서드에 대해 알아가는 시간이었다..   (하지만 이렇게 배워야 머리에 오래 남는것도 함정이다,,)

 

 

 

package BAEKJOON_2941;

/*
날짜: 2024.07.20.토요일
내용: 백준 2941번 (크로아티아 알파벳)
 */

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class BAEKJOON_2941 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
		
		String str = br.readLine();													// 문자열 입력받기
  
        String[] Alphabet = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" };	// indexOf와 replaceAll 메서드를 활용해 크로아티아 알파벳들을 하나의 문자열로 대체하여 전체문자열의 길이를 측정
		int n = 0;																	// 크로아티아 알파벳의 위치를 나타내는 변수 선언

		for (int i = 0; i < Alphabet.length; i++) {									// for문을 돌며 indexOf로 크로아티아 알파벳이 있다면 해당 index를 n에 저장, 없다면 반환되는 -1을 저장
            n = str.indexOf(Alphabet[i]);            
			if (n >= 0) {															// 크로아티아 알파벳이 존재할 때 해당 문자열 전체를 replaceAll을 통해 하나의 문자로 대체
				str = str.replace(Alphabet[i], "a");
			}
		}
		System.out.println(str.length());											// 문자열의 길이를 출력
		
		br.close();
	}

}

 

 

 

 

 

슬슬 기본 지식들이 부족하여 노가다로 알고리즘을 짜는 것보다 다른사람들의 코드를 참고하여 해당 내용들을 공부하고 그걸 체화시키는게 효율이 높아지는 시기가 다가오고 있는데, 앞으로는 문제를 봤을 때 이렇다할 풀이 방법을 찾지 못해 노가다식으로 문제를 풀게 될 것 같으면 다른 사람의 코드를 참고하고 문제를 푸는 데에 있어 중요한 핵심 풀이 내용만을 참고해 공부하고 코드는 직접짜는식으로 공부하는 방향으로 문제를 풀어야 할 것 같다.

 

 

 

● indexOf("찾는 객체나 문자열") 메서드

ArrayList나 문자열에서 찾는 객체나 문자열의 위치를 표시해주는 메서드로 찾는 객체나 문자열이 없을 때는 -1을 반환한다. 주로 List형태의 객체에서 사용되며 null값에 대해서도 찾을 수 있음

 

 

 

 

반응형