본문 바로가기
알고리즘/SWEA

[Java] SWEA1289_원재의메모리복구하기

by 댕꼬 2022. 3. 12.
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV19AcoKI9sCFAZN 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제

원재가 컴퓨터를 만지다가 실수를 저지르고 말았다. 메모리가 초기화된 것이다.
다행히 원래 메모리가 무슨 값이었는지 알고 있었던 원재는 바로 원래 값으로 되돌리려고 했으나 메모리 값을 바꿀 때 또 문제가 생겼다.
메모리 bit중 하나를 골라 0인지 1인지 결정하면 해당 값이 메모리의 끝까지 덮어씌우는 것이다.
예를 들어 지금 메모리 값이 0100이고, 3번째 bit를 골라 1로 설정하면 0111이 된다.
원래 상태가 주어질 때 초기화 상태 (모든 bit가 0) 에서 원래 상태로 돌아가는데 최소 몇 번이나 고쳐야 하는지 계산해보자.

 

테스트 케이스 

[입력]                         [출력]

2                                #1 1
0011                           #2 2
100 

 

풀이

100을 예로 들면 ,

우선 원재의 실수로 000으로 초기화 되었다. 

100으로 만들기 위해 첫번째 숫자를 1로 바꾸면, 메모리 끝까지 덮어씌우므로 111이 된다. 

또 2번째 숫자를 0으로 바꾸면 , 메모리를 끝까지 덮어씌우므로 100(기존값)이 된다.

그러므로 정답은 2 이다.

 

이를 토대로 풀어보자. (int count =0;    // 숫자 카운팅할 변수)

현재 자신의 수와  다음에 위치한 수가 다르면 메모리를 변경한 것이므로, count변수에 1을 더한다.

하지만 첫번째 숫자가 1일경우엔 초기에 메모리를 1로 셋팅한 것이므로, count를 1로 초기화해주어야 함에 주의한다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

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

	public static void main(String[] args) throws Exception {

//		Scanner sc = new Scanner(System.in);
		BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
//		int tc = sc.nextInt();
		int tc = Integer.parseInt(sc.readLine());
		
		StringBuilder sb = new StringBuilder();
		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';
			}

			int count = 0;
			if (arr[0] == 1)
				count = 1;

			for (int j = 0; j < s.length() - 1; j++) {

				if (arr[j] != arr[j + 1]) {
					count++;
				}

			}
			sb.append("#").append(i).append(" ").append(count).append("\n");
		}
		System.out.println(sb.toString());
	}

}

 

사실 알고리즘 풀이보다는 데이터를 어떻게 핸들링 할것인지 더 초점을 맞춘 문제였다. 

Scanner에 익숙했던터라, BufferedReader를 익히기 위해 초반에는 위와같이 Scanner로 먼저 작성한 후 BufferedReader로 변경해주었다. 

 

또한 Character 변수에 -'0'을 해주면 int로 변환된다는 중요한 사실 한번 더 짚고 넘어가기 (●'◡'●)

(학기 초 시험에서 +'0'라고 써서 문제에서 틀린적이 있었다.... 도륵......)

728x90

'알고리즘 > SWEA' 카테고리의 다른 글

[Java] SWEA2805_농작물수확하기  (0) 2022.03.16
[Java] SWEA1873_상호의배틀필드  (0) 2022.03.16
[Java] SWEA1208_Flatten  (0) 2022.03.16
[Java] SWEA2001_파리퇴치  (0) 2022.03.16
[Java] SWEA1954_달팽이숫자  (0) 2022.03.12

댓글