saurus2
Saurus2
saurus2
전체 방문자
오늘
어제
  • 분류 전체보기
    • 개발
      • AJAX
    • ML Ops
    • Profile
    • 음식점
    • 배낭여행
    • 컴퓨터공학
      • 알고리즘 공부
      • C++
      • Sever 스터디
      • Java spring
      • 알고리즘 _ 문제해결
      • 딥러닝
      • Java 정리
      • Python
      • LeetCode 1000
      • Machine Learning Study
      • Sign language Detection Pro..
      • LeetCode Solutions
    • 비콘
    • 데일리 리포트
    • 유학일기
      • 영어 공부
      • Daily
    • AI Master Degree
      • Data Mining
      • AI and Data engineering
      • Math Foundations for Decisi..
      • Natural Language Processing

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • two pointer
  • 딕셔너리
  • 취업준비
  • 개발자 취업준비
  • 문제해결능력
  • DFS
  • BFS
  • 온라인저지
  • 딥러닝
  • LeetCode
  • 릿코드
  • Python
  • c++
  • 알고리즘문제해결
  • 취준
  • 백준
  • 파이썬
  • 개발자
  • 리트코드
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
saurus2

Saurus2

[BOJ] 백준 문제풀이 15649 N과M(1)
컴퓨터공학/알고리즘 공부

[BOJ] 백준 문제풀이 15649 N과M(1)

2018. 11. 19. 23:09

알고리즘 스터디 :

DFS와 BFS 기초를 다지기 위해서 쉬운 문제 부터 하나하나 차근차근 접근 해보려고 합니다. 

종만북은 문제 풀이로 병행을 하려하고, 나머지는 이제 하나하나 볼 것입니다. 


우선, DFS 문제를 푸려고 하는데, 

제 코딩 스타일이 알고리즘에 최적화 되있지 않다고 조언을 들었습니다. 시간 단축과 알고리즘 구현 단순화를 위해서

STL을 같이 공부할거에요.


암튼 ... 아래 문제를 풀었습니다. 



N과 M (1) 성공

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초512 MB129480457265.148%

문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

예제 입력 1 

3 1

예제 출력 1 

1
2
3

예제 입력 2 

4 2

예제 출력 2 

1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3
















평소 접하던 DFS 조합 문제가 아닌 순열 문제 이며, 이 부분을 어떻게 풀 것인지 대해서 생각해 봤어요.

단순화를 위해서 Memset 함수를 사용하고, Vector 를 사용 했어요. 

1. Memset --> 특정 메모리 블럭에 특정 크기 만큼, 특정 문자로 셋팅하는 함수죠.

* 헤더 파일은 : memory.h 과 string.h 둘 중에 아무거나 사용해도 상관 없습니다. 
** memmove 는 string.h 에만 존재 하내요.

2. Vector --> 동적 배열을 C++ 로 구현한 함수죠. 

특징은 [] 연산으로 배열 위치에 접근할 수 있고, 그냥 배열처럼 삭제하고 삽입할 수 있습니다. 

* #include <vector> 를 선언해줘야 합니다. 


( 문제가 안풀렸었는데, 가르침을 받고 다시 작성 해봤음.)
3 - 1. 각 인자에서 전체 숫자에 접근 재귀
3 - 2. 방문 했던 인자를 체크
3 - 3. 방문 하지 않았던 인자만 사용
3 - 4. 방문 할때 마다 전역 변수와 배열을 벡터에 셋팅
3 - 5. 원하는 N 에 도달 했을때 출력 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <cstdio>
#include <vector>
#include <string.h>
 
using namespace std;
 
int ar[9] = {0,};
int M,N,cnt = 0; // 전역 변수에서 카운트
vector <int> li; // 벡터 사용
 
void dfs(){
    if(cnt == N){
        for(int i = 0; i<(int)li.size(); i++){ // 벡터 사이즈 만큼 출력 (정수) 변환
            printf("%d ", li.at(i));
        }
        printf("\n");
        return;
    }
    
    for(int i=0; i<M; i++){
        if(ar[i] == 1) continue; // 같은 인자는 패스
        ar[i] = 1;
        li.push_back(i+1); // 출력을 위한 기록으로 생각함.
        cnt++;
        dfs();
        ar[i] = 0;
        li.pop_back();
        cnt--;
    }
}
 
int main(){
    cnt = 0;
    memset(ar,0,sizeof(ar));
    li.clear();
    cin >> M >> N;
    dfs();
}
 
 
Colored by Color Scripter
cs

이렇게 코드를 작성 했는데, PASS 되었다.. 재귀 함수의 for문이 조금 더럽지만,,, 다른 문제도 풀어야 하기 때문에 정리하는것은 넘어갈게요






저작자표시 (새창열림)

'컴퓨터공학 > 알고리즘 공부' 카테고리의 다른 글

[BOJ] 13565 침투 알고리즘 스터디 11월 21일  (0) 2018.11.21
[CodeForce] Water The Garden .A 알고리즘 스터디  (0) 2018.11.21
[알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기 [소풍]  (0) 2018.11.12
[알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기  (0) 2018.10.27
Quicksort 2 - Sorting Hackerrank 퀵정렬 퀵소트 문제!  (0) 2017.01.06
    '컴퓨터공학/알고리즘 공부' 카테고리의 다른 글
    • [BOJ] 13565 침투 알고리즘 스터디 11월 21일
    • [CodeForce] Water The Garden .A 알고리즘 스터디
    • [알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기 [소풍]
    • [알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기
    saurus2
    saurus2
    Simple is Best

    티스토리툴바