땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • ㅗ
  • D
  • E
  • 이것이 리눅스다 with Rocky Linux9
  • I

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 1094 막대기(구현, 비트마스킹)

2022. 10. 24. 23:19
 

1094번: 막대기

지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대

www.acmicpc.net

매우 간단한 문제이지만 배울점이 많았던 문제다

가지고 있는 막대를 반으로 계속 나누면서 남은 애들이랑 이어붙여서 요구하는 막대의 길이를 구하는건데 

 

1. 문제에 나와있는대로 그대로 구현하기


1. 가지고 있는 막대를 이등분 한다
2. 이등분한 막대 중 하나를 빼고 나머지 stack에 있는 애들을 모두 더한다
3. if sum >= X : 이등분한거 버린다(아무것도 안한다)
    if sum < X : 버리지 않는다(다시 stack에 넣는다)

package pratice;

import java.util.Scanner;
import java.util.Stack;

public class algo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();

        for (int tc = 1; tc < T+1; tc++) {
           int X = sc.nextInt();

            Stack<Integer> stack = new Stack<>();
            stack.push(64);

            if (X == 64)
                System.out.println("#"+tc+" "+1);
            else{
                while(true){
                    int temp = stack.pop();
                    temp /= 2;
                    stack.add(temp);

                    int sum = 0;
                    for (int i = 0; i < stack.size(); i++) {
                        sum += stack.get(i);
                    }

                    if (sum == X)
                        break;

                    else if(sum < X){
                        stack.add(temp);
                    }
                }

                System.out.println("#"+tc+" "+stack.size());



            }


        }


    }
}

 

2. 비트마스킹

X = 63 이라면, 
64 -> 32 32(안버림) -> 32 16 16(안버림) -> 32 16 8 8(안버림) -> 32 16 8 4 4(안버림) -> 32 16 8 4 2 2(안버림) -> 32 16 8 4 2 1 1(버림)
[32 16 8 4 2 1] 막대를 이어야함

X = 6이라면,
64 -> 32 32(버림) -> 16 16(버림) -> 8 8(버림) -> 4 4(안버림) -> 4 2 2(버림)
[4 2] 막대를 이어야함

X = 13이라면,
64 -> 32 32(버림) -> 16 16(버림) -> 8 8(안버림) ->8 4 4(안버림) -> 8 4 2 2(버림) -> 8 4 1 1(버림)
[8 4 1] 막대를 이어야함

이거 잘 봤을 때 비트연산으로 생각해보면
X를 2진수로 바꿨을 때 막대를 이어야하는 부분은 1인 부분임

따라서! X를 2진수로 표시한다음에 1의 개수를 센다

package pratice;

import java.util.Scanner;

public class algo1_1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();

        for (int tc = 1; tc < T+1; tc++) {
            int X = sc.nextInt();
            System.out.println(Integer.toBinaryString(X).replace("0","").length());

        }
    }
}

 

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 3687 성냥개비(DP, 그리디)  (0) 2022.10.31
백준 7682 틱택토(구현)  (0) 2022.10.25
백준 14722 우유도시(DP)  (0) 2022.10.24
백준 2931 가스관(구현, 시뮬레이션)  (0) 2022.10.24
백준 9376 탈옥 (다익스트라, 0-1 BFS) - 아직 푸는중...  (1) 2022.10.22
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 3687 성냥개비(DP, 그리디)
    • 백준 7682 틱택토(구현)
    • 백준 14722 우유도시(DP)
    • 백준 2931 가스관(구현, 시뮬레이션)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바