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] 14620번 꽃길

    2021. 8. 30.

    by. Hyeon-Uk

    반응형

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

     

    14620번: 꽃길

    2017년 4월 5일 식목일을 맞이한 진아는 나무를 심는 대신 하이테크관 앞 화단에 꽃을 심어 등교할 때 마다 꽃길을 걷고 싶었다. 진아가 가진 꽃의 씨앗은 꽃을 심고나면 정확히 1년후에 꽃이 피므

    www.acmicpc.net


     

    풀이

    N의 값이 매우 작으므로, 완전탐색을 이용해서, 겹치지 않게 서로다른 위치에 3개를 놓을때마다 최솟값을 갱신하는 방법으로 값을 구했다.

     

    보통의 완전탐색과 같은데, 이제 꽃을 심으면 동,서,남,북,중앙 5군데를 차지하므로, 이것을 고려해서 문제를 해결해주면 된다.

     

     

    코드

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int maze[10][10];
    bool flower[10][10] = { 0 };
    int mv[5][2] = { {0,0},{1,0},{-1,0},{0,1},{0,-1} };
    int n,ret=987654321;
    
    //범위안에 있는지 확인하는 함수
    bool isIn(int x, int y) {
    	return x >= 0 && x < n && y >=0 && y < n;
    }
    
    //범위안에 꽃이 있는지 확인하는 함수
    bool flower_check(int x, int y) {
    	for (int k = 0; k < 5; k++) {
    		int nx = x + mv[k][0];
    		int ny = y + mv[k][1];
    		if (!isIn(nx, ny) || flower[nx][ny]) {
    			return false;
    		}
    	}
    	return true;
    }
    
    //꽃을 피우고, 피운꽃들의 땅값을 리턴
    int blossom(int x, int y) {
    	int s = 0;
    	for (int k = 0; k < 5; k++) {
    		int nx = x + mv[k][0];
    		int ny = y + mv[k][1];
    		flower[nx][ny] = true;
    		s += maze[nx][ny];
    	}
    	return s;
    }
    
    //피웠던 꽃 회수
    void falling(int x, int y) {
    	for (int k = 0; k < 5; k++) {
    		int nx = x + mv[k][0];
    		int ny = y + mv[k][1];
    		flower[nx][ny] = false;
    	}
    }
    
    //완전탐색함수
    void dfs(int x, int y,int sum,int cnt) {
    	if (cnt == 3) {
    		ret = min(ret, sum);
    		return;
    	}
    	for (int i = x; i < n - 1; i++) {
    		for (int j = 1; j < n - 1; j++) {
    			if (flower_check(i,j)) {
    				int s = blossom(i, j);
    				dfs(i, j, sum + s, cnt + 1);
    				falling(i, j);
    			}
    		}
    	}
    }
    
    void input() {
    	cin >> n;
    
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cin >> maze[i][j];
    		}
    	}
    }
    
    void solve() {
    	input();
    	dfs(0, 0, 0, 0);
    	cout << ret;
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0); cout.tie(0);
    
    	solve();
    	return 0;
    }
    반응형
    저작자표시 (새창열림)

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

    [백준OJ] 22993번 서든어택 3  (0) 2021.09.01
    [백준OJ] 9465번 스티커  (0) 2021.08.31
    [백준OJ] 4195번 친구 네트워크  (0) 2021.08.29
    [백준OJ] 1034번 램프  (0) 2021.08.28
    [백준OJ] 20154번 이 구역의 승자는 누구야?!  (0) 2021.08.27

    댓글

    관련글

    • [백준OJ] 22993번 서든어택 3 2021.09.01
    • [백준OJ] 9465번 스티커 2021.08.31
    • [백준OJ] 4195번 친구 네트워크 2021.08.29
    • [백준OJ] 1034번 램프 2021.08.28
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

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

티스토리툴바