'decode'에 해당되는 글 1건

  1. 2022.01.05[DECODE] Decoding

Java 로 풀어보는 알고리즘입니다. 📖
코딩테스트를 대비하여 JAVA1.8 부터 제공되는 함수형 API 는 사용하지 않았습니다.

문제 : https://www.algospot.com/judge/problem/read/DECODE

 

algospot.com :: DECODE

Decoding 문제 정보 문제 Chip and Dale have devised an encryption method to hide their (written) text messages. They first agree secretly on two numbers that will be used as the number of rows (R) and columns (C) in a matrix. The sender encodes an int

www.algospot.com


풀이입니다. 🤔

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.util.*;
 
public class Main {
    private static final int USE = -1;
    private static final int[][] directions = new int[][]{{01}, {10}, {0-1}, {-10}};
 
    public static void main(String[] args) {
        int[] acc = new int[5];
        int[][] boards = new int[20][20];
        Scanner scanner = new Scanner(System.in);
 
        int cases = scanner.nextInt();
        for (int i = 1; i <= cases; ++i) {
            int r = scanner.nextInt(), c = scanner.nextInt();
            char[] matrix = scanner.next().toCharArray();
            for (int j = 0, len = matrix.length; j < len; ++j) boards[j / c][j % c] = matrix[j] - '0';
 
            System.out.printf("%d %s\n", i, getDecode(boards, acc, r, c));
        }
    }
 
    private static String getDecode(int[][] boards, int[] acc, int r, int c) {
        StringBuilder builder = new StringBuilder();
        int y = 0, x = 0, accLength = 0, directionIndex = 0;
        do {
            acc[accLength++= boards[y][x];
            boards[y][x] = USE;
            if (accLength == 5) {
                accLength = 0;
                builder.append(toString(toDecimal(acc)));
            }
 
            if (isMovable(boards, r, c, y, x, directionIndex)
                    || isMovable(boards, r, c, y, x, directionIndex = (directionIndex + 1) % 4)) {
                y += directions[directionIndex][0];
                x += directions[directionIndex][1];
            } else {
                y = x = -1;
            }
        } while (y != -1);
 
        return builder.toString();
    }
 
    private static int toDecimal(int[] acc) {
        return 16 * acc[0+ 8 * acc[1+ 4 * acc[2+ 2 * acc[3+ acc[4];
    }
 
    private static String toString(int decimal) {
        return (decimal == 0) ? " " : String.format("%c",  'A' + (decimal - 1));
    }
 
    private static boolean isMovable(int[][] boards, int r, int c, int y, int x, int directionIndex) {
        int curY = y + directions[directionIndex][0], curX = x + directions[directionIndex][1];
        if (curY < 0return false;
        if (curY >= r) return false;
        if (curX < 0return false;
        if (curX >= c) return false;
        return boards[curY][curX] != USE;
    }
}
cs

 

나선모양으로 이진수를 읽은 뒤, 10진수로 변경 후, 문제에 주어진 방식처럼 문자로 변경하면 해결할 수 있는 문제입니다. 

나선모양으로 변경하기 위해 각 방향에 대한 이동 처리를 코드로 구현한 것이 아닌, 4가지 방향에 대한 상대좌표를 이용하도록 하였습니다.

 

1
    private static final int[][] directions = new int[][]{{01}, {10}, {0-1}, {-10}};
cs

 

 

이 포스트를 읽어주셔서 감사합니다. 🙇🏻‍♂️

반응형

'개발이야기 > 알고스팟' 카테고리의 다른 글

[NOTE] Note  (0) 2022.01.06
[MAGICPOWER] 마력  (0) 2022.01.05
[FIX] 문제 순서는 난이도 순이 아닙니다  (0) 2022.01.05
[CSBASEBALL] 각본 없는 야구  (0) 2022.01.05
[TSP1] Traveling Salesman Problem 1  (0) 2022.01.04
Posted by N'