반응형
SM6 2016 오랜기간 우리 가족과 함께 해온 차로
아버지께서 신차로 교체하시면서 나에게로 오게 되었다.
사실 중간 중간에 사용하기도 했고 관리도 함께 했기 때문에 안심스럽기도 하다.

오랜된 차이지만 약 10만이 거의 다되어 갈 때 즈음에
르노와의 엔진 결함 소송에서 결국 인정받고 엔진 교체가 이루어져서
20만 주행거리이지만 다른 소모품만 교체한다면 크게 문제 될 것은 없어 보인다.
(사실 이것도 점검 후 교체해 주셨고 이후 정비도 지원해 주신다 하셨다.)

때문에 기존에 렌트하고 다니며 즐겨 사용하던 CarPlay를 사용하고 싶어서
비싼 공임비 들이지 않고 직접 하는 과정을 포스팅 하려고 한다.

소켓 주문

다음에서 르노의 모든 부품을 주문할 수 있다.

 

★대한민국1등! 르노코리아자동차 순정부품 순정용품 쇼핑몰★

에스엠오토몰이 직접 엄선한 테마별 추천상품 베스트 아이템 상품 리스트 베스트 아이템 상품 리스트

www.smautomall.com

 

USB 소켓을 주문해주시면 되는데 SM6는 9만원대로 상당히 비싸다.

때문에 호환이 되는 동일한 제품인 QM6의 USB 소켓으로 주문하면 된다.

주의할 점은 꼭 카플레이 가능이라고 적혀져 있는 제품으로 구매해야 한다.

 

회원가입 쿠폰과 배송비 추가할인으로 53,900원에 구매하였다.

 

 

네비 업데이트

다음 사이트에서 앱과 지도 모두 업데이트 해준다.

 

TMAP MOBILITY

통합 모빌리티 플랫폼 티맵의 모든 것을 티맵모빌리티닷컴에서 확인하세요

tmapmobility.com

 USB 16GB에

두개 다 다운받으시고 압축해제 후 다음과 같은 폴더 두개를 두면 된다.  

2024년도에 이미 업데이트를 했기 때문에 업데이트 과정은 생략하겠다.

(2024년도 업데이트 목록에도 CarPlay는 존재한다.)

소켓 설치

이 과정에서 조금 겁먹긴 했는데 수십번 영상 돌려보면서 진행하였다.

차량 특성상 부품이 잘 고정되어 있어 탈거 과정에서 큰 소리가 나더라도 문제 없다.

 

다음 부분을 브레이크를 밟은 상태에서 기어를 N단으로 놓고

검지와 중지를 이용하여 손가락을 넣어 잡아 땡기면 된다.

평지에서 전자식 파킹 브레이크 작동 후에 하길 권장한다.

 

그럼 다음과 같이 탈거가 된다.

여기서 기어봉를 분리하고~

가죽을 분리하고~

연결선을 다 분리하고~

그럴 필요 없다 그냥 두개의 선만 뽑고 USB 소켓 탈거 후 다시 장착만 하면 된다.

 

밤에 작업해서 잘 보이지 않을 수 있는데 

파란선과 검은선 두개를 눌러서 빼주기만 하면 된다.

 

선을 제거하고 난 후 USB 소켓을 분리해줘야 하는데

소켓을 아래에서 위로 밀어주면 된다.

잘 안밀려서 강하게 밀다가 위로 튕겨서

하마터면 앞유리에 기스날 뻔 했다...ㅎ

 그럼 다음과 같은 USB 소켓을 볼 수 있다.

 

이제 역순으로 새로 산 소켓을 달아보자.

( 어두운 밤에 하다가 분리한 소켓을 다시 달았다.. ㅋㅋㅋㅋㅋ

꼭 잘 보시고 새로 산 소켓으로 장착하세요.

생산년도로 분별 가능 ) 

 


 

개발자 모드 코딩

개발자 모드로 코딩한다고 하는데 사실 버튼만 누르면 된다.

아주 쉬우닌깐 금방 할 수 있다.

 

1. USB 생성

먼저 포맷된 USB에 다음과 같은 파일명으로 메모장을 만든 후

확장자를 lge변경한다.

DbgEnable

 

2. 개발자 모드 접속

다음과 같은 경로로 들어갑니다.

( 메뉴 - 멀티미디어 - 설정 - 사진 설정 )

 

그럼 이제 준비한 USB를 꽂고 다음과 같은 메세지가 나오면

 ( 기기에 음악 파일이 없습니다. )

 

왼쪽 상단 1회

오른쪽 하단 12회를 톡톡 간격을 두고 눌러준다.

( 왼쪽 상단 1회 누르고, 오른쪽 하단을 톡톡톡톡톡 계속 하다보면 들어가진다. )

 

 

3. Carplay 활성

이제 개발자 모드에서 우리는 필요한 부분인 carplay모드만 활성화 해주면 되기 때문에

다음과 같은 경로로 접속 해준다.

DiagRw - GEN2.0 - Carplay ( Present 변경 )

 

 

Carplay, AAP Present로 변경해주면 된다.

( AAP는 안드로이드 오토로 사용하실 분들은 변경하시면 되는데 혹시 모르니 해뒀습니다. )

이후 매우 중요한 SAVE까지..

 

여기서 이제 다됐다고 재부팅 한다고 시동끄고

내비 전원 끄고 다시 켜보고 해봤는데

이게 재부팅이 아니다.

 

다음 사진처럼 전원을 꾹 누르면 알아서 재부팅이 된다.

 

이제 다음과 같이 사용할 수 있다.

( 추가로 수정해서 사진 올리도록 하겠습니다.)

 

드디어 carplay 핸드폰으로 내비도 검색하고 음악도 키면 바로 되는게 아주 좋은 것 같다.

 

역시 몇 만여가지의 부품과 각종 시스템을 구현한 소프트웨어의 집합체
자동차를 소프트웨어 코딩을 통해 바꿔보기도 하고..
편리함을 위해 작업했지만, 나름 재미도 있는 작업이였다. 


추가로
2016년 당시 조명회사 아우디와 같은 LED를 단 SM6
애니메이션 방향 지시등이 되나 알아봤더니
하드웨어 코딩으로 따로 있긴 하지만 잘못 건드렸다가
시스템에 이상이 생길 것 같아 그냥 놔두기로 했다.
그게 없다고 해서 불편한 것도 아니니...
반응형
반응형
이번에는 다음과 같은 역 피라미드를 만들어 보자.


*********
*******
*****
***
*

 

문제 핵심

  • 1 <= N <= 100
  • 2 * N - 1 개의 별을 찍어낸다고 한다.
  • 가운데 정렬로 별을 (2 * N - 1), (2 * N - 3), ..., 1개의 별을 찍어내는 문제

풀이 과정

별 찍기 5와 같이 규칙을 찾아 풀어나가 보자.

1. N이 5일 때 공백의 개수는 0, 1, 2, 3, ..., N -1개이다.

2. 이 때 별의 개수는 (2 * N - 1)부터 시작하여 2개씩 적어진다.. 즉 홀수로 진행된다.

3. 각각의 층은 (2 * N - 1), (2 * N - 2), ..., N로 감소된다.

4. 1부터 N + i까지 항상 반복하면 i값에 따라 3번의 조건을 만족하고 j < N - i값에 따라 공백은 점차 늘어나게 된다.

5. 나머지를 별로 채움으로써 피라미드처럼 나오게 된다.

for (int i = N - 1; i >= 0; i--) {
    for (int j = 1; j <= N + i; j++) {
        if(j < N - i) {
            stringBuilder.append(' ');
        }
        else {
            stringBuilder.append('*');
        }
    }
    stringBuilder.append('\n');
}

5번 문제를 반대로 생각하여 기존의 코드를 조금만 바꾸면 되는 문제이다.
이제 다음문제는 다양한 조건으로 9번을 풀기 전에
뇌를 다지는 문제가 될 것이다.

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringBuilder stringBuilder = new StringBuilder();

        for (int i = N - 1; i >= 0; i--) {
            for (int j = 1; j <= N + i; j++) {
                if(j < N - i) {
                    stringBuilder.append(' ');
                }
                else {
                    stringBuilder.append('*');
                }
            }
            stringBuilder.append('\n');
        }

        System.out.println(stringBuilder);
    }
}
반응형
반응형
이번에는 2개의 문제를 합쳐서 피라미드를 만들어 보자.
1, 3, 5, 7
1부터 2씩 증가하여 별을 가운데 정렬하는 구조이다.

*
***
*****
*******
*********

문제 핵심

  • 1 <= N <= 100
  • 2 * N - 1 개의 별을 찍어낸다고 한다.
  • 가운데 정렬로 별을 1부터 2씩 증가하여 출력하여 피라미드를 만들어 내는 구조

풀이 과정

별 찍기 1과 같이 이차원 배열을 통해 그려나가는 방식이 있고, 공백의 개수와 별의 개수의 규칙을 찾아 그려나갈 수 있다.

 

다음 풀이는 규칙을 찾아 문제를 풀어나가는 경우이다.

1. N이 5일 때 공백의 개수는 N - 1, N - 2, ..., 0개이다.

2. 이 때 별의 개수는 1부터 시작하여 2개씩 더해진다. 즉 홀수로 진행된다.

3. 각각의 층은 N, N + 1, N + 2, ..., N * 2 - 1로 증가된다.

4. 1부터 N + i까지 항상 반복하면 i값에 따라 3번의 조건을 만족하고 j < N - i값에 따라 공백은 점차 줄어들게 된다.

5. 나머지를 별로 채움으로써 피라미드처럼 나오게 된다.

for (int i = 0; i < N; i++) {
    for (int j = 1; j <= N + i; j++) {
        if(j < N - i) {
            stringBuilder.append(' ');
        }
        else {
            stringBuilder.append('*');
        }
    }
    stringBuilder.append('\n');
}

 

벌써부터 별 찍기가 재밌어 진다. 
아직까지는 조금만 생각하면 금방 풀 수 있는 문제이다.
개인적으로 단계적 풀이를 제외하고 모든 별찍기를 풀고자 한다.

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < N; i++) {
            for (int j = 1; j <= N + i; j++) {
                if(j < N - i) {
                    stringBuilder.append(' ');
                }
                else {
                    stringBuilder.append('*');
                }
            }
            stringBuilder.append('\n');
        }

        System.out.println(stringBuilder);
    }
}
반응형
반응형
이번에는 2번 문제와 같이 오른쪽 벽에 붙어 별을 그려나가는 방식이다.
좌우 대칭으로 숫자를 바꿔 생각하면 편하다.
 

[ 백준 2439번 문제 ] 별 찍기 - 2 - JAVA

이전 별 찍기에서 생각했던 공백을 생각해야 하는 문제가 나왔다.N * N의 크기로 생각했을 때 공백과 별 위치를 생각하면 풀면 된다. [ 백준 2438번 문제 ] 별 찍기 - 1 - JAVA단계적 풀이라는 카테고

p-coding.tistory.com

문제 핵심

  • 1 <= N <= 100
  • N 별 개수를 시작으로 점점 줄여나가 왼쪽 벽에 붙여 나가는 과정
  • 즉 공백이 0 ~ N - 1까지 별의 개수가 N ~ 1 개까지 

풀이 과정

조건문을 사용하여 공백부터 나왔던 값을 별부터 나오게 끔 변경하면 된다.

 

1. i를 통해 N번 반복

2. j를 통해 j < i 인 경우에만 공백 처리, i 값이 증가함에 따라 0, 1, 2, 3, 4 ~ N - 1번 공백을 출력

3. 그 외의 조건은 모두 별로 처리

for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        if(j < i) {
            str.append(' ');
        }
        else {
            str.append('*');
        }
    }
    str.append('\n');
}

 

다음은 지금까지 배운 문제를 토대로
1~4번 중 2개를 합쳐서 풀어보는 5 ~ 6번 문제이다.
9번까지 쭉 뇌를 깨어보는 별 찍기를 해보자.

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder str = new StringBuilder();
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(j < i) {
                    str.append(' ');
                }
                else {
                    str.append('*');
                }
            }
            str.append('\n');
        }

        System.out.println(str);
    }
}
반응형
반응형

 

1번과 비슷한 문제로 별 찍기 1번 문제를 반대로 생각하면 알 수 있다.
 

[ 백준 2438번 문제 ] 별 찍기 - 1 - JAVA

단계적 풀이라는 카테고리를 달고 운영함으로써본래의 의미를 지키기 위해 별 찍기 - 10 문제를 포스팅 하려고 했으나레벨 문제로 존재하기 때문에 1 ~ 10까지 포스팅 해보려고 한다.별 찍기를 통

p-coding.tistory.com

 

문제 핵심

  • 1 <= N <= 100
  • 별을 N부터 1까지 찍어내는 구조

풀이 과정

문제 자체는 어렵지 않아 N부터 1까지 역으로 출력하면 된다.

문제 1번에서 봤던 것과 같이 공백으로 생각하면 이해하기 쉽다.

 

1. N부터 시작해 i가 증감함에 따라 점점 별의 출력 개수를 줄여나가는 방식

for(int i = 0; i < N; i++) {

    for(int j = N - i; j > 0; j--) {
        str.append("*");
    }
    str.append("\n");
}

 

이번에는 직접 이차원 배열을 생성해 칸을 채워 나가는 방법도 시도해 보자.

1번 문제를 반대로만 생각하면 아주 쉽게 풀 수 있는 문제이다.
원래 목표였던 10번 문제 이전까지는 브론즈 문제로 쉽게 풀 수 있다.

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder str = new StringBuilder();
        int N = Integer.parseInt(br.readLine());

        for(int i = 0; i < N; i++) {

            for(int j = N - i; j > 0; j--) {
                str.append("*");
            }
            str.append("\n");
        }

        System.out.println(str);
    }
}
반응형
반응형

 

이전 별 찍기에서 생각했던 공백을 생각해야 하는 문제가 나왔다.
N * N의 크기로 생각했을 때 공백과 별 위치를 생각하면 풀면 된다.

 

[ 백준 2438번 문제 ] 별 찍기 - 1 - JAVA

단계적 풀이라는 카테고리를 달고 운영함으로써본래의 의미를 지키기 위해 별 찍기 - 10 문제를 포스팅 하려고 했으나레벨 문제로 존재하기 때문에 1 ~ 10까지 포스팅 해보려고 한다.별 찍기를 통

p-coding.tistory.com

 

문제 핵심

  • 1 <= N <= 100
  • N - 1 공백개수를 시작으로 0까지, 별은 1 ~ 5까지 그려나가는 구조

풀이 과정

별 찍기 1에서 사용했던 방식으로 공백과 별을 그려야 하는 조건을 맞추어 코드 구현하면 된다.

1에서는 구조를 설명하기 위해 2차원 배열을 사용하였지만 배열없이 바로 StringBuilder에 값을 추가 하면 된다.

 

1.  N개의 줄을 반복문을 통해 생성

2. 한 줄마다 j가 ( N - i - 1 ) 보다 작을 때 공백 출력, i가 증가함에 따라 공백 감소

3. 아닌 경우에는 별 출력

for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        if(j < N - i - 1) {
            stringBuilder.append(' ');
        }
        else {
            stringBuilder.append('*');
        }
    }
    stringBuilder.append('\n');
}

아직까지는 괴랄한 별 찍기가 아니라서 괜찮은 것 같다.
이 차원 배열 안에 어떻게 그릴 것인가
그게 중점으로 보인다.

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(j < N - i - 1) {
                    stringBuilder.append(' ');
                }
                else {
                    stringBuilder.append('*');
                }
            }
            stringBuilder.append('\n');
        }

        System.out.println(stringBuilder);

    }
}
반응형
반응형

 

단계적 풀이라는 카테고리를 달고 운영함으로써
본래의 의미를 지키기 위해 별 찍기 - 10 문제를 포스팅 하려고 했으나
레벨 문제로 존재하기 때문에 1 ~ 10까지 포스팅 해보려고 한다.
별 찍기를 통해 우리의 뇌를 다시 깨어보자. 

 

문제 핵심

    • 1 <= N <= 100
    • 1개부터 N개까지 별을 차례로 출력

풀이 과정 1

다음과 같은 2중 반복문으로 그릴 수 있다.

1. 1부터 N까지 5개의 라인을 그리는 반복문

2. 라인에서 별을 그려내는 반복문

for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= i; j++) {
        str.append("*");
    }
    str.append("\n");
}

 

이는 출력물이 다음과 같이 나타난다.

물론 틀렸다는 것은 아니지만 다음방법으로도 생각해보는 것이 좋겠다.


풀이 과정 2

다음 코드를 통해 N * N 크기의 보드를 만들어서 별(*)과 공백을 구분하여 값을 넣어 준다.

1. 풀이 과정1 과 방식은 동일하지만, 조건문을 만족하지 않는 나머지에 공백으로 채워 준다.

char[][] board = new char[N][N];

for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        if(j <= i) {
            board[i][j] = '*';
        }
        else {
            board[i][j] = ' ';
        }
    }
}

 

이는 다음과 같은 구조를 따른다.

난이도가 어려운 문제에서는 여러 풀이 방식을 생각하기도 어렵고 틀리는 경우가 많기 때문에
이 처럼 쉬운 문제에서 다양하게 시도해 보는 것이 좋다.

 

전체 코드 1

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder str = new StringBuilder();
        int N = Integer.parseInt(br.readLine());

        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= i; j++) {
                str.append("*");
            }
            str.append("\n");
        }

        System.out.println(str);
    }
}

전체 코드 2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());

        char[][] board = new char[N][N];

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(j <= i ) {
                    board[i][j] = '*';
                }
                else {
                    board[i][j] = ' ';
                }
            }
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                sb.append(board[i][j]);
            }
            sb.append("\n");
        }

        System.out.println(sb);
    }
}

 

반응형
반응형

 

이번에는 백준 15652번 문제를 통해 백트래킹 알고리즘 학습을 강화해 보자.
N과 M의 최종문제이다. 지금까지 문제를 생각해보면 이 문제도 15651번 문제 처럼 아주 쉽게 풀 수 있다.

 

문제 핵심

  • 1부터 N까지의 자연수 중 중복 없이 M개를 고른 수열
  • 1 <= M <= N <= 8
  • 중복하여 방문 가능
  • 이전의 수보다 작지만 않으면 됨 ( 같은 수여도 가능 )

풀이 과정

지금까지 풀이 1, 2, 3문제를 보았다면 아주 쉽게 접근할 수 있다.

이전 문제의 이론은? "모든 경로가 중복 방문이 가능하다면? 다시 처음부터 시작하면 된다." 였다.

그렇다면 우리는 해당 숫자부터 즉, 1이면 1부터 2이면 2부터 그대로 값을 전달해주면 된다.

이전 문제에서 고정시켰던 값을 다시 변동 시켜 계속 전달해주면 된다.

핵심 코드를 살펴보자

핵심 코드

다음 반복문에서 i 값을 그대로 전달해주는 것을 알 수 있다.

그렇게 되면 2인 값이 그대로 2로 전달되고 start매개변수를 통해 (M = 3,  N = 3 인 경우) 1, 2, 2 와 같은 값을 얻을 수 있다. 

private static void backTracking(int depth, int M, int N, int start) {
    if (depth == M) {
        for (int i : arr) {
            stringBuilder.append(i).append(" ");
        }
        stringBuilder.append("\n");
        return;
    }

    for (int i = start; i < N; i++) {
        arr[depth] = i + 1;
        backTracking(depth + 1, M, N, i);
    }
}
이제는 정말로 쉽게 풀이될 것이라고 생각한다.
이번 4개의 N과 M의 문제를 통해 충분히 학습될 것이라고 생각한다.
하지만 백트래킹이라고 해서 한 가지 유형만 있는 것은 아니니 몇 개 안남은 단계 문제를 풀고,
이후 다른 백트래킹 문제도 풀어보는 것이 좋겠다.

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Main {

    private static int[] arr;
    private static StringBuilder stringBuilder = new StringBuilder();

    private static void backTracking(int depth, int M, int N, int start) {
        if (depth == M) {
            for (int i : arr) {
                stringBuilder.append(i).append(" ");
            }
            stringBuilder.append("\n");
            return;
        }

        for (int i = start; i < N; i++) {
            arr[depth] = i + 1;
            backTracking(depth + 1, M, N, i);
        }
    }


    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());

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

        arr = new int[M];


        backTracking(0, M, N, 0);

        System.out.println(stringBuilder);

    }
}
반응형
반응형
이번에는 백준 15651번 문제를 통해 백트래킹 알고리즘 학습을 강화해 보자.
이쯤되면 점점 익숙해질 것이다.

문제 핵심

    • 1부터 N까지의 자연수 중 중복 없이 M개를 고른 수열
    • 1 <= M <= N <= 7
    • 중복하여 방문 가능

풀이 과정

이전 풀이를 보았다면 바로 생각이 날 수도 있다.

모든 경로가 중복 방문이 가능하다면? 다시 처음부터 시작하면 된다.

우리는 무조건 1부터 시작하는 조건을 가지고 있다. 그렇다면 변동하던 시작값을 고정시켜버리면 항상 중복하여 방문하게 된다.

핵심 코드

start 매개변수를 제외 시키고 반복문의 시작값을 0으로 고정하였다.

private static void backTracking(int depth, int M, int N) {
    if (depth == M) {
        for (int i : arr) {
            stringBuilder.append(i).append(" ");
        }
        stringBuilder.append("\n");
        return;
    }

    for (int i = 0; i < N; i++) {
        arr[depth] = i + 1;
        backTracking(depth + 1, M, N);
    }
}

 

 

반복하여 진행하니 점점 한 눈에 알아볼 정도로 난이도가 내려가고 있다. ( 아니면 죄송...)
다음 4번째 N과 M을 끝으로 이해도를 높이길 바란다.

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    private static int[] arr;
    private static StringBuilder stringBuilder = new StringBuilder();

    private static void backTracking(int depth, int M, int N) {
        if (depth == M) {
            for (int i : arr) {
                stringBuilder.append(i).append(" ");
            }
            stringBuilder.append("\n");
            return;
        }

        for (int i = 0; i < N; i++) {
            arr[depth] = i + 1;
            backTracking(depth + 1, M, N);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());

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

        arr = new int[M];


        backTracking(0, M, N);

        System.out.println(stringBuilder);

    }
}
반응형
반응형

 

이번에는 백준 15650번 문제를 통해 백트래킹 알고리즘 학습을 강화해 보자.
저번 15649번 문제에서 살짝 변형된 문제이다.

문제 핵심

  • 1부터 N까지의 자연수 중 중복 없이 M개를 고른 수열
  • 1 <= M <= N < 8
  • 오름차순이여야 한다.

풀이 과정

저번에는 모든과정을 체크했다면 이번 문제는 앞에 숫자가 커짐에 따라 끝의 숫자의 개수가 작아지므로 ( 즉, 오름차순이므로 ) 앞에 숫자 기준으로만 생각하면 된다. 다음 그림과 같이 진행된다. N = 4, M = 2 기준

 

1. 배열 첫 번째 요소를 채워 넣는다. 

2. 두번 째 요소를 넣기 위해 다시 함수를 호출하여 1-1로 진행한다.

3. 두번 째 요소를 넣은 후 다시 함수를 호출하고 깊이와 M값이 같기 때문에 출력한 후 반환한다.

4. 1-1 안에 배열에서 i 값이 증가한 1-2 와 같이 진행되어 이를 N값 전까지 반복한다.

 

private static void backTracking(int depth, int M, int N, int start) {
    if (depth == M) {
        for (int i : arr) {
            stringBuilder.append(i).append(" ");
        }
        stringBuilder.append("\n");
        return;
    }

    for (int i = start; i < N; i++) {
        arr[depth] = i + 1;
        backTracking(depth + 1, M, N, i + 1);
    }
}

오랜만에 뵙습니다. 취준 준비중 생활적 요소가 부족하여
두달가량 일용직 근무를 다녀왔습니다.
다시 천천히 시작해 보려고 합니다. 기다려 주셔서 감사합니다.

 

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Main {

    private static int[] arr;
    private static StringBuilder stringBuilder = new StringBuilder();

    private static void backTracking(int depth, int M, int N, int start) {
        if (depth == M) {
            for (int i : arr) {
                stringBuilder.append(i).append(" ");
            }
            stringBuilder.append("\n");
            return;
        }

        for (int i = start; i < N; i++) {
            arr[depth] = i + 1;
            backTracking(depth + 1, M, N, i + 1);
        }
    }


    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());

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

        arr = new int[M];


        backTracking(0, M, N, 0);

        System.out.println(stringBuilder);

    }
}

 

반응형

+ Recent posts