컴퓨터 공부/📚 Baekjoon(백준)

[백준/알고리즘/python/java] 2941번 - 크로아티아 알파벳

letzgorats 2021. 1. 27. 15:07

이미지를 누르면 문제링크를 보실 수 있습니다.
이미지를 누르면 문제링크를 보실 수 있습니다.
이미지를 누르면 문제링크를 보실 수 있습니다.
2941번 - 크로아티아 알파벳

처음에는 시간초과가 났었던 문제이다.

알파벳을 기준으로 하지말고 기호를 기준으로 제어문을 나누었더니 시간초과문제가 해결되었다.

 

(처음에 풀었던 코드-python)

string = input()
length = len(string)
cnt = 0
idx = 0
while(idx != (length)):
    if(string[idx] == 'l'):
        if(string[idx+1] == 'j'):
            cnt += 1
            idx += 2
        else:
            cnt += 1
    elif(string[idx] == 'n'):
        if(string[idx+1] == 'j'):
            cnt += 1
            idx += 2
        else:
            cnt += 1
            idx += 1
    elif(string[idx] == 'd'):
        if(string[idx+1] == 'z'):
            cnt += 1
            idx += 3
        elif(string[idx+1] == '-'):
            cnt += 1
            idx += 2
        else:
            cnt += 1
            idx += 1

    elif(string[idx] == 'c'):
        if(string[idx+1] == '-' or string[idx+1] == '='):
            cnt += 1
            idx += 2
        else:
            cnt += 1
            idx += 1

    elif(string[idx] == 's' or string[idx] == 'z'):
        if(string[idx+1] == '='):
            cnt += 1
            idx += 2
        else:
            cnt += 1
            idx += 1

    else:
        cnt += 1
        idx += 1
print(cnt)

딱봐도 코드가 길고 가독성도 좋지 않은 코드이다. 시간문제는 덤이다. 좋지 않은 코드였다.

알파벳을 기준으로 제어문을 나누니 고려해야 할 사항이 많아졌다.

기호는 '-'와 '='밖에 없으니까 기호를 기준으로 제어문을 나눌 필요가 있었다.

 

(고친 코드는 아래와 같다-파이썬)

string = input()
cnt = len(string)
idx = 0
while(idx != len(string)):
    if(string[idx] == '='):
        if(string[idx-1] == 'c' or string[idx-1] == 's'):
            cnt -= 1
        elif(string[idx-1] == 'z'):
            if(idx >= 2):    # 인덱스 오류를 잡기 위해 꼭 필요
                if(string[idx-2] == 'd'):
                    cnt -= 2
                else:
                    cnt -= 1
            else:
                cnt -= 1
    elif(string[idx] == '-'):
        if(string[idx-1] == 'c' or string[idx-1] == 'd'):
            cnt -= 1
    elif(string[idx] == 'j'):
        if(string[idx-1] == 'l' or string[idx-1] == 'n'):
            cnt -= 1
    idx += 1
print(cnt)

좀 더 코드가 간결해졌다.

이 때, 주목해야 할 부분은 9번째 줄이다.

if( idx>=2) 같은 제어를 안해준다면, index 범위 오류가 날 수 있는 위험이 있기 때문이다.

(처음부터 'z='로 시작하는 문자열이 있을 수 있기 때문에)

'dz='를 처리하는 것만 주의해준다면, 로직은 간단하다.

 

cnt를 문자열의 길이로 초기화하고 

두 단어 이상의 문자가 크로아티아 알파벳이라고 여겨진다면, 한 단어로 인정해야 하므로, -1을 해주면 된다.

 

(이전에 자바로 풀었던 코드)

import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		str=str.trim();
		int count = 0; 
		for(int i =0; i< str.length();i++) {
			char word = str.charAt(i);
			count++;
			if(word=='=') {
				if(str.charAt(i-1)=='c') {
					count--;
				}
				else if(str.charAt(i-1)=='s') {
					count--;
				}
				else if(str.charAt(i-1)=='z') {
					if(i>=2) {
						if(str.charAt(i-2)=='d') {
							count-=2;
						}
						else count--;
					}
					else count--; 
				}
			}
			else if(word=='-') {
				if(str.charAt(i-1)=='c') {
					count--;
				}
				else if (str.charAt(i-1)=='d'){
					count--;
				}
			}
			else if(word=='j') {
				if(i!=0) {
					if(str.charAt(i-1)=='l') count--;
					else if(str.charAt(i-1)=='n') count--;
				}
			}
		}
		System.out.println(count);
		sc.close();
	}
}

로직은 파이썬과 자바가 동일하다.

반응형