[BOJ/1103] κ²Œμž„, c++

2021. 5. 29. 18:02Β·DEV/PS

 

πŸ”— 링크

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

 

1103번: κ²Œμž„

쀄에 λ³΄λ“œμ˜ μ„Έλ‘œ 크기 Nκ³Ό κ°€λ‘œ 크기 M이 μ£Όμ–΄μ§„λ‹€. 이 값은 λͺ¨λ‘ 50보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 λ³΄λ“œμ˜ μƒνƒœκ°€ μ£Όμ–΄μ§„λ‹€. μ“°μ—¬ μžˆλŠ” μˆ«μžλŠ” 1λΆ€ν„° 9κΉŒμ§€μ˜ μžμ—°μˆ˜ λ˜λŠ”

www.acmicpc.net

https://github.com/jokj624/PS/blob/master/1000-5000/1103.cpp

 

jokj624/PS

BOJ, CodeForces μ•Œκ³ λ¦¬μ¦˜ 문제 μ†ŒμŠ€μ½”λ“œ. Contribute to jokj624/PS development by creating an account on GitHub.

github.com

🀯 ν•œμ€„ ν›„κΈ°

μ½”λ“œ μˆœμ„œ μ‘°μ‹¬ν•˜μž 😭

🀷 문제

πŸ‘©‍πŸ’» 풀이

μ•„ν”ˆ κΈ°μ–΅

ꡉμž₯히 많이 ν‹€λ Έλ‹€. λŒ€νšŒ μ€€λΉ„ μŠ€ν„°λ”” Algospecial 첫 λ§Œλ‚¨λ•Œ ν’€μ—ˆλ˜ 문제인데 문제λ₯Ό 읽고 μ…‹ λ‹€ κ·Έλƒ₯ ν’€μ–΄λ³΄μžκ³  ν–ˆλ‹€.

λ”±νžˆ 큰 μ ‘κ·Ό 방식이 ν•„μš”ν•œ 것 κ°™μ§„ μ•Šμ•˜κ³ , λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” λ°©μ‹λŒ€λ‘œ dfs μ½”λ“œλ§Œ κ΅¬ν˜„ν•΄μ£Όλ©΄ 될 것 κ°™μ•˜λ‹€.

동전이 λ¬΄ν•œλŒ€λ‘œ μ›€μ§μΈλ‹€λŠ” 것은 κ²°κ΅­ ν•œλ²ˆ λ°©λ¬Έν–ˆλ˜ 곳에 또 ν•œλ²ˆ λ°©λ¬Έν•˜λŠ” κ²ƒμ΄λž‘ κ°™μœΌλ―€λ‘œ κ·Έλ ‡κ²Œ νŒλ‹¨ν•΄μ£Όλ©΄ λœλ‹€.

결과적으둜 λ‚˜λ§κ³  λ‹€λ₯Έ μΉœκ΅¬κ°€ λ¨Όμ € κ΅¬ν˜„ν•΄μ„œ μ œμΆœν–ˆμ§€λ§Œ μ•„λ§ˆ TLE κ°€ λ‚¬λ˜ 것 κ°™λ‹€! 

 

λΆ„λ₯˜λ₯Ό ν•œλ²ˆ μ—΄μ–΄λ³΄κΈ°λ‘œ ν–ˆλ‹€.

λ‚΄κ°€ 제일 λͺ»ν•˜λŠ” dp

DPλ₯Ό μ¨μ„œ ν‘ΈλŠ” λ¬Έμ œμ˜€λ‹€ .. . λ‚΄κ°€ 정말 μ‹«μ–΄ν•˜λŠ” λ₯˜μ˜ 문제

 

점화식을 μƒκ°ν•΄λ΄€λŠ”λ° dp[x][y] = x, y μœ„μΉ˜ κΉŒμ§€ μ˜€λŠ”λ° 동전이 움직일 수 μžˆλŠ” μ΅œλŒ€ 횟수 μ •λ„λ‘œ μƒκ°ν•˜κΈ°λ‘œ ν–ˆλ‹€. 

ν•΄λ‹Ή μœ„μΉ˜μ— 이미 동전 νšŸμˆ˜κ°€ μ €μž₯λ˜μ–΄ μžˆλ‹€λ©΄ 더 이상 νƒμƒ‰ν•˜μ§€ μ•Šκ³  λ°”λ‘œ λ°˜ν™˜ν•˜μ—¬ μ‹œκ°„μ„ 쀄일 수 μžˆμ„ 것 κ°™μ•˜λ‹€.

 

동전이 ν•΄λ‹Ή μœ„μΉ˜μ— 적힌 숫자만큼 움직여야 ν•˜κΈ° λ•Œλ¬Έμ— nextx, nexty μ’Œν‘œλ₯Ό ꡬ할 λ•Œ, 

dx[i] * map[x][y]-'0', dy[i] * map[x][y]-'0' 이런 μ‹μœΌλ‘œ κ΅¬ν˜„ν–ˆλ‹€.

if(x < 0 || y < 0 || x >= N || y >= M)	return 0;  // 경계선 λ°–μœΌλ‘œ λ‚˜κ°”μ„ 경우 탐색 μ’…λ£Œ
	if(map[x][y] == 'H')	return 0;    // ꡬ멍에 λΉ μ‘Œλ‹€λ©΄ ν•΄λ‹Ή 탐색 μ’…λ£Œ
	if(visit[x][y]){
		printf("-1");   //ν•œλ²ˆ λ°©λ¬Έν•œ κ³³ 재방문 μ‹œ λ¬΄ν•œλŒ€λ‘œ λ„λŠ” κ²ƒμ΄λ―€λ‘œ -1 좜λ ₯ ν›„ μ’…λ£Œ
		exit(0);
	}
	if(dp[x][y])	return dp[x][y];   // 이미 dp λ©”λͺ¨μ΄μ œμ΄μ…˜ λ˜μ–΄μžˆλ‹€λ©΄ λ°˜ν™˜
	visit[x][y] = true;  // 방문 기둝
	for(int i=0; i<4; i++){
		int nx = x + dx[i]*(map[x][y]-'0');
		int ny = y + dy[i]*(map[x][y]-'0');   // ν˜„μž¬ μ’Œν‘œμ—μ„œ 갈 수 μžˆλŠ” μ’Œν‘œ κ΅¬ν•˜κΈ°
		dp[x][y] = max(dp[x][y], dfs(nx, ny)+1); // ν˜„μž¬ dpκ°’, μƒˆλ‘œμš΄ μ’Œν‘œ dpκ°’ + 1 쀑 max κ°’ κ°±μ‹ 
	}
	visit[x][y] = false;  // λ‹€μŒ 탐색을 μœ„ν•΄ λ°©λ¬Έ 기둝 μˆ˜μ • 
	return dp[x][y];  // 좜λ ₯

탐색 ν’€μ΄λŠ” 주석을 μ°Έκ³ ν•˜μ‹œκΈΈ!

 

μ•„, 계속 ν‹€λ Έλ˜ μ΄μœ κ°€ λ­μ˜€λƒλ©΄

if(dp[x][y])	return dp[x][y];
if(visit[x][y]){
	printf("-1");
	exit(0);
}

λ°”λ‘œ 이 μˆœμ„œ λ•Œλ¬Έμ΄λ‹€. 

λ¬΄ν•œλŒ€λ‘œ 동전이 λ„λŠ” 것을 λ¨Όμ € μ²΄ν¬ν•˜μ§€ μ•Šκ³ , dpκ°’ λ°˜ν™˜λΆ€ν„° μ²΄ν¬ν•΄λ²„λ €μ„œ λ¬΄ν•œλŒ€λ‘œ λŒλ•Œλ„ dp값을 λ¨Όμ € λ°˜ν™˜ν•΄λ²„λ Έλ‹€.

이걸 찾느라 μ—„μ²­λ‚˜κ²Œ ν‹€λ Έμ—ˆλ‹€ πŸ˜‡ 

πŸ’» μ½”λ“œ

//AC
//BOJ 1103 κ²Œμž„
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
string map[105];
int dp[105][105];
bool visit[105][105];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int N, M;
int dfs(int x, int y){
	if(x < 0 || y < 0 || x >= N || y >= M)	return 0;
	if(map[x][y] == 'H')	return 0;
	if(visit[x][y]){
		printf("-1");
		exit(0);
	}
	if(dp[x][y])	return dp[x][y];
	visit[x][y] = true;
	for(int i=0; i<4; i++){
		int nx = x + dx[i]*(map[x][y]-'0');
		int ny = y + dy[i]*(map[x][y]-'0');
		dp[x][y] = max(dp[x][y], dfs(nx, ny)+1);
	}
	visit[x][y] = false;
	return dp[x][y];
}
int main(){
	cin >> N >> M;
	for(int i=0; i<N; i++){
		cin >> map[i];
	}
	cout << dfs(0, 0);
	return 0;
}
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'DEV > PS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ/9202] Boggle, c++  (1) 2021.06.04
[BOJ/21872] Deque Game, c++  (0) 2021.06.04
[BOJ/13334] 철둜, c++  (0) 2021.05.20
[BOJ/18405] 경쟁적 μ „μ—Ό, c++  (0) 2021.05.17
[BOJ/20127] Y-μˆ˜μ—΄, C++  (0) 2021.05.14
'DEV/PS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [BOJ/9202] Boggle, c++
  • [BOJ/21872] Deque Game, c++
  • [BOJ/13334] 철둜, c++
  • [BOJ/18405] 경쟁적 μ „μ—Ό, c++
jobchae
jobchae
λ§ν•˜λŠ” κ°μžμ§€λ§Œ, μ½”λ“œλ₯Ό λ„μ μ΄λŠ” Node.js λ°±μ—”λ“œ κ°œλ°œμžμž…λ‹ˆλ‹€.
  • jobchae
    JOBCHAE
    jobchae
  • 전체
    였늘
    μ–΄μ œ
    • πŸš€ JOBCHAE (182)
      • DEV (151)
        • PS (108)
        • Node.js (12)
        • React (3)
        • docker (1)
        • μž‘λ‹€ν•œ 개발 일지 (21)
        • injection (1)
        • JS, TS (3)
        • DB (2)
      • 좕ꡬ (0)
      • 일상 (19)
      • μ˜ν™” (3)
      • μŒμ•… (8)
  • λΈ”λ‘œκ·Έ 메뉴

    • πŸ’» Github
    • πŸ™‹πŸ» Linkedin
    • πŸ“– λ°©λͺ…둝
  • 링크

    • PS Github
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    일상
    μ•Œκ³ λ¦¬μ¦˜
    μŠ¬λž™λ΄‡
    μŠ¬λž™
    Express
    PS
    JavaScript
    BFS
    GitHub
    μœ„μƒμ •λ ¬
    typescript
    회고
    DP
    개발
    mongoDB
    λ ›μΈ λ½νŽ˜μŠ€ν‹°λ²Œ
    λ¦¬μ•‘νŠΈ
    이뢄탐색
    boj
    μš°μ„ μˆœμœ„ν
    react
    DFS
    nodejs
    SOPT
    node.js
    Nest.js
    μ•±μžΌ
    μ†νŠΈ
    λ°±μ€€
    db
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.5
jobchae
[BOJ/1103] κ²Œμž„, c++
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”