본문 바로가기

공부의 기록/Baekjoon

[Boj] 2464. 비밀번호 - java

728x90

2464. 비밀번호

https://www.acmicpc.net/problem/2464

 

2464번: 비밀번호

주어진 수 보다 작은 수 중에서 이진수의 1의 개수가 같으며 가장 가까운 수와, 주어진 수 보다 큰 수 중에서 이진수의 1의 개수가 같으며 가장 가까운 수를 한 줄에 빈칸을 사이에 두고 출력한다

www.acmicpc.net

 풀이 방법

    • 1의 개수가 같으면서 가장 가까운 작은 수와 가장 가까운 큰 수를 찾기
    • 입력받은 수를 이진수 리스트로 저장 (43 = 101011(2), list = [1, 1, 0, 1, 0, 1, 0])
    • 해당 수보다 더 작은 수를 찾기 위해서는 리스트를 인덱스 0부터 돌며 01이 되는 부분 찾아서 10로 swap ( [1, 1, 0, 1, 0, 1, 0] -> [1, 1, 1, 0, 0, 1, 0] )
    • 해당 수보다 더 큰 수를 찾기 위해서는 리스트를 인덱스 0부터 돌며 10이 되는 부분 찾기 01로 swap( [1, 1, 0, 1, 0, 1, 0] -> [1, 0, 1, 1, 0, 1, 0] )
    • 01 또는 10인 부분을 단지 swap하는 과정만 하면 (1100000111 보다 작은 수 중 가장 큰 수는1011110000) 같은 경우를 해결하지 못한다.

 소스 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class 비밀번호_2464 {

	static int cnt;
	static List <Integer> smallList = new ArrayList<>();
	static List <Integer> bigList = new ArrayList<>();
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		long A = Long.parseLong(br.readLine());
		long X = A;
	
		while(A > 0L) {
			smallList.add((int)(A%2));
			bigList.add((int)(A%2));
			if((int)(A%2)==1)
				cnt++;
			A = A/2;
		}
		smallList.add(0);
		bigList.add(0);
		System.out.println(small() + " " +big());
	}
	public static long small() {
		int i;
		for(i = 1; i < smallList.size();i++) {
			if(smallList.get(i) == 1 && smallList.get(i-1) == 0) {
				smallList.set(i, 0);
				smallList.set(i-1, 1);
				break;
			}
		}
		if(i == smallList.size())
			return 0;
		for(int j = 0; j < i;j++) {
			smallList.set(j, 0);
		}
		int count = 0;
		for(int j = 0; j <smallList.size();j++) {
			if(smallList.get(j) == 1)
				count++;
		}
		for(int j = 0; j < cnt - count; j++) {
			smallList.set(i-1-j, 1);
		}
		return toDecimal(smallList);
	}
	public static long big() {
		int i;
		for(i = 1; i < bigList.size();i++) {
			if(bigList.get(i) == 0 && bigList.get(i-1) == 1) {
				bigList.set(i, 1);
				bigList.set(i-1, 0);
				break;
			}
		}
		if(i == bigList.size())
			return 0;
		for(int j = 0; j < i;j++) {
			bigList.set(j, 0);
		}
		int count = 0;
		for(int j = 0; j <bigList.size();j++) {
			if(bigList.get(j) == 1)
				count++;
		}
		for(int j = 0; j < cnt - count; j++) {
			bigList.set(j, 1);
		}
		return toDecimal(bigList);
		
	}
	public static Long toDecimal(List<Integer> list) {
		Long result = 0L;
		Long bin = 1L;
		for(int i = 0; i < list.size(); i++) {
			result += bin * (long)list.get(i);
			bin *= 2L;
		}
		
		return result;
	}
}
728x90

'공부의 기록 > Baekjoon' 카테고리의 다른 글

[BOJ] 14502. 연구소 - java  (7) 2022.04.11
[BOJ] 2458. 키 순서 - java (SWEA_5643)  (0) 2022.04.08
[Boj] 17070. 파이프 옮기기1 - java  (0) 2022.03.22