[백준] 2929번 머신 코드 Java 문제 풀이

2022. 1. 17. 18:30알고리즘/백준

728x90
반응형

문제

여러 개의 사과, 파인애플, 그리고 펜이 일렬로 세워져 있다. 이 물건들의 순서를 바꾸지 않고 옆에 있는 물건끼리 연결했을 때, 펜-파인애플-애플-펜을 몇 개나 만들 수 있을지 세어보자.

단, 펜, 파인애플, 사과, 펜 순서로 연결된 네 개의 물건만을 펜-파인애플-애플-펜으로 인정하며, 하나의 펜이 두 개의 펜-파인애플-애플-펜에 포함될 수 없다. 또한 펜, 사과, 파인애플, 펜 순서로 연결된 네 개의 물건은 펜-파인애플-애플-펜이 아니다.종수는 새 마이크로프로세서를 구매했다. 새 프로세서에 예전 프로세서에서 작동하던 프로그램을 실행시키니 실행이 되지 않았다.

며칠동안 두 프로세서의 기술 문서를 살펴본 결과, 그 결과를 알게 되었다. 새 프로세서의 실행 속도를 향상시키기 위해서 프로그램 머신 코드에 제한이 새로 생겼다. 예전 프로세서에서는 제한이 없었다.

프로세서의 머신 코드는 명령을 실행할 순서대로 나열한 것이다. 각 명령은 메모리를 1바이트 사용한다. 또, 명령은 0개 또는 그 이상의 파라미터를 가질 수 있으며, 각 파라미터도 1바이트씩 메모리를 차지한다. 머신 코드에서 파라미터는 명령의 바로 뒤에 따라 나온다.

머신 코드를 명령은 대문자, 파라미터는 소문자로 나타낼 수 있다.

위의 프로그램은 명령 4개로 이루어져 있다. 첫 번째 명령은 파라미터 3개, 두 번째는 2개, 세 번째는 파라미터가 없고, 네 번째는 4개이다. 이 프로그램은 메모리를 13바이트 사용한다.

새 프로세서는 메모리를 4바이트 단위로 가져온다. 즉, 명령은 반드시 4로 나누어지는 위치에서 시작해야 한다. (메모리의 첫 바이트가 주소 0) 따라서, 새로운 명령 NOP(no operation)를 추가해 모든 명령이 시작하는 위치를 4로 나누어지는 곳으로 맞춰야 한다. 위의 프로그램을 새 프로세서용으로 변환한 머신 코드는 아래와 같다.

명령 A, B, C, D의 시작 위치는 0, 4, 8, 12로 모두 4로 나누어 떨어진다.

예전 프로세서의 머신 코드가 주어졌을 때, 새 프로세서에서 실행시키기 위해 삽입해야 하는 NOP 개수의 최솟값을 구하는 프로그램을 작성하시오.

입력

예전 프로세서용 머신 코드 프로그램이 주어진다. 프로그램은 최대 200글자로 이루어져 있다.

프로그램은 항상 명령으로 시작한다. (첫 글자가 대문자) 한 명령이 머신 코드에서 여러 번 나오는 경우에, 항상 같은 개수의 파라미터를 갖는다.

출력

삽입해야하는 NOP 개수의 최솟값을 출력한다.


예제입력1

Abcd

예제출력1

0


예제입력2

EaEbFabG

예제출력2

5


예제입력3

AbcbBccCDefgh

예제출력3

4


문제풀이

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.*;

interface Main{
    static void main(String[]a) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String str = "";
        String regex = "([A-Z][a-z]*)";
        Pattern pattern = Pattern.compile(regex);
        int NOPcnt = 0, start;
        str = br.readLine();
        Matcher matcher = pattern.matcher(str);
        
        while(matcher.find()) {
          start = matcher.start();
          start += NOPcnt;
          
          if(start%4 != 0) {
            NOPcnt += 4-start%4;
          }
        }
        bw.write(NOPcnt+"");
        bw.flush();
    }
}

명령의 시작은 반드시 대문자이기 때문에 무조건 등장합니다.

반면 머신 코드의 파라미터는 없을 수도 있습니다.

그렇기 때문에 정규식에서 [a-z] 뒤에 *을 넣어줬습니다.

 

matcher.start()는 matcher.find()를 통해 찾은 시작 지점 index 값을 반환합니다.

 

머신 코드의 시작 위치가 4로 나누어떨어지지 않을 경우 이전에 입력했던 머신 코드의 길이가 4의 배수가 아닙니다.

 

4-start%4는 NOP을 입력해야 되는 개수이므로 4로 나누어떨어지지 않을 경우 그만큼 더해줍니다.

 

반복할 때마다 NOP이 채워졌다고 가정하고 계산해야 하므로 start 값에 NOPcnt를 더해줍니다.

 

 

 

출처 : https://www.acmicpc.net/problem/2929

 

2929번: 머신 코드

종수는 새 마이크로프로세서를 구매했다. 새 프로세서에 예전 프로세서에서 작동하던 프로그램을 실행시키니 실행이 되지 않았다. 며칠동안 두 프로세서의 기술 문서를 살펴본 결과, 그 결과를

www.acmicpc.net

 

728x90
반응형