Junior-Developer
Home
  • Category (316)
    • 문제풀이 (270)
      • 백준oj (201)
      • 프로그래머스 (53)
      • 명품 자바 프로그래밍(개정4판) (11)
      • 구름 (5)
    • 알고리즘 (6)
    • Node.js (2)
    • 체크리스트 (37)
블로그 내 검색
Home

Junior-Developer

1일 1커밋! 1일 1 백준!

  • 문제풀이/백준oj

    [백준OJ] 15684번 사다리 조작

    2021. 8. 26.

    by. Hyeon-Uk

    반응형

    https://www.acmicpc.net/problem/15684

     

    15684번: 사다리 조작

    사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선

    www.acmicpc.net


     

     

    풀이

    maze[i][j]=k 라고 한다면, j번 가로선에서, i와i+1사이에 선이 있다면 k=1, 없다면 k=0으로 설정을 해준다.

    백트래킹을 이용해서 가로선이 놓여있지 않은곳에 최대 3개의 가로선을 놔두면서, 각 경우마다 i번째 세로선의 결과가 i가 나오는지 체크를 해주며 최솟값을 갱신해주면된다.

     

    이때 가로선이 없다는 의미는 b와 b+1사이에 가로선이 없어야 함과 동시에, b-1과b사이에 가로선또한 없어야 하므로 조건에 추가해주는것을 유의해야한다.

     

    코드

    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    int maze[11][31]={0};
    int n,m,h;
    int result=4;
    
    
    //i번 세로선의 결과가 i번인지 확인
    bool check(){
        for(int i=1;i<=n;i++){
            int now=i;
            int goal=i;
            
            for(int j=1;j<=h;j++){
                if(maze[now][j]==1){
                    now++;
                }
                else if(maze[now-1][j]==1){
                    now--;
                }
            }
            
            if(now!=goal){
                return false;
            }
        }
        return true;
    }
    
    void dfs(int line,int cnt){
        //3개이상이면 어차피 불가능과 같은 출력이므로 return
        if(cnt>3){
            return;
        }
        //결과가 맞으면 result갱신
        if(check()){
            result=min(result,cnt);
        }
        
    	
        for(int j=line;j<=h;j++){
            for(int i=1;i<n;i++){
            	//해당 가로선이 없으면 백트래킹
                if(maze[i][j]==0&&maze[i-1][j]==0){
                    maze[i][j]=1;
                    dfs(j,cnt+1);
                    maze[i][j]=0;
                }
            }
        }
    }
    
    int main() {
        cin>>n>>m>>h;
        
        for(int i=0;i<m;i++){
            int a,b;
            cin>>a>>b;
            maze[b][a]=1;//a번 가로선에 b와b+1사이에 가로선이 있다.
        }
        dfs(1,0);
        cout<<(result==4?-1:result);
      
    	return 0;
    }
    반응형
    저작자표시 (새창열림)

    '문제풀이 > 백준oj' 카테고리의 다른 글

    [백준OJ] 1034번 램프  (0) 2021.08.28
    [백준OJ] 20154번 이 구역의 승자는 누구야?!  (0) 2021.08.27
    [백준OJ] 6137번 문자열 생성  (0) 2021.08.25
    [백준OJ] 1633번 최고의 팀 만들기  (0) 2021.08.24
    [백준OJ] 14595번 동방 프로젝트 (Large)  (0) 2021.08.23

    댓글

    관련글

    • [백준OJ] 1034번 램프 2021.08.28
    • [백준OJ] 20154번 이 구역의 승자는 누구야?! 2021.08.27
    • [백준OJ] 6137번 문자열 생성 2021.08.25
    • [백준OJ] 1633번 최고의 팀 만들기 2021.08.24
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
Hyeon-Uk

티스토리툴바