Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

AnEasyProblem/강소현: Difference between revisions

From ZeroWiki
imported>talin0528
No edit summary
 
(Repair batch-0001 pages from live compare)
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
== Status ==
== Status ==
{| class="wikitable"
{| class="wikitable" style="width:100%;"
|-
|-
| Problem
| Problem
Line 17: Line 17:
| Accepted
| Accepted
|}
|}
== Idea ==
bit 연산이 익숙치가 않아, 10진수 -> 2진수 변환해서 배열에 넣었습니다ㅠㅠ(끝내고 다시 반대로..;ㅁ;..이런 비효율적인!)
1이란 숫자를 찾았을 때 그 앞의 숫자가 0이면 1을 앞으로 보내고, 1이면 맨 끝쪽으로 보내는...
ex)
0010 0000 -> 0100 0000
0011 1100 -> 0100 0111
== Source Code ==
== Source Code ==
  import java.util.Scanner;
  import java.util.Scanner;
  public class Main{
  public class Main{
  public static void main(String[] args){
  public static void main(String[] args){
  Scanner sc = new Scanner(System.in);
  Scanner sc = new Scanner(System.in);
  while(sc.hasNextInt()){
  while(sc.hasNextInt()){
Line 30: Line 37:
  }
  }
  private static void printJ(int i){
  private static void printJ(int i){
  int [] bin = binI(i);
  int [] bin = binI(i);
  int num = 0, count=0;
  int num = 0, count=0;
  while(num<bin.length-1){
  while(num<bin.length-1){
  if(bin[num] == 1){
  if(bin[num] == 1){
  if(bin[num+1] == 0){
  if(bin[num+1] == 0){
  bin[num+1] = 1;
  bin[num+1] = 1;
  bin[num] = 0;
  bin[num] = 0;
  break;
  break;
  }else{
  }else{
  bin[num] = 0;
  bin[num] = 0;
  bin[count++] = 1;
  bin[count++] = 1;
  }
  }
  }
  }
Line 47: Line 54:
  int result = 0;
  int result = 0;
  for(int k=0; k<bin.length;k++){
  for(int k=0; k<bin.length;k++){
  result += bin[k]*Math.pow(2,k);
  result += bin[k]*Math.pow(2,k);
  }
  }
  System.out.println(result);
  System.out.println(result);
  }
  }
   
   
  private static int [] binI(int i){
  private static int [] binI(int i){
  int [] temp = new int [21];
  int [] temp = new int [21];
  int num = 0;
  int num = 0;
  while(i>0){
  while(i>0){
  temp[num++] = i%2;
  temp[num++] = i%2;
  i = i/2;
  i = i/2;
  }
  }
Line 62: Line 69:
  }
  }
  }
  }
== Trial and error ==
* Compile error
** 클래스 이름은 항상 "Main"으로 해주어야 합니다. 깜찍한 poj 같으니:)
* Runtime error
** printJ 함수 내에서 while(num<bin.length-1)문의 1을 빼주지 않아 binnum+1가 index bound of exception이 났었습니다.
* Wrong answer
** 2^20 = 1048576 으로 1000000보다 크니까 배열의 크기를 20으로 잡았었는데, 1과 0을 옮기면서 이 숫자보다 더 커지는 경우를 고려하지 못했습니다. 그 결과 1~1000000 중에서 4개의 숫자가 맨 앞의 1이 짤려서 숫자가 작게 출력된! ;ㅅ; 언뜻 보길래 맞은 줄 알아서 뻘짓을 많이 한 ㅋㅋ poj는 죄가 없어! 내가 바보임 ㅠㅠ
{| class="wikitable"
|-
| 자연수 I
| 기대한 값
| 실제 값
|-
| 524288
| 1048576
| 524288
|-
| 786432
| 1048577
| 524289
|-
| 917504
| 1048579
| 524291
|-
| 983040
| 1048583
| 524295
|}


** 제가 처음에 하다하다 안되서 10진수를 2진수로 표기하려고 했다가 그게 매우 어렵다는걸 깨달았죠...; 배열로 하는 방법도 있었군요. -[[김태진]]
----
[[ACM_ICPC/2011년스터디]]

Latest revision as of 23:56, 26 March 2026

Status

Problem 2453 User talin0528
Memory 3656K Time 375MS
Language Java Result Accepted

Idea

bit 연산이 익숙치가 않아, 10진수 -> 2진수 변환해서 배열에 넣었습니다ㅠㅠ(끝내고 다시 반대로..;ㅁ;..이런 비효율적인!) 1이란 숫자를 찾았을 때 그 앞의 숫자가 0이면 1을 앞으로 보내고, 1이면 맨 끝쪽으로 보내는... ex) 0010 0000 -> 0100 0000 0011 1100 -> 0100 0111

Source Code

import java.util.Scanner;
public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		while(sc.hasNextInt()){
			int i = sc.nextInt();
			if(i == 0)
				break;
			printJ(i);
		}
	}
	private static void printJ(int i){
		int [] bin = binI(i);
		int num = 0, count=0;
		while(num<bin.length-1){
			if(bin[num] == 1){
				if(bin[num+1] == 0){
					bin[num+1] = 1;
					bin[num] = 0;
					break;
				}else{
					bin[num] = 0;
					bin[count++] = 1;
				}
			}
			num++;
		}
		int result = 0;
		for(int k=0; k<bin.length;k++){
			result += bin[k]*Math.pow(2,k);
		}
		System.out.println(result);
	}

	private static int [] binI(int i){
		int [] temp = new int [21];
		int num = 0;
		while(i>0){
			temp[num++] = i%2;
			i = i/2;
		}
		return temp;
	}
}

Trial and error

  • Compile error
    • 클래스 이름은 항상 "Main"으로 해주어야 합니다. 깜찍한 poj 같으니:)
  • Runtime error
    • printJ 함수 내에서 while(num<bin.length-1)문의 1을 빼주지 않아 binnum+1가 index bound of exception이 났었습니다.
  • Wrong answer
    • 2^20 = 1048576 으로 1000000보다 크니까 배열의 크기를 20으로 잡았었는데, 1과 0을 옮기면서 이 숫자보다 더 커지는 경우를 고려하지 못했습니다. 그 결과 1~1000000 중에서 4개의 숫자가 맨 앞의 1이 짤려서 숫자가 작게 출력된! ;ㅅ; 언뜻 보길래 맞은 줄 알아서 뻘짓을 많이 한 ㅋㅋ poj는 죄가 없어! 내가 바보임 ㅠㅠ
자연수 I 기대한 값 실제 값
524288 1048576 524288
786432 1048577 524289
917504 1048579 524291
983040 1048583 524295
    • 제가 처음에 하다하다 안되서 10진수를 2진수로 표기하려고 했다가 그게 매우 어렵다는걸 깨달았죠...; 배열로 하는 방법도 있었군요. -김태진

ACM_ICPC/2011년스터디