일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- RR
- 게임후기
- firebase
- 클로즈베타
- 비선점스케줄링
- FIFO
- SJF
- 응용계층
- 파이어베이스
- 네트워크
- IP
- PICASSO
- 조선협객전M
- 페이지 교체 알고리즘
- 선점스케줄링
- 안드로이드
- 운영체제
- 저평가주
- 정보처리기사
- 페이지
- 인증
- 글라이드
- 전송계층
- hrn
- 계층
- 조선협객전
- 네트워크 관리사
- FCFS
- 알바후기
- Glide
- Today
- Total
초보 dogfootruler
2. algospot - ENDiANS문제(JAVA) 본문
요즘 알고리즘 공부의 필요성을 느껴서 다시 공부 하고 있다.
알고스팟의 문제를 왕초보부터 풀어보려고 한다.
오랜만에 푸니 머리에서 쥐가나는 것 같다..
문제 : https://algospot.com/judge/problem/read/ENDIANS
문제가 영어다.. 하지만 난 영어듣기는 못하지만 독해는 잘한다.
대충 문제를 말하자면 사이가 안좋은 마을 두개가 숫자표기를 서로 다르게 하니 변환해서 보여줘라 인데
빅이디안을 리틀이디안으로 바꾸라는 문제이다.
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
핫소스님의 코드이다.
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 |
---|