코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67
문제
https://www.acmicpc.net/problem/14503
[나의 풀이]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int clean(int r,int c,int dir,int [][]map){
int ans = 0 ;
// 방향
// 0 1 2 3
// 북 동 남 서
int [] dx = new int []{-1,0,1,0};
int [] dy = new int []{0,1,0,-1};
int x = -1;
int y = -1;
while(true){
// 현재 위치 청소
// 청소 완료이면 2
if (map[r][c] == 0){
map[r][c] = 2;
ans+=1;
}
// 주변 4칸 청소 완료
boolean around_4 = true;
for (int i =3; i>=0;i--){
x = r+dx[i];
y = c+dy[i];
if (map[x][y]==1){
continue;
}
if (map[x][y] == 0){
around_4 = false;
break;
}
}
if (around_4 == true){
r += dx[(dir+2)%4];
c += dy[(dir+2)%4];
// 후진하려는 위치가 벽이면, return
if (map[r][c] == 1){
return ans;
}
}
else{
dir = (dir+3)%4;
x = r + dx[dir];
y = c + dy[dir];
if (map[x][y]==0){
r = x;
c = y;
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int [][] map = new int [n][m];
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken());
for (int i = 0; i < n; i++){
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++){
map[i][j] = Integer.parseInt(st.nextToken());
}
}
int ans = clean(r,c,dir,map);
// bw는 문자열로 변환해서 출력
bw.write(ans+"");
bw.flush();
bw.close();
}
}
[팀원의 풀이1]
# coding = utf-8
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = list(list(map(int, input().split())) for _ in range(n))
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
def sol(r, c, d):
res = 0
nx, ny = r, c
while True:
# 1 step
print()
for row in board:
print(row)
if board[nx][ny] == 0:
board[nx][ny] = 2
res += 1
# 3 step
flag = 0
for _ in range(4):
d -= 1
d %= 4
nx, ny = nx+dx[d], ny+dy[d]
if board[nx][ny] == 0:
break
else:
nx, ny = nx-dx[d], ny-dy[d]
flag += 1
if flag < 4:
continue
# 2 step
if flag == 4:
nx, ny = nx-dx[d], ny-dy[d]
if board[nx][ny] == 1:
return res
print(sol(r, c, d))
[팀원의 풀이2]
# coding = utf-8
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = list(list(map(int, input().split())) for _ in range(n))
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
def sol(r, c, d):
res = 0
nx, ny = r, c
while True:
# 1 step
if board[nx][ny] == 0:
board[nx][ny] = 2
res += 1
# 3 step
flag = 0
for _ in range(4):
d -= 1
d %= 4
nx, ny = nx+dx[d], ny+dy[d]
if board[nx][ny] == 0:
break
else:
nx, ny = nx-dx[d], ny-dy[d]
flag += 1
if flag < 4:
continue
# 2 step
if flag == 4:
nx, ny = nx-dx[d], ny-dy[d]
if board[nx][ny] == 1:
return res
print(sol(r, c, d))
구현, 시뮬레이션 문제입니다.
문제 정의를 잘못해서 오랫동안 풀었습니다...😢😢😢
위와 같은 예제가 주어지는데 문제를 대강 읽어 0이 청소가 완료된 좌표, 1이 청소해야하는 좌표인줄 알았습니다... (정확히는 0이 청소해야하는 좌표, 1은 로봇이 위치할 수 없는 벽)
문제 풀이 자체는 어렵지 않았습니다만 문제 정의부터 꼼꼼히 하는 습관을 다져야겠습니다...💪💪💪
답이 하도 안나와서 3시간 넘게 붙잡고 있었네요... 💀💀💀 그래도 포기하지 않고 붙잡고 있어 풀어낼 수 있던 것 같습니다.
감사합니다🐹🐹🐹