알고리즘

백준 1316 그룹 단어 체커 파이썬(python), 자바(Java) 풀이 - string 다루기

머리큰개발자 2021. 5. 30. 23:11

기초적인 파이썬과 자바의 문법을 익히기 위해 알고리즘 문제를 풀어보기로 했다.

어려운건 힘들기 때문에(c로 해도 힘든데...) 쉬운 실버부터 차근차근 풀어보도록 하자.

 

위 문제는 알파벳이 연속적으로 오느냐(1개만 있어도 ok) 혹은 알파벳 사이에 다른 종류의 알파벳이 껴있느냐를 묻는 문제이다.

즉, aaabbbcdd 같은 형태는 가능하고, 

aaabbbaaa 같은 형태는 불가능하다.

 

주어진 입력에서 그룹 단어의 개수를 체크하여 출력하면 된다.

 

자바와 파이썬 코드의 풀이 방식은 동일하다.

1. 입력받은 단어에서 a~z까지 하나씩 확인한다.

2. a를 확인한다면 index를 찾아서 연속되는지 (next-prev==1)인지를 확인하고 연속하지 않고 떨어져있다면 세지 않는다.

 

파이썬 코드

def group(s:str)->bool:
    for i in range(ord('z')-ord('a')+1):
        prev= s.find(chr(i+ord('a')))
        while(True):
            if prev==-1: break;
            next = s.find(chr(i+ord('a')),prev+1);
            if next == -1: break;
            if (next-prev!=1): return False;
            prev = next;
    return True;

n = int(input());
words = list(filter(lambda x : x ,map(group, (input() for i in range(n)))))

print(len(words));

 

 

 파이썬 코드에서 sequence containter 에 사용하는 method 중 find 를 사용한 이유는, 만약 값이 없을 경우 -1을 리턴하기 때문이다. 

반대로 method 중 index를 사용하지 않은 이유는, 만약 값이 없다면 에러를 리턴하기 때문이다.

words 는 generator -> map(group, ) -> filter -> list 의 순서로 만들어진다.

 

  

 

자바코드

 

import java.util.Scanner;

public class Main {
		
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		
		int n = sc.nextInt();
		int group = checkGroup(n);
		System.out.println(group);
	}
	
	public static int checkGroup(int n) {
		
		int ret=0;
		
		for (int i=0; i<n; i++) {
			String s = sc.next();
			
			boolean isGroup=true;
			for (char j='a'; j<='z'; j++) {
				int prev = s.indexOf(j);
				while (true) {
					if (prev==-1) break;
					int next = s.indexOf(j,prev+1);
					if (next ==-1) break;
					if (next-prev !=1) {
						isGroup=false;
						break;
					}
					prev = next;
				}
				if (isGroup==false) break;
			}
			if (isGroup) ret++;
		}
		return ret;
	}
}




 

자바에서는 for - else 문이 (파이썬과 다르게) 없기 때문에 isGroup이라는 flag를 만들어서 하나하나 체크했다.

처음 제출하면서 헤맨 것은 public class 의 이름이 Main이어야 하고, static class로 사용해야 했다는 것 정도이다.

static method는 힙에 생성되는 것이 아니기 때문에 초기화를 해줘야 했던 것 같은데... 헷갈리니까 항상 해주는 걸로..