Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 삼성 SW 역량 테스트 기출 문제
- Meta Quest3
- 자료구조
- 디자인패턴
- C++
- 논블록
- 재밌게 할래요
- BOJ
- 어싱크
- SOLID
- 이니셔티브 q
- 블록
- d4
- SWEA
- level2
- D3
- Initiative Q
- Java
- 백준
- 점프 점프
- 11060
- 알고리즘
- 메타퀘스트3
- 10505
- 레퍼럴
- Design Pattern
- spring
- D2
- 리퍼럴
- 프로그래머스
Archives
- Today
- Total
아직은 정체성이 없는 블로그
[SWEA][D4][c++] 1249. [S/W 문제해결 응용] 4일차 - 보급로 본문
문제
1249. [S/W 문제해결 응용] 4일차 - 보급로
문제 링크
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15QRX6APsCFAYD#none
풀이과정
아래 코드의 bfs() 함수 부분만 이해하시면 됩니다.
(0,0)의 위치부터 시작하여 앞으로 방문할 위치에 방문하지 않았거나 방문할 위치의 dp배열 값이 현재 위치의 dp배열 값 + 방문할 곳의 map배열 값 보다 크다면 방문할 위치의 값을 현재 위치의 dp배열 값 + 방문할 곳의 map배열값로 갱신해줍니다.
코드로 다시 한번 말하자면
dp[tx][ty] > dp[x][y] + map[tx][ty] 이거나 check[tx][ty] == false(방문하지 않음) 면
check[tx][ty] = true; 방문 표시하고
dp[tx][ty] = dp[x][y] + map[tx][ty]; 갱신함
그 후 큐에 방문할 위치를 push 합니다.
위 과정을 큐가 빌 때까지 반복한 후에 맵의 도착점을 출력합니다.
코드
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int map[100][100];
int dp[100][100];
bool check[100][100];
int N;
int bfs() {
queue <pair <int, int>> q;
check[0][0] = true;
dp[0][0] = 0;
q.push(make_pair(0, 0)); // 시작점
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int k = 0; k < 4; k++)
{
int tx = x + dx[k];
int ty = y + dy[k];
//map 범위 안일때만 실행
if (tx >= 0 && tx < N && ty >= 0 && ty < N)
{
// 아직 들리지 않았거나 들릴곳이 현재 위치의 중첩(dp) 값과 갈 곳에 위치값이 합이
// 갈 곳의 중첩값보다 작을때 갱신해줌
if (check[tx][ty] == false || dp[tx][ty] > dp[x][y] + map[tx][ty])
{
check[tx][ty] = true;
dp[tx][ty] = dp[x][y] + map[tx][ty];
q.push(make_pair(tx, ty));
}
}
}
}
return dp[N - 1][N - 1];
}
int main(int argc, char** argv)
{
int test_case;
int T;
cin>>T;
for(test_case = 1; test_case <= T; ++test_case)
{
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
memset(check,false,sizeof(check));
cin >> N;
//input
for(int i=0; i<N; i++){
string s;
cin>>s;
for(int j=0; j<N; j++){
map[i][j]=s[j]-'0';
}
}
cout<<"#"<<test_case<<" "<<bfs()<<"\n";
}
return 0;
}
'알고리즘 역량테스트 문제 > SWEA' 카테고리의 다른 글
[SWEA][D3][c++] 10032. 과자 분배 (0) | 2020.07.13 |
---|---|
[SWEA][D3][c++] 10059. 유효기간 (0) | 2020.07.13 |
[SWEA][D4][c++] 3752. 가능한 시험 점수 (0) | 2020.07.08 |
[SWEA][D2][c++] 1954. 달팽이 숫자 (0) | 2020.07.05 |
[SWEA][D2][c++] 1961. 숫자 배열 회전 (0) | 2020.07.04 |
Comments