728x90
반응형

알고리즘 문제를 풀다보면 제곱근에 대한 문제가 종종 있습니다. 흔히 사용하는 math 의 pow 로 해결이 불가능 한 경우가 있습니다. 1024 이상의 제곱근을 사용하면 오류가 발생하거나 엉뚱한 숫자가 나타납니다. 이때 사용하는 것이 BigInteger 의 pow 입니다.  

아래는 BigInteger를 이용한 제곱근을 구하는 방법입니다. 그리고 나머지를 구해주는 remainder 까지 사용해 보았습니다.

package study.basic;

import java.math.BigInteger;

public class Big_Integer {

	public static void main(String[] args) {
		BigInteger big1, result;
		
		big1 = new BigInteger("2");
		int exponent=1245;
		
		result = big1.pow(exponent);
		
		String str = big1 + "^" + exponent + " = "  + result;
		System.out.println(str);
		
		int i = 1000000007;
		System.out.println( result.remainder(BigInteger.valueOf(i)));
	}
}

 

시험에 종종나오는 큰수의 경우 BigInteger를 사용하여 처리하면 간단히 구현이 가능합니다. 사용법을 꼭 숙지하십시오.

나머지 연산에 대한 내용은 아래 블로그를 참고하세요.

 

https://kkh0977.tistory.com/161
 

120. (java/자바) BigInteger 사용해 덧셈, 뺄셈, 곱셈, 나누기, 나머지, 최대공약수, 바이트값 구하기

/* =========================== */ [ 개발 환경 설정 ] ​ 개발 툴 : Eclipse 개발 언어 : Java /* =========================== */ ​ /* =========================== */ [소스 코드] package AI3; import jav..

kkh0977.tistory.com

728x90
반응형
728x90
반응형

날씨가 좋아지고 바람이 선선하게 불어오는 계절이 왔습니다. 하지만 코로나19로 인해 나가고 싶어도 갈 곳 이 없어서 나가지 못하는 날들이 많습니다. 올해초에 자전거라도 타보자 라는 생각으로 구입한 자전거가 있었습니다. 하지만 여름에 너무 더운날에는 자전거를 많이 타지 못해서 이제 다시 타려했는데, 바람이 많이 빠져있더군요. 그래서 점검차원에서 자전거 수리점으로갔는데, 아들이 같이가자고 하여 아들을 자전거 프레임위에 세우고 제가 끌고 다녀왔습니다. 아들이 엄청 재밌다고 제가 그날 자전거를 1시간이나 끌었습니다. 그래서 이번에 자전거 안장을 뒤에 달아보자 하는 마음에 이리 저리 알아보았습니다. 제가 가진 자전거가 접이식 미니벨로 입니다. 이 자전거에 유아안장을 달기가 쉽지가 않고 정보도 많이 없었습니다. 제가 가진 자전거는 티티카카 플라이트 P9 이고 티티카카몰에서 구입을 하였습니다. 

http://titicacamall.co.kr/products/4954077923
 

티티카카 플라이트 P9 (22) : 시마노 9단 기어 구동계 고급형, 알로이 프레임, 폴딩 접이식 자전거

[티티카카몰] Since 2006 ~ 2021 : 대한민국 모빌리티 최다판매 브랜드

smartstore.naver.com

유아안장을 알아보며 미니벨로에 많이 설치하는 제품은 아래 이태리 벨레리 유아안장 이였습니다. 벨레리 유아안장의 경우 짐받이와 싯튜브에 설치가 가능한 두가지 제품으로 구성이 되어있고, 안장의 탈부탁이 간편하여 많이 선호하는 것 같습니다.

https://smartstore.naver.com/aduro/products/4427733093
 

이태리 벨레리 자전거 유아안장 : 아드로

[아드로] 유럽 수입 벽난로 / 유아안장을 판매하고있습니다.

smartstore.naver.com

제가가진 티티카카 플라이드 P9의 경우 싯튜브가 아닌 싯포스트(안장기둥)에 설치를 해야한다고 합니다. 이럴경우 안장이 고정되지 않아 좌우로 회전을하여 설치를 권장하지 않는다고 합니다. 아래는 제가 올린 질문과 답변입니다. 

 하지만 인터넷을 돌아다녀 보면 많은 사람들이 싯포스트(안장기둥)에 설치를 한 사진과 후기들이 많이 있습니다. 잘 타는 사람들도 있고, 미니벨로의 경우 자전거가 받는 하중에 의해 자전거 프레임이 깨질수 있다는 의견을 내는 사람들이 있었습니다. 일단 아이의 안전이 가장 중요하기 때문에 일단 싯튜브형은 포기했습니다. 그리고 자전거 짐받이 형으로 다시 알아보기 시작했습니다. 

벨레리 유아안장의 경우 짐받이형은 폭이 120mm~175mm 여야 설치가 가능합니다. 티티카카의 경우 티티카카몰에서 판매하는 자전거 안장이 있는데 폭이 긴쪽이 300mm, 짧은쪽이 20mm 내외로 설치가 불가능하였습니다. 그래서 일단 벨레리 유아안장을 포기하였습니다.

근처 자전거 수리점에서 설치하는 안장은 멋이 없어서 자전거 안장은 아래 티티카카몰에서 파는 것을 장찾해야 나중에 유아아장 없이도 활용성이 높아보여 일단 안장은 아래 링크에서 구입을 하였습니다.

http://titicacamall.co.kr/products/4504646829
 

티티카카 알루미늄 뒷짐받이 : 리어랙 (20인치 - 700C,26인치 일반자전거 호환 / 패니어백 옆가방 장

[티티카카몰] Since 2006 ~ 2021 : 대한민국 모빌리티 최다판매 브랜드

smartstore.naver.com

구입한 안장은 아래와같이 상자안에 비닐의 형태로 오는데, 문제는 아무런 설명서도 없습니다. 그래서 대충 설치된 이미지와 감으로 조립을 하면 되는데, 어렵지는 않습니다.

설치 후 유아안장을 알아보고 아래의 제품으로 구매를 했습니다. 제품에 비해서 가격이 좀 비쌉니다. 하지만 후기도 괜찮고 무엇보다 짐받이 부분에 설치가 가능한 제품이기 때문에 선택을 했습니다.

https://smartstore.naver.com/clcom/products/731601011
 

브라운(갈색)아동용 후방시트 자전거 유아용 시트 후방시트 유아안장 아동시트 자전거아기안장

[씨엘 컴퍼니] 자전거 관련 용부품을 정직하게 판매합니다. 씨엘컴퍼니

smartstore.naver.com

유아안장은 설명서를 보고 차분히 따라하면 설치가 어렵지 않습니다. 아래는 설치된 모습입니다.

짐받이와 안장 설치시 4개의 나사를 조여 설치를 하는데 4개의 구멍중 나사를 아래와 같이 해야 설치가 됩니다. 안장의 프레임이 나사구멍을 가리기 때문인데 아래 사진과 같이 설치를 하면 됩니다. 

안장 설치후 접이도 가능하여 자전거가 보관되었던 구석에도 잘 들어가는 모습입니다. 그리고 유아안장 설치시 어른이타는 안장을 내리고 유아안장의 위치를 잡아야합니다. 안장이 내려가지 않을수 있으니 꼭 참고하세요.

 

이렇게 설치를 완료하고 아들을 뒤에 태우고 집근처를 돌았는데, 처음이라 그런지 좀 무서워했습니다. 2~3번정도 태우고 다녔는데 이렇게 설치시 장단점은 아래와 같습니다.

 

장점

  1. 아이와 함께 자전거를 탈수있어 좋음
  2. 집에서 나가서 할것이 생겨서 아이도 좋아함

단점

  1. 자전거가 일단 무거워짐(짐받이 + 유아안장 무게가 대략 4~5kg 인것 같음)
  2. 탈부착이 자유롭지 못해서 혼자 자전거 탈때도 유아안장을 달고 타야함

미니벨로의 특성상 유아안장 설치는 좀 무리가 있지만, 그래도 설치는 가능합니다. 자전거가 무거워지고 탈부착이 자유롭지 못하다는 단점이 있지만, 아이가 너무 즐거워해서 그걸로 만족합니다. 이로써 하나의 놀이가 생겼습니다. ^^

728x90
반응형
728x90
반응형

집사람 휴대폰이 3년이 넘어가서 갤럭시 플립 3을 사전예약으로 구매를 하게 되었습니다. 8월에 주문을 했는데 한달이 걸려서 도착을 했습니다. 배송이 오래 걸릴 거라는 것을 알고 있었습니다. 한달을 기다릴 정도로 사전 주문이 많았다니 이번 플립은 잘 만들어졌다는 소리가 들려서 그런 것 같습니다. 저도 구매를 하고 싶었지만 아직 폰을 바꾼 지 1년이 안되어서 이번에는 꾹 참았습니다. 

 

예전에 사전예약 구매를 했을때는 택배로 보내줬던 거와 달리 이번에는 삼성가전 배송기사님이 직접 들고 저희 집에 방문을 하였습니다. 방문 전날에 문자로 일정을 알려주었고, 당일날에는 전화로 알려주었습니다. 그리고 쇼핑백에 담겨서 배송을 해주었는데, 느낌이 새로웠습니다.

사전예약 마지막날 부랴부랴 삼성닷컴에서 자급제 폰으로 주문을 한 것이라 가장 가지고 싶어 했던 라벤더 색상을 주문하지는 못했습니다. 그래도 그레이 색상이 있어서 주문을 했는데, 그레이 색상도 생각 이상으로 색상과 다지인이 좋아서 와이프가 좋아했습니다. 구성은 아래 사진과 같습니다.

스마트폰 본체와 충전 케이블이 전부였습니다. 얼마전부터 충전기와 이어폰은 본 제품에서 빠져있는데, 참 아쉽습니다. 

이렇게 받은 폰을 이제부터 설정하여야하는데, 삼성 스마트폰 사용자라면 이전에 사용하던 스마트폰의 데이터를 쉽고 빠르게 이전할 수 있습니다.

 

옛날에는 스마트폰을 구입한 곳에서 데이터를 옮겨 주었는데, 이제는 그렇게 해주지 않습니다. 그렇기 때문에 직접 데이터를 옮겨야 합니다. 방법을 이제 하나씩 알아보겠습니다. 하나하나 따라 하면 어렵지 않으니 천천히 따라와 주십시오.

 

카카오톡 대화방 백업

카카오톡 대화방 백업이 필요없다면 이 단계는 지나쳐도 됩니다. 하지만 새 스마트폰으로 카카오톡을 사용하면 기존에 사용하던 스마트폰에서는 더 이상 카카오톡이 실행되지 않기 때문에 대화방 복구가 힘듭니다. 그래서 첫 번째로 대화방을 백업해주는 것이 좋습니다. 

카카오톡을 실행하여 설정에 찾아보면 대화 백업이라는 메뉴가 있습니다. 메뉴에서 대화 백업을 실행하면 백업시 사용할 비밀번호를 설정하도록 합니다. 

백업이 진행이 되고, 백업에 대한 내용이 나타나는데 14일동안 복원을 할 수 있도록 자동을 설정이 됩니다.

아직 유심은 기존 스마트폰에서 제거하지 않고 그대로 둡니다.

새로운 스마트폰 초기 설정

새로운 스마트폰에 전원을 켭니다. 처음에 아래와 같이 초기 설정 메뉴가 나타납니다. 언어를 선택하고 법적 고지를 동의하고 나면 와이파이 설정을 진행합니다.

* 자급제 폰이라 일부 내용이 다를 수 있습니다.

 

와이파이 설정을 진행하고 나면 서비스 공급자 설정으로 재기동을 합니다. 그리고 나면 바로 앱 및 데이터 복사를 할 수 있는 안내창이 나타납니다. (제가 S20 울트라를 쓰는데, 뭔가 순서가 쉽게 바뀐 듯합니다.) 다음을 누르면 자동으로 Smart Switch 앱의 업데이트를 진행합니다.

이제 데이터를 이동할 수 있도록 업데이트가 끝나고 아래와 같이 이전에 사용한 기기의 OS를 선택하라고 나타납니다. 이전에 사용한 기기는 갤럭시 S9 으로 Galaxy를 선택하여 주고 연결 방식은 무선 연결을 선택하여 줍니다. 그러면 이전 기기에서 Smart Switch 앱을 실행하라고 안내가 나타납니다.

안내대로 이전 기기에서 Smart Switch 앱을 실행합니다. 처음 앱을 실행시켰다면 사용자 이용약관 동의와 앱 권한 설정이 나오는데 동의와 허용을 하여주십시오. 그렇게 해주면 아래 사진과 같이 데이터를 보낼 것인지 아니면 받을 것인지 선택하는 화면이 나타납니다. 당연히 이전 기기에서 새로운 기기로 데이터를 보내야 하기 때문에 "데이터 보내기" 선택하여 줍니다. 그리고 연결방식은 이번에도 무선 연결을 선택하여 줍니다.

이렇게 하면 스마트폰 기기들이 서로 연결되며 화면이 아래와 같이 넘어갑니다. 새로운 스마트폰 화면에서 이전 스마트폰에서 가져올 데이터를 선택할 수 있습니다. 이전 스마트폰의 모든 것을 가져오기 때문에 모두 선택하여 가져오면 됩니다. 만약 필요 없는 데이터가 있다면 선택에서 제외를 하여 전송하지 않을 수 있습니다. 저는 아래 사진과 같이 SD카드의 데이터는 제외하였습니다. 아래 "전송"버튼을 누르면 데이터 전송이 시작됩니다.

가져올 데이터 중 "계정" 부분을 선택하면 이전 스마트폰에서 사용하던 계정도 복사가 되었습니다. 이전과 좀 순서가 달라지긴 한것 같지만, 쉽게 변경이 된 것 같습니다. 

계정 관련 복사에 대해 입력이 완료되면 아래와 같이 데이터를 복사해 옵니다.

복사가 진행이되며 새로운 스마트폰에서 휴대전화 보호, 구글 어시스턴트 사용 여부, 삼성 계정 로그인 등이 나타나는데 순서대로 진행을 하시면 됩니다. 구글 어시스턴트의 경우 "나중에"를 눌러 넘어가셔도 무방합니다.

새로운 스마트폰에 아래 그림과 같이 전송 상태가 나타나며 전송이 완료되면 전송 결과가 나옵니다.

이렇게 데이터 전송은 모두 마쳤습니다. 하지만 전송이 되지 않은 앱들이 존재합니다. 이러한 앱은 아래 사진과 같이 표시가 되는데, 이전 버전으로 호환되지 않거나 출처를 알 수 없는 앱들은 전송이 되지 않습니다. 이러한 앱들은 직접 다운로드하여 설치하여야 합니다.

 

카카오톡 대화방 복원

(이부분은 와이프가 혼자서 진행을 하여 사진이 없습니다. ㅜㅜ) 앞에서 백업한 카카오톡 대화방 복원은 유심을 새로운 휴대폰에 설치하여야 합니다. 새로운 스마트폰에서 유심을 설치 후 카카오톡을 실행하면 인증을 합니다. 그리고 카카오 계정으로 로그인하면 자동으로 백업된 데이터가 있다고 표시가 되며 백업 시 입력한 비밀번호를 요구합니다. 비밀번호를 입력하면 이전 스마트폰의 대화방이 그대로 새로운 스마트폰에 복원됩니다. 어려운 부분은 없으니 해보시면 압니다.

 

새로운 스마트폰의 기타 설정

데이터는 모두 이동하였지만 몇가지 설정과 확인은 필요합니다. 아래는 재설정 혹은 확인이 필요한 부분에 대하여 정리하여 보았습니다.

  1. 지문인식 재설정
  2. 은행관련 앱 실행하여 정상 로그인 확인 (은행 기기 설정 시 신규 기기 추가, 이전 기기 삭제 필요)
  3. 자주 사용하는 앱을 실행하여 정상 동작 확인
  4. 새로운 스마트폰의 신규 기능 이해하기

지금까지 스마트폰을 새로 구입하였을때, 데이터를 이동하는 방법을 알아보았습니다. 삼성폰에서 벋어 나지 못하는 몇 가지 이유가 있는데, 첫 번째가 "삼성페이", 두 번째가 "Smart Switch" 인 것 같습니다. 정말 너무 쉽게 데이터를 이동해주기 때문에 편리합니다.

728x90
반응형
728x90
반응형

동작방식

참고사이트 설명 참조

시간복잡도

 세그먼트 트리를 이용할 경우 기존의 for문이 O(N)의 시간 복잡도보다 빠른 O(logN)의 시간 복잡도

참고사이트

https://cocoon1787.tistory.com/313
 

[자료구조] 세그먼트 트리(구간트리, Segment Tree)로 구간 내 최소값 찾기

세그먼트 트리(Segment Tree)란? 알고리즘 문제를 풀다 보면 정렬되어 있지 않은 구간 내의 합이나 최솟값들을 빠르게 찾아야 하는 경우가 많습니다. 질문이 1개일 경우 간단하게 for문을 통해서 O(N)

cocoon1787.tistory.com

 

기본코드

10 4
75
30
100
38
50
51
52
20
81
5
1 10
3 5
6 9
8 10
package segmenttree;

import java.io.*;
import java.util.StringTokenizer;

public class Rmq {

    static int[] numbers;
    static int[][] questions;
    static int[] tree;

    public static void init(int node, int start, int end) {
        if (start == end) {
            tree[node] = numbers[start];
        } else {
            init(node*2, start, (start+end)/2);
            init(node*2+1, (start+end)/2+1, end);
            tree[node] = Math.min(tree[node*2],tree[node*2+1]);
        }
    }

    public static int query(int node, int start, int end, int a, int b) {
        if (a > end || b < start) {
            return -1;
        }
        if (a <= start && end <= b) {
            return tree[node];
        }
        int left = query(node*2, start, (start+end)/2, a, b);
        int right = query(node*2+1, (start+end)/2+1, end, a, b);
        if (left == -1) {
            return right;
        } else if (right == -1){
            return left;
        } else {
            return Math.min(left, right);
        }
    }

    public static void main(String[] args) throws IOException {

        System.setIn(new FileInputStream("input\\rmq.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        numbers = new int[N];
        questions = new int[M][2];
        tree = new int[N*4];

        for (int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            numbers[i] = Integer.parseInt(st.nextToken());
        }

        for (int i=0; i<M; i++) {
            st = new StringTokenizer(br.readLine());
            questions[i][0] = Integer.parseInt(st.nextToken());
            questions[i][1] = Integer.parseInt(st.nextToken());
        }

        br.close();

        init(1, 0, N-1);

//        for (int i=0; i<tree.length; i++) {
//            System.out.println("tree[" + i + "] : " + tree[i]);
//        }

        for (int i=0; i<M; i++) {
            bw.write(query(1, 0, N-1, questions[i][0]-1, questions[i][1]-1)+"\n");
        }

        bw.flush();
        bw.close();
    }
}
728x90
반응형
728x90
반응형

얼마전 인스타 그램을 돌아다니다가 눈에 뛰는 광고를 접하게 되었습니다. 바로 집에서 하는 줄넘기인데, 생각보다 마음에 들어서 구입을 했습니다. 코로나 이전에는 운동으로 스트레스를 풀었는데 코로나 이후로 운동을 할 수 있는 상황이 아니다보니 살만 쪄서 이제는 운동을 조금만 하면 숨이 턱턱 막히더라고요. 그래서 체력도 기르고 지방을 연소할 수 있다는 생각에 구입을 했습니다. 그전에도 많은 홈트레이닝 도구를 가지고 있었지만 작심삼일이였는데, 이번에도 작심삼일일것 같지만 그래도 왠지 이런거 없으면 운동을 더 안하니 구입을 했습니다.

 

제품은 홈트대장 멀티 줄넘기였습니다. 야외에서는 줄을 바꿔서 이용을 할 수 있고, 집에서는 추가 달린 줄로 줄넘기 흉내를 내서 효과를 보도록 하는 제품입니다. 구성은 아래 사진과 같습니다.

 

그리고 같이 구매한 발판입니다. 발판은 사진관 같이 엄지손가락 한마디 정도의 두께입니다. 그리고 푹신푹신 느낌입니다. 층간소음이 걱정된다면 구입할만 합니다. 저는 고질적인 무릎부상으로 예방차원에서 구입을 하였습니다.

일단 테스트로 10분정도 줄넘기를 해보았습니다. 몸무게와 타이머를 설정하고 줄넘기 시작~

타이머는 줄넘기를 멈추면 멈춥니다. 그래서 순수 줄넘기를 한 시간을 알려주게 되어있습니다. 10분에 2041회 298칼로리가 소모되었습니다. 10분을 연달아 뛰니 땀이 아래 사진처럼 나오네요. 일단 운동효과는 어느정도 만족입니다.

근데 10분을 뛰었는데 발판이 아래와 같이 발바닥 자국도 생기고 쭈굴쭈굴 해지는 현상이 있습니다. 그리고 발판이 고정이 아니라 발바닥에 붙어서 움직이는 불편함이 있습니다. 아무래도 몇번하고 나면 망가지는 것이 아닌지 의심스럽습니다. (발판이 소무품이였나~?)

일단 운동효과는 만족스럽습니다. 문제는 얼마나 꾸준히 운동을 하느냐 입니다. 집에서 하면 아들이 방해를 하지않는 시간에 운동을 해야하는데 쉽지가 않습니다.

 

 

홈트대장 멀티 줄넘기 최종 평가: ★★★★☆

  • 운동효과는 좋으니 꾸준히만 한다면 살은 빠질것 같습니다.
  • 내구성은 의심됩니다.
  • 가격이 생각보다 비쌉니다. (1만원대였다면 좋았을 듯한 느낌)
  • 발판은 필요하지만 소모성인것 같은 느낌입니다.

 

※ 직접 구입하여 실제 사용해보고 작성하는 리뷰 글 입니다. ※

728x90
반응형
728x90
반응형

Fenwick Tree는 Binary Indexed Tree라고도 하며, 줄여서 BIT라고 합니다.

동작방식

참고사이트에 자세한 동작 방식을 확인하여 주십시오.

시간복잡도

펜윅 트리는 대해 O(log n) 시간 복잡도를 가짐

참고사이트

https://www.acmicpc.net/blog/view/21
 

펜윅 트리 (바이너리 인덱스 트리)

블로그: 세그먼트 트리 (Segment Tree) 에서 풀어본 문제를 Fenwick Tree를 이용해서 풀어보겠습니다. Fenwick Tree는 Binary Indexed Tree라고도 하며, 줄여서 BIT라고 합니다. Fenwick Tree를 구현하려면, 어떤 수 X

www.acmicpc.net

기본코드

5 3
5 4 3 2 1
1 3
2 4
5 5
package segmenttree;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Fenwick {

    static int N;
    static int M;
    static int[] numbers;
    static int[][] questions;
    static int[] tree;

    public static void update(int x, int val) {
        for (int i=x; i<=N; i+=i&-i) {
            tree[i] += val;
        }
    }

    public static int query(int x) {
        int ans = 0;
        for (int i=x; i>0; i-=i&-i) {
            ans += tree[i];
        }
        return ans;
    }

    public static void main(String[] args) throws IOException {

        System.setIn(new FileInputStream("input\\rsq.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        numbers = new int[N+1];
        questions = new int[M][2];
        tree = new int[N+1];

        st = new StringTokenizer(br.readLine());
        for (int i=1; i<=N; i++) {
            numbers[i] = Integer.parseInt(st.nextToken());
        }

        for (int i=0; i<M; i++) {
            st = new StringTokenizer(br.readLine());
            questions[i][0] = Integer.parseInt(st.nextToken());
            questions[i][1] = Integer.parseInt(st.nextToken());
        }

        br.close();

        for (int i=1; i<=N; i++) {
            update(i, numbers[i]);
        }

        for (int i=0; i<tree.length; i++) {
            System.out.println("tree[" + i + "] : " + tree[i]);
        }

        for (int i=0; i<M; i++) {
            bw.write((query(questions[i][1]) - query(questions[i][0]-1))+"\n");
        }

        bw.flush();
        bw.close();
    }
}

 

728x90
반응형
728x90
반응형

요즘 재택근무를 많이 하면서 데스크톱으로 업무를 보았는데, 여름이 오면서 가장 힘든 건 역시나 의자에 앉아있을 때 엉덩이에 땀나는 게 가장 힘듭니다. PC에서 나오는 열기도 무시 못하는데 점심시간으로 가면 갈수록 더워지는 날씨도 선풍기 하나로 버티기 너무 힘들더군요. 그래서 사용하던 노트북을 꺼내서 열어 사용을 해보았습니다. 언제 샀는지도 기억이 나지 않는 아주 오래된 노트북인데, 정말 너무너무 느리더군요. SSD도 망가져 HDD로 기동을 하니 느린 것도 그렇고 팬 돌아가는 소리가 전쟁 난 줄 알았습니다. 캠을 사용하는 일도 많아서 노트북을 겸사겸사 구매하기로 하여 알아보았습니다.

일단 제가 구매를 하기위한 노트북의 조건은 i5 11세대 CPU에 16GB 메모리 사양으로 알아보았습니다. 지난번 노트북이 너무 무거워서 가벼운 노트북은 옵션으로 생각을 하고 검색을 하였습니다. 다나와 사이트에서 가장 인기가 높은 녀석이었고 2~3주 사용후기를 검색하고 신중히 구매를 진행하였습니다.

여기서 가장 걸리는 부분이 OS 미포함 이라는 것인데, OS는 정품 FPP를 가지고 있어서 크게 문제가 되지 않았습니다. 가장 걸리는 것은 역시나 가격이었습니다. 저장 용량이 256GB인 제품인데 업그레이드도 가능하다고 나옵니다. 판매처에서 제품을 오픈하여 업그레이드를 해주는 매장도 있었지만, 역시나 개봉은 제가 직접 하는 것이 좋다고 생각했고, 256GB도 충분하여 굳이 업그레이드를 진행하지 않았습니다. 저장용량은 나중에 외장형 HDD를 사용하는 게 더 효율적이라고도 생각을 했습니다.

 

주문 후 다음날 상품이 도착했습니다. 상품 포장이 깔끔하니 아주 마음에 듭니다.

개봉하고 처음 노트북을 들었을때 느낌은 이루 말할 수 없습니다. 너무 가볍습니다. 이전 노트북 무게가 3kg가 넘었는데, 1.35kg이라 확실히 가볍다는 느낌이 큽니다. 신세계를 접하는 것 같습니다. 

제가 이전에 사용하던 15인치 MSI 노트북과 크기를 비교해보았습니다. 그램을 아래두고 옛날 노트북을 위에 두었는데, 크기는 거의 비슷합니다. 옆에 사이즈는 동일하고 위아래 사이즈가 조금 큰데 많이 차이가 나지 않아서 동일하다고 봐야 할 것 같습니다.

제품을 기동하여 윈도우 설치를 진행합니다. 처음 전원을 켜면 동봉된 매뉴얼이 화면에 표시되고 ESC키를 눌러 나와 설치를 진행합니다.

모든 설치를 진행하고 네이버에 접속해 보았습니다. 역시나 17인치라 화면도 크고 이전 노트북에 비해서 화질이 좋습니다. 아주 마음에 드네요.

 

아직 사용한지 삼일 정도 되었는데, 특이사항이 있으면 이 글에 추가하도록 하겠습니다. 일단 아주 아주 아주~~ 마음에 듭니다. 사무용뿐만 아니라 간단한 인터넷도 이제는 데스크 탑을 켜지 않고 해결할 수 있을 것 같습니다.

 

 

 

※ 직접 구입하여 실제 사용해보고 작성하는 리뷰 글입니다. ※

728x90
반응형
728x90
반응형

얼마 전에 구매한 샥스 s3i 게임패드에 대한 리뷰를 하도록 하겠습니다. 구매 이유는 제가 원신이라는 게임을 PC로 즐기는데, 여름이 되니 PC를 켜면 너무 더워서 한 시간 이상을 앉아서 할 수 없더군요. (제방에 에어컨이 없습니다. 내년에는 창문형 에어컨을 꼭 사야겠네요.) 원신이라는 게임이 PC와 모바일이 연동됩니다. 그래서 갤럭시탭 S6에서 가끔 들어가 확인 정도를 했는데, 이제는 갤럭시탭에서 플레이를 하려고 이리저리 알아보던 중 마음에 드는 게임패드를 발견하여 바로 구매를 했습니다. 일단 게임 설명 자체에 원신을 넣어놔서 무조건 구매를 했습니다.

 

https://smartstore.naver.com/shaks/products/5108929177
 

무선게임패드 : 샥스

[샥스] [공식몰]샥스(SHAKS) 클라우드 게임에 최적화된 국내 개발 유무선 게임패드

smartstore.naver.com

 

저는 쿠팡에서 구매를 해서 다음날 배송을 받았습니다. 위 링크는 공식몰 링크입니다. 요즘 가격보다는 배송 빠른 게 짱이더라고요. 배송은 아래와 같이 상자를 하나 받았습니다.

상자를 열어보니 음?????? 내용물이 너무 간단하고 비닐로 쌓여있지도 않고 아래 사진과 같이 제품만 달랑 들어있습니다. 그렇다고 상자에 실이 붙어있어서 개봉을 못하게 한 것도 아니고... 처음에는 중고인가??라는 의심이 들더군요.

안에 내용물을 보니 중고는 아닌 것 같습니다.

s3i는 폰을 거치하는 거치대가 같이 달려있어서 폰으로 게임을 하기에는 좋을 것 같습니다.

게임패드 사양은 모바일, PC, XBOX GAME PASS 등을 지원하고 모바일의 경우 안드로이드, iOS 등을 지원한다고 나옵니다. 일부 게임은 모바일과 페어링 하여 바로 인식 가능하여 플레이가 가능하고, 지원을 안 하는 경우에는 매핑 프로그램으로 컨트롤이 가능하다고 합니다. 제가 원했던 원신은... 페어링 해서 바로 인식하지 않았습니다. 그래서 매핑 프로그램을 설치해야 하는데 매핑 프로그램은 '샥스 게임 허브'라는 어플을 설치해주면 됩니다.

국내에서 개발을 해서 그런 건지 몰라도 업데이트는 꾸준히 진행이 되는 느낌입니다. 그러나 원신 매핑 프로그램으로 구동 시 플레이스테이션과 같이 컨트롤러 전부에 대한 인식이 불가능해 보입니다. 제가 모든 화면에 매핑을 한다면 가능하겠지만, 그만 큼의 시간과 노력이 필요합니다. 그래서 저는 게임 플레이 부분에 대한 매핑을 해두고 맵을 연다 거나 상점에 들어가거나, 메뉴를 눌러 동작하는 부분에 대한 것은 그냥 터치로 플레이를 합니다. 아래는 제가 매핑하여 플레이하는 부분에 대한 영상입니다.

장점

  1. 매핑만 된다면 태블릿 PC or 모바일 기기를 들고 직접 조작하는 것 보다 편하다
  2. PC가 없더라도 태블릿PC or 모바일 기기와 게임패드만 있으면 어디서든 게임을 즐길 수 있다.
  3. PC 연결도 지원하여 PC게임도 가능하다.
  4. 태블릿 PC or 모바일 게임 시 페어링이 불가하여 인식안 되는 게임도 매핑모드로 게임을 할 수 있다.
  5. 반응속도가 빠르다. (다른 게임패드를 사용한 적은 없지만, 반응 속도가 빠르다고 느껴짐)

단점

  1. 매핑이 안되는 게임은 직접 매핑을 해줘야 한다.
     : 누군가 매핑 정보를 올려두었다면 그것을 사용하겠지만, 갤럭시탭 S6에 원신 매핑 정보는 없었다.
  2. 페어링 모드가 여러 개가 존재하여 처음 사용 시 생소할 수 있다.
  3. 키감은 PS5 패드 등에 비해 떨어진다.
  4. 사용 매뉴얼이 상세하지 않아서 어느 정도 사용해 가면서 익숙해져야 한다.

 

※ 직접 구입하여 실제 사용해보고 작성하는 리뷰 글입니다. ※

728x90
반응형
728x90
반응형

 

 

동작방식

맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택하고, 이 노드에 적용 가능한 동작자 중 하나를 적용하여 트리에 다음 수준(level)의 한 개의 자식노드를 첨가하며, 첨가된 자식 노드가 목표노드일 때까지 앞의 자식 노드의 첨가 과정을 반복해 가는 방식입니다.

  • 장점
    • 단지 현 경로상의 노드들만을 기억하면 되므로 저장공간의 수요가 비교적 적다.
    • 목표노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.
  • 단점
    • 해가 없는 경로에 깊이 빠질 가능성이 있다. 따라서 실제의 경우 미리 지정한 임의의 깊이까지만 탐색하고 목표노드를 발견하지 못하면 다음의 경로를 따라 탐색하는 방법이 유용할 수 있다.
    • 얻어진 해가 최단 경로가 된다는 보장이 없다. 이는 목표에 이르는 경로가 다수인 문제에 대해 깊이우선 탐색은 해에 다다르면 탐색을 끝내버리므로, 이때 얻어진 해는 최적이 아닐 수 있다는 의미이다.

시간복잡도

- 인접리스트 : O(|V| + |E|) (정점의 개수:V, 간선의 개수:E)

- 인접행렬 : O(V^2) (정점의 개수:V)

참고사이트

https://ko.wikipedia.org/wiki/%EA%B9%8A%EC%9D%B4_%EC%9A%B0%EC%84%A0_%ED%83%90%EC%83%89
 

깊이 우선 탐색 - 위키백과, 우리 모두의 백과사전

깊이 우선 탐색의 애니메이션 예시 깊이 우선 탐색( - 優先探索, 영어: depth-first search, DFS)은 맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택하고, 이 노드에 적용 가능한 동작

ko.wikipedia.org

기본코드

입력값

7
8
1 2
1 3
2 4
2 5
3 7
4 6
5 6
6 7  

코드

package study.graph;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;

public class DFS {
	static int[] used;
	static int[][] map;
	static int N, M;
	public static void main(String[] args) throws IOException{
		
		System.setIn(new FileInputStream("input\\dfs.txt"));
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		N = Integer.parseInt(br.readLine());
		M = Integer.parseInt(br.readLine());
		
		used = new int[N+1];
		map = new int[N+1][N+1]; // 인접행렬을 이용하기 위한 2차원 배열 생성
		
		StringTokenizer st = null;
		for(int m=0; m<M; m++) {
			st = new  StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			
			map[a][b] = 1;
			map[b][a] = 1; //양방향이기 때문에..
		}
		
		System.out.print("그래프 DFS 방문 순서 : " );
		dfs(1);
		
		bw.close();
		br.close();
	}
	
	static void dfs(int point) {
		Stack<Integer> st = new Stack<Integer>();
		st.add(point);
		used[point] = 1; // 방문표시
		System.out.print( point + " ");
		
		while(!st.isEmpty()) {
			st.pop();
			for(int i=1; i<=N; i++) {
				if(map[point][i]==1 && used[i] == 0) {
					// 다음 노드와 연결되어 있고 아직 방문하지 않았으면 st에 넣고, 재귀실행
					st.add(i);
					used[i] = 1;
					dfs(i);
				}
			}
		}
		
	}
}
728x90
반응형
728x90
반응형

 

동작방식

하나로 시작 정점을 방문한 후 시작 정점에 인접한 모든 정점들을 우선 방문하는 방법입니다. 더 이상 방문하지 않은 정점이 없을 때까지 방문하지 않은 모든 정점들에 대해서도 너비 우선 검색을 적용합니다.

 

장점

  • 출발노드에서 목표노드까지의 최단 길이 경로를 보장한다.

단점

  • 경로가 매우 길 경우에는 탐색 가지가 급격히 증가함에 따라 보다 많은 기억 공간을 필요로 하게 된다.
  • 해가 존재하지 않는다면 유한 그래프(finite graph)의 경우에는 모든 그래프를 탐색한 후에 실패로 끝난다.
  • 무한 그래프(infinite graph)의 경우에는 결코 해를 찾지도 못하고, 끝내지도 못한다.

 

시간복잡도

DFS 시간복잡도와 동일함

- 인접리스트 : O(|V| + |E|) (정점의 개수:V, 간선의 개수:E)

- 인접행렬 : O(V^2) (정점의 개수:V)

참고사이트

https://ko.wikipedia.org/wiki/%EB%84%88%EB%B9%84_%EC%9A%B0%EC%84%A0_%ED%83%90%EC%83%89
 

너비 우선 탐색 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

기본코드

입력값

7
8
1 2
1 3
2 4
2 5
3 7
4 6
5 6
6 7  

코드

package study.graph;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BFS {

	static int[] used;
	static int[][] map;
	static int N, M;
	public static void main(String[] args) throws IOException{
		
		System.setIn(new FileInputStream("input\\bfs.txt"));
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		N = Integer.parseInt(br.readLine());
		M = Integer.parseInt(br.readLine());
		
		used = new int[N+1];
		map = new int[N+1][N+1]; // 인접행렬을 이용하기 위한 2차원 배열 생성
		
		StringTokenizer st = null;
		for(int m=0; m<M; m++) {
			st = new  StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			
			map[a][b] = 1;
			map[b][a] = 1; //양방향이기 때문에..
		}
		
		System.out.print("그래프 BFS 방문 순서 : " );
		bfs(1);
		
		bw.close();
		br.close();
	}
	
	static void bfs(int st) {
		Queue<Integer> q = new LinkedList<Integer>();
		q.add(st);
		used[st] = 1; //방문표시
		
		while(!q.isEmpty()) {
			int x = q.poll();
			System.out.print( x + " ");
			
			for(int i=1; i<=N; i++) {
				if(map[x][i] == 1 && used[i] == 0) {
					// 다음 노드와 연결되어 있고 아직 방문하지 않았으면 q에 넣음
					q.add(i);
					used[i] = 1;//방문 표시
				}
			}
		}
	}
}
728x90
반응형

+ Recent posts