강승현입니다
    • 홈
    • 태그
    • 방명록

    카테고리

    • 전체 글 (118)
      • 후기 (38)
        • 경험 (15)
        • SSAFY (9)
        • 코딩테스트 (3)
        • 넥스터즈 (6)
        • 회고 (5)
      • Degrees (2)
      • Tech (33)
      • OnlineJudge (45)
    OnlineJudge

    백준 20304 비밀번호 제작 풀이 python, java

    CODe_byCODe_·2021. 2. 8. 16:19

    문제로이동


    목차

       



      문제 설명

      펜윅트리를 하며 비트마스킹을 써왔던 것이 조금은 도움이 되었습니다.

      이번 문제는 만들어둔 사진으로 대체하겠습니다.

       

      아래의 과정(BFS)을 반복적으로 거치고 나면 가장 처음에 입력된 값을 기준으로 1의 거리를 가진 간선들이 연결되어 있습니다.

       


      소스 코드

      Python

      from collections import deque
      import sys
      input = sys.stdin.readline
      MIN = -10e9
      N = int(input())
      M = int(input())
      arr = [MIN]*1000001
      dq = deque()
      xs = list(map(int,input().split()))
      for x in xs:
          arr[x] = 0
          dq.append(x)
      maxnum = 0
      while dq:
          x = dq.popleft()
          for i in range(20):
              nx = x^ (1<<i)
              if nx>N or arr[nx]!= -10e9:
                  continue
              dq.append(nx)
              arr[nx]=arr[x]+1
              maxnum = max(arr[nx],maxnum)
      print(maxnum)

      Java8

      import java.util.*;
      import java.io.*;
      
      public class Main {
      	static StringBuilder sb = new StringBuilder();
      	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      	static StringTokenizer st;
      	static int answer;
      	public static void main(String[] args) throws IOException {
      		int N = Integer.parseInt(br.readLine());//기본 입력
      		int M = Integer.parseInt(br.readLine());
      		Deque<Integer> dq = new ArrayDeque<Integer>();
      		int arr[] = new int[1000001];//최대초기화
      		Arrays.fill(arr, Integer.MIN_VALUE);
      		st = new StringTokenizer(br.readLine());
      		for(int i=1;i<=M;i++) {
      			int x =Integer.parseInt(st.nextToken()); 
      			arr[x] = 0;
      			dq.offerLast(x);
      		}//M의 범위 1<=M
      		while(!dq.isEmpty()) {
      			int x = dq.pollFirst();
      			for(int i =0;i<20;i++){				
      				int nx = x^(1<<i);
      				if(nx>N||arr[nx]!=Integer.MIN_VALUE)continue;
      				arr[nx] = arr[x]+1;
      				dq.offerLast(nx);
      				answer = Math.max(answer, arr[nx]);
      			}
      		}		
      		System.out.println(answer);
      	}
      }
      반응형
      저작자표시 비영리 변경금지 (새창열림)
      'OnlineJudge' 카테고리의 다른 글
      • SWEA 1249 보급로 JAVA
      • 백준 6497 전력난 java
      • 백준 2263 트리 풀이 pypy3, python3, java
      • SWEA 2805 농작물 수확하기 풀이 java
      CODe_
      CODe_
      개발과 관련된 다양한 정보를 몰입감있게 전달합니다.
      최신 글

      티스토리툴바