알고리즘/윈터코딩
[윈터코딩] 방문길이
간타타
2020. 10. 29. 00:37
programmers.co.kr/learn/courses/30/lessons/49994
코딩테스트 연습 - 방문 길이
programmers.co.kr
어떠한 사람들은 4차원 배열을 통하여 해결하였으나 나는 비트마스킹을 이용하여 문제를 해결하였다.
1, 해당 위치에서 이미 지나간 길의 정보를 저장하여야 하는데 map 이차원 배열에 해당 위치에서 위로 간 경우 1, 아래로 간 경우 2, 왼쪽으로 간 경우 4, 오른쪽으로 간 경우 8 을 저장하여 주고 & 연산자를 이용하여 지금 해당 위치에서 이동하려고 하는 길이 이미 지난 길인지 판별을 해 주웠다.
*주의 할 점
- 지금 위치와 다음 위치 둘 다 이미 지나간 길에 대한 정보를 갱신
- 범위를 넘어 섰는지 확인
소스코드
#include <cstdio>
#include <string>
using namespace std;
int map[20][20];
int answer = 0;
typedef struct info {
int r;
int c;
}info;
info up_action(info info) {
int nr = info.r - 1;
int nc = info.c;
if (nr < 0 || nr > 10 || nc < 0 || nc > 10) return info;
if ((map[info.r][info.c] & 1) == 0) {
map[info.r][info.c] += 1;
map[nr][nc] += 2;
answer++;
}
return {nr,nc};
}
info down_action(info info) {
int nr = info.r + 1;
int nc = info.c;
if (nr < 0 || nr > 10 || nc < 0 || nc > 10) return info;
if ((map[info.r][info.c] & 2) == 0) {
map[info.r][info.c] += 2;
map[nr][nc] += 1;
answer++;
}
return { nr,nc };
}
info left_action(info info) {
int nr = info.r;
int nc = info.c - 1;
if (nr < 0 || nr > 10 || nc < 0 || nc > 10) return info;
if ((map[info.r][info.c] & 4) == 0) {
map[info.r][info.c] += 4;
map[nr][nc] += 8;
answer++;
}
return { nr,nc };
}
info right_action(info info) {
int nr = info.r;
int nc = info.c + 1;
if (nr < 0 || nr > 10 || nc < 0 || nc > 10) return info;
if ((map[info.r][info.c] & 8) == 0) {
map[info.r][info.c] += 8;
map[nr][nc] += 4;
answer++;
}
return { nr,nc };
}
int solution(string dir) {
int str_size = dir.size();
info info = { 5,5 };
for (int i = 0; i < str_size; i++) {
if (dir[i] == 'U') {
info = up_action(info);
}
if (dir[i] == 'D') {
info = down_action(info);
}
if (dir[i] == 'L') {
info = left_action(info);
}
if (dir[i] == 'R') {
info = right_action(info);
}
}
return answer;
}
int main() {
printf("%d ", solution("LULLLLLLU"));
return 0;
}