초보 dogfootruler

2. algospot - ENDiANS문제(JAVA) 본문

StudyRoom;/Algorithm;

2. algospot - ENDiANS문제(JAVA)

킹갓우부 2020. 6. 17. 16:43

요즘 알고리즘 공부의 필요성을 느껴서 다시 공부 하고 있다.

알고스팟의 문제를 왕초보부터 풀어보려고 한다.

오랜만에 푸니 머리에서 쥐가나는 것 같다..

 

문제 : https://algospot.com/judge/problem/read/ENDIANS

 

algospot.com :: ENDIANS

Endians 문제 정보 문제 The two island nations Lilliput and Blefuscu are severe rivals. They dislike each other a lot, and the most important reason was that they break open boiled eggs in different ways. People from Lilliput are called little-endians

algospot.com

문제가 영어다.. 하지만 난 영어듣기는 못하지만 독해는 잘한다.

대충 문제를 말하자면 사이가 안좋은 마을 두개가 숫자표기를 서로 다르게 하니 변환해서 보여줘라 인데

빅이디안을 리틀이디안으로 바꾸라는 문제이다.

 


1. 문제


2. 코드

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		int C = scan.nextInt();
		String []Array = new String[32];
		String []Answer = new String[32];
		
		if(C>=1 && C<=10000) {
			for(int k=0;k<C;k++) {
				long num = scan.nextLong();
				int j=3;
				String zero="";
				String binArrStrNum="";
				String binStrArrNum = Long.toBinaryString(num);
				// System.out.println(binStrArrNum);
				for(int i=0;i<32-binStrArrNum.length();i++) {
					zero+="0";
				}
				
				binStrArrNum = zero+binStrArrNum;
				Array = binStrArrNum.split("");
				// System.out.println(Arrays.toString(Array));
				for(int i =0; i<32;i++) {
					if(i%8==0&&i!=0) {
						j=j-2;
					}
					Answer[i+(j*8)]=Array[i];	
				}
				
				for(int i=0;i<32;i++) {
					binArrStrNum+=Answer[i];
				}
				System.out.println(Long.parseLong(binArrStrNum, 2));
			}
			return ;
		}
	}
}

코드를 해석하자면, 일단 수가 상당히 크다.

처음에 int로 받았는데, 막판에 코드구현까지 다했는데, 범위를 벗어나기에 long으로 고쳤다.

다른부분은 쉽게 넘어갔으나, 

첫 입력부분에서 첫 비트 8개를 24번째 순서로 돌려서 보내야 하는데, 떠오르질 않았다.

계속 붙잡고 있으니 떠올랐고, 그걸로 고칠수 있었다. 배열 안 변수를 고치는게 키포인트였다.


3. 코드에 들어간 문법

필요할때마다 구글에쳐서 문법을 찾곤 했다.

그래서 자주 쓰는 문법도 잘 외우지 못하거나 잘 못 쓰고 말았다.

자주쓰는 문법 정도는 외우도록 해야겠다.

 

* int 정수를 입력 -> 2진수 8진수 16진수 String으로 변환

* 2진수 8진수 16진수 String 입력 -> int 정수로 변환

int num = 10;
String strBin = Integer.toBinaryString(num); // 2진수로 변환
String strOct = Integer.toOctalString(num); // 8진수로 변환
String strHex = Integer.toHexString(num); // 16진수로 변환

// long도 Integer대신 Long으로 고치면 가능하다.

int binDec = Integer.parseInt(strBin,2); // 2진수에서 정수로 변환
int octDec = Integer.parseInt(strBin,8); // 8진수에서 정수로 변환
int HexDec = Integer.parseInt(strBin,16); // 16진수에서 정수로 변환

// 위와 마찬가지를 Integer와 parseInt를 Long과 parseLong으로 고치면 가능하다.

4. 다른사람의 풀이

https://h0tsource.tistory.com/entry/algospotENDIANS

 

[algospot]ENDIANS

문제 https://algospot.com/judge/problem/read/ENDIANS 걸리버여행기에 나오는 두 섬나라인 소인국 릴리풋(Lilliput) 과  거인국 블루푸스쿠(Blefuscu)는 서로 너무 너무 너무 싫어해서 삶은 달걀을 깨는 방..

h0tsource.tistory.com

핫소스님의 코드이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Endians {

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int cnt =Integer.parseInt(br.readLine());

		while (cnt-- > 0) {
			Long a = Long.valueOf(br.readLine());

			System.out.println(((a & 0x000000ffl) << 24) | ((a & 0x0000ff00l) << 8)
				| ((a & 0x00ff0000l) >> 8) | ((a & 0xff000000l) >> 24));
		}
	}
}

정말간단하게 풀었다. 비트이동을 통해서 필요한 부분만 보여주는것이다.

만약 나도 저렇게 풀었으면 어마어마하게 빨리 풀었을텐데,

너무 어렵게 생각한 것 같다.

아니다 다시 생각해보니 저건 그냥 생각을 못했다..

'StudyRoom; > Algorithm;' 카테고리의 다른 글

1. 11718번 그대로 출력하기(C++)  (0) 2018.12.27
Comments