[SWEA] 1289 : 원재의 메모리 복구하기 - Java

Chooooo·2024년 2월 1일
0

알고리즘/Java

목록 보기
8/16
post-thumbnail

문제

원재가 컴퓨터를 만지다가 실수를 저지르고 말았다. 메모리가 초기화된 것이다.

다행히 원래 메모리가 무슨 값이었는지 알고 있었던 원재는 바로 원래 값으로 되돌리려고 했으나 메모리 값을 바꿀 때 또 문제가 생겼다.

메모리 bit중 하나를 골라 0인지 1인지 결정하면 해당 값이 메모리의 끝까지 덮어씌우는 것이다.

예를 들어 지금 메모리 값이 0100이고, 3번째 bit를 골라 1로 설정하면 0111이 된다.

원래 상태가 주어질 때 초기화 상태 (모든 bit가 0) 에서 원래 상태로 돌아가는데 최소 몇 번이나 고쳐야 하는지 계산해보자.

[입력]

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 메모리의 원래 값이 주어진다.

메모리의 길이는 1이상 50이하이다.

[출력]

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

초기값(모든bit가 0)에서 원래 값으로 복구하기 위한 최소 수정 횟수를 출력한다.

코드

public class SWEA_1289_원재의메모리복구하기 {

    //원래 메모리가 무슨 값이었는지 알고 있음.
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static int T;
    static int[] data;

    public static void main(String[] args) throws IOException {
        T = Integer.parseInt(br.readLine());
        for (int t = 1; t <= T; t++) {
            String memory = br.readLine();
            data = new int[memory.length()];
            for (int i = 0; i < data.length; i++) {
                data[i] = Character.getNumericValue(memory.charAt(i));
            }
            // 해당 숫자 확인해서 카운팅
            int cnt = data[0];  // 시작지점이 1이면 카운트하고 시작
            int last = data[0];
            for (int i = 0; i < data.length; i++) {
                if (last != data[i]) {
                    cnt += 1;
                    last = data[i]; // 어차피 같으니까 이 안에서만 바꿔줘도 됨.
                }
            }
            System.out.println("#" + t + " " + cnt);
        }
    }
}

🎈 코멘트

입력 받는 것이 애먹었다.

for (int i = 0; i < tc; i++) {
//			String s = sc.next();
			String s = sc.readLine();
//			sc.nextLine();
			int arr[] = new int[s.length()];
			for (int j = 0; j < s.length(); j++) {
				arr[j] = s.charAt(j) - '0';
			}

이런 식으로 띄어쓰기 없이 입력 받더라도, charAt()으로 접근. 만약 int로 변형해야 한다면 char - '0' 로 편하게 해줄 수 있었다.

작은 경우부터 생각해서 문제 해결했다. 비트가 바뀌는 지점에서 카운팅을 했어야 함.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글