새벽코딩

[백준] [1373] 2진수 8진수 본문

알고리즘

[백준] [1373] 2진수 8진수

J 코딩 2022. 11. 25. 02:22
반응형

문제

2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.

입력

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 주어진 수를 8진수로 변환하여 출력한다.

예제 입력 1 복사

11001100

예제 출력 1 복사

314

 

※코드

 

import java.io.*;
import java.util.HashMap;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		HashMap<String, String> map = new HashMap<>();
		
		/* map put */
		map.put("0", "");
		map.put("1", "1");
		map.put("10", "2");
		map.put("00", "");
		map.put("11", "3");
		map.put("000", "0");
		map.put("001", "1");
		map.put("010", "2");
		map.put("011", "3");
		map.put("100", "4");
		map.put("101", "5");
		map.put("110", "6");
		map.put("111", "7");
		
		String input = br.readLine();
		String pattern = "";
		int tmp = input.length()%3;
		
		for(int i=0;i<tmp;i++) pattern += input.charAt(i);
		sb.append(map.get(pattern));
		
		pattern = "";
		for(int i=tmp;i<input.length();i+=3) {
			pattern = input.substring(i, i+3);
			sb.append(map.get(pattern));
		}
		
		if(input.length() == 1 && input.equals("0")) {
			System.out.println("0");
		} else {
			while(sb.indexOf("null")>-1) {
				int idx = sb.indexOf("null");
				sb.delete(idx, idx+4);
			}
			bw.write(sb.toString());
		}
		
		bw.flush();
		bw.close();
		br.close();
	}
}

 

※생각정리

 

와.. 이문제는 정말 많이 틀렸다. 메모리초과 부터 값이 틀리기도하고 반례를 찾는데 정말 많은 시간이 걸린 문제이다..

처음 쉽게 접근했다가 곤욕을 겼었다. 

 

처음에는 각 패턴을 해시맵에 저장한 후 해당 패턴을 substring으로 잘라서 맵에 넣었다.

맵에 키값으로 들어간 패턴 문자열은 Value를 뱉어냈고 그 값을 result 문자열에 저장했다.

 

String result += "Value" 형태로 저장했었는데 string += "Value" 방식은 매번 초기화하여 새로운 스트링객체를 생성하기때문에 메모리에 큰 부담을 주었다.

 

그래서 선택한 방법이 StringBuilder이다. StringBuilder는 한번 객체를 생성하면 불변하는 성질을 가지고 있다. 따라서 계속해서 메모리를 소모하지 않는다.

 

이렇게 메모리 문제를 해결한줄 알았지만 계속해서 틀렸다는 메시지가 보였다. StringBuilder는 기본 값이 null이며 값이 append될때 그뒤에 이어서 붙어지게 된다. 예로 출력값이 7이라면 null7과 같은 식으로 null문자열이 붙었다.

 

최종적으로 null문자열이 sb에 있을때 delete해서 지워주어 정답을 맞출 수 있었다.

 

-새벽코딩-

 

반응형

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

[백준] [11866] 요세푸스 문제0  (0) 2022.11.27
[백준] [5622] 다이얼  (0) 2022.11.26
[백준] [2745] 진법 변환  (2) 2022.11.25
[백준] [6996] 애너그램  (0) 2022.11.24
[백준] [1652] 누울 자리를 찾아라  (0) 2022.11.23
Comments