오늘의 문제!
import java.io.*;
import java.util.StringTokenizer;
public class 양갈래배열출력하기_31475 {
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 = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] arr = new int[n][m];
String s = br.readLine();
// 상
if (s.equals("U")) {
// 하, 좌, 상, 우
int[] dr = {1, 0, -1, 0};
int[] dc = {0, -1, 0, 1};
int dir = 0; // 처음엔 하(0) 방향으로 직진
int r = 0;
int c = m / 2;
arr[r][c] = 1; // 시작칸
int num = 2; // 다음칸
int target = n * (m / 2 + 1); // 왼쪽 절반칸의 개수
// 왼쪽 절반 칸 채우기
while (num <= target) {
// 다음 칸의 위치
int nr = r + dr[dir];
int nc = c + dc[dir];
// 갈 수 있으면?
if (nr >= 0 && nr < n && nc >= 0 && nc <= m / 2 && arr[nr][nc] == 0) {
r = nr;
c = nc;
arr[r][c] = num++;
} else {
dir = (dir + 1) % 4;
}
}
// 오른쪽 절반 채우기
for (int i = 0; i < n; i++) {
for (int j = 0; j < m / 2; j++) {
arr[i][m - 1 - j] = arr[i][j];
}
}
// 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
bw.write(arr[i][j] + " ");
}
bw.write("\n");
}
}
// 하
else if (s.equals("D")) {
// 상, 좌, 하, 우
int[] dr = {-1, 0, 1, 0};
int[] dc = {0, -1, 0, 1};
int dir = 0; // 처음엔 상(0) 방향으로 직진
int r = n - 1;
int c = m / 2;
arr[r][c] = 1; // 시작칸
int num = 2; // 다음칸
int target = n * (m / 2 + 1); // 왼쪽 절반칸의 개수
// 왼쪽 절반 칸 채우기
while (num <= target) {
// 다음 칸의 위치
int nr = r + dr[dir];
int nc = c + dc[dir];
// 갈 수 있으면?
if (nr >= 0 && nr < n && nc >= 0 && nc <= m / 2 && arr[nr][nc] == 0) {
r = nr;
c = nc;
arr[r][c] = num++;
} else {
dir = (dir + 1) % 4;
}
}
// 오른쪽 절반 채우기
for (int i = 0; i < n; i++) {
for (int j = 0; j < m / 2; j++) {
arr[i][m - 1 - j] = arr[i][j];
}
}
// 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
bw.write(arr[i][j] + " ");
}
bw.write("\n");
}
}
// 좌
else if (s.equals("L")) {
// 우, 상, 좌, 하
int[] dr = {0, -1, 0, 1};
int[] dc = {1, 0, -1, 0};
int dir = 0; // 처음엔 우(0) 방향으로 직진
int r = n / 2;
int c = 0;
arr[r][c] = 1; // 시작칸
int num = 2; // 다음칸
int target = (n / 2 + 1) * m; // 위쪽 절반칸의 개수
// 위쪽 절반 칸 채우기
while (num <= target) {
// 다음 칸의 위치
int nr = r + dr[dir];
int nc = c + dc[dir];
// 갈 수 있으면?
if (nr >= 0 && nr <= n / 2 && nc >= 0 && nc < m && arr[nr][nc] == 0) {
r = nr;
c = nc;
arr[r][c] = num++;
} else {
dir = (dir + 1) % 4;
}
}
// 아래쪽 절반 채우기
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < m; j++) {
arr[n - 1 - i][j] = arr[i][j];
}
}
// 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
bw.write(arr[i][j] + " ");
}
bw.write("\n");
}
}
// 우
else if (s.equals("R")) {
// 좌, 상, 우, 하
int[] dr = {0, -1, 0, 1};
int[] dc = {-1, 0, 1, 0};
int dir = 0; // 처음엔 우(0) 방향으로 직진
int r = n / 2;
int c = m - 1;
arr[r][c] = 1; // 시작칸
int num = 2; // 다음칸
int target = (n / 2 + 1) * m; // 위쪽 절반칸의 개수
// 위쪽 절반 칸 채우기
while (num <= target) {
// 다음 칸의 위치
int nr = r + dr[dir];
int nc = c + dc[dir];
// 갈 수 있으면?
if (nr >= 0 && nr <= n / 2 && nc >= 0 && nc < m && arr[nr][nc] == 0) {
r = nr;
c = nc;
arr[r][c] = num++;
} else {
dir = (dir + 1) % 4;
}
}
// 아래쪽 절반 채우기
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < m; j++) {
arr[n - 1 - i][j] = arr[i][j];
}
}
// 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
bw.write(arr[i][j] + " ");
}
bw.write("\n");
}
}
bw.flush();
bw.close();
}
}
미친 구현문제...
처음에 시작칸부터 방향정해서 달팽이 돌리는건 금방 감을 잡았는데, 양갈래? 어떻게 양쪽을 하지?
반반씩 중복되게 두바퀴 따로 굴려서 만들어야 하나? 오반데.. 했다가
각 줄별로 대칭되게 반복되니까 반만 구하고 2중반복문으로 끼워넣을 수 있겠다! 싶어서 짜본 코드..
구현은 여전히 머리가 아프다...
그리고 오늘 종설 팀원집에서 조립한 흡연감지센서 하드웨어를 드디어 넘겨받아서 아두이노 ide로 가스센서만 테스트해봤다.
막상 해보니 이거 와이파이도 2.4hz밖에 인식 못 하고, 콘센트도 근처에 있어야 하거나 보조배터리 필수고..
생각보다 번거롭더라. 이걸 몇십개 만들자니 비용도 만만찮을거같고 ㅠㅠ
일단 그래도 가스센서는 백엔드 서버랑 연동 되는거 확인했으니, 내일 라이터 구해서 수치 변하는거만 확인하고, 온도습도 센서 관련도 건드려봐야겠다 파이팅!