SWEA 1289 원재의 메모리 복구하기
문제 정보
- 문제 출처 : SW Expert Academy
- 문제 번호 : 1289
- 문제 제목 : 원재의 메모리 복구하기
- 문제 난이도 : D3
- 풀이 언어 : Java
문제
메모리가 초기화 되어 원래 상태로 고쳐야 하는데, 메모리 bit 중 하나를 골라 0인지 1인지 결정하면 해당 값이 메모리 끝까지 덮어 씌워 진다.
모든 bit 가 0인 상태에서 주어진 숫자(원래 상태)로 돌아가려면 최소 몇 번이나 고쳐야 하는지 구하는 문제
접근
메모리의 원래 값을 순회하면서 각 문자를 숫자로 변환 한 후 이전 비트 값과 현재 비트 값을 비교하여, 두 값이 다를 경우에만 비트 변화 횟수를 증가시켰다.
풀이
- 가장 첫 줄에는 테스트 케이스 개수 T 가 주어진다.
- 각 테스트 케이스는 한 줄로 되어 있고, 메모리의 원래 값이 주어진다.
- 초기화 된 비트 값을 저장할 변수 num을 0으로 초기화한다.
- 비트가 변하는 횟수를 세는 변수 count를 0으로 초기화한다.
- for문으로 입력 받은 비트 문자열의 길이만큼 반복한다.
- 현재 인덱스의 문자를 숫자로 변환한다. 여기서 ‘0’을 빼는 이유는 문자 ‘0’의 아스키 코드 값에서 실제 숫자 0의 값을 얻기 위함이다.
- 원래 비트 값(bitNum)이 초기화 된 비트 값(num) 과 다를 경우, count를 1 증가 시키고, num을 원래 비트 값으로 업데이트한다.
- 계산된 비트 변화 횟수(count)를 출력한다.
후기
메모리의 원래 값과 초기화 된 비트 값이 다들 경우 1씩 카운트 증가시켜서 문제를 풀었다. 생각 보다 금방 해결한 문제이다.
코드
Java
import java.util.Scanner;
import java.io.FileInputStream;
class Solution
{
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T;
T=sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++)
{
String bit = sc.next();
int num = 0;
int count = 0;
for (int i = 0; i < bit.length(); i++) {
int bitNum = bit.charAt(i) - '0';
if (bitNum != num) {
num = bitNum;
count++;
}
}
System.out.print("#" + test_case + " ");
System.out.println(count);
}
}
}
Java