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

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

 

algospot.com :: BOARDCOVER

게임판 덮기 문제 정보 문제 H*W 크기의 게임판이 있습니다. 게임판은 검은 칸과 흰 칸으로 구성된 격자 모양을 하고 있는데 이 중 모든 흰 칸을 3칸짜리 L자 모양의 블록으로 덮고 싶습니다. 이

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.util.Scanner;
 
public class Main {
    private static final char WHITE = '.';
    private static final char USE = '^';
    /**
     * index 가 빠른 순서를 기준으로 탐색하기 위한 상태좌표 (y, x)
     * 칸을 덮는 부분에 대해 코드로 구현하는 것이 아닌, 데이터로 나타내는 것이 중요하다.
     *
     * (1) **  (2) *   (3) **  (4)  *
     *      *      **      *       **
     */
    private static final int[][][] coverTypes = {
            {{00}, {01}, {11}}, // (1)
            {{00}, {10}, {11}}, // (2)
            {{00}, {10}, {01}}, // (3)
            {{00}, {1-1}, {10}} // (4)
    };
    private static final char[][] boards = new char[20][20];
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0) {
            int h = scanner.nextInt();
            int w = scanner.nextInt();
            for (int i = 0; i < h; ++i) {
                String line = scanner.next();
                for (int j = 0, len = line.length(); j < len; ++j) {
                    boards[i][j] =  line.charAt(j);
                }
            }
 
            System.out.println(getCount(h, w));
        }
    }
 
    private static int getCount(int h, int w) {
        Coordinate start = getStart(h, w);
        if (start == null) {
            // 기저사례 : 시작할 좌표가 없다면, 모든 보드가 채워졌음.
            return 1;
        }
 
        int ret = 0;
        for (int type = 0; type < 4++type) {
            if (isCoverall(h, w, start.y, start.x, type)) {
                cover(start.y, start.x, type, true);
                ret += getCount(h, w);
                cover(start.y, start.x, type, false);
            }
        }
 
        return ret;
    }
 
    private static Coordinate getStart(int h, int w) {
        for (int i = 0; i < h; ++i) {
            for (int j = 0; j < w; ++j) {
                if (boards[i][j] == WHITE) return new Coordinate(i, j);
            }
        }
        return null;
    }
 
    private static boolean isCoverall(int h, int w, int y, int x, int type) {
        for (int i = 0; i < 3++i) {
            int targetY = y + coverTypes[type][i][0], targetX = x + coverTypes[type][i][1];
            if (targetY < 0 || targetY >= h) return false;
            if (targetX < 0 || targetX >= w) return false;
            if (boards[targetY][targetX] != WHITE) return false;
        }
 
        return true;
    }
 
    private static void cover(int y, int x, int type, boolean isCover) {
        for (int i = 0; i < 3++i) {
            boards[y + coverTypes[type][i][0]][x + coverTypes[type][i][1]] = isCover ? USE : WHITE;
        }
    }
 
    private static final class Coordinate {
        final int y, x;
 
        public Coordinate(int y, int x) {
            this.y = y;
            this.x = x;
        }
    }
}
cs


이 풀이는 기존에 풀었던 아래 문제와 유사합니다. 

 

[PICNIC] 피크닉


재귀로 완전 탐색을 하되, 중복 케이스를 세는 것을 방지하기 위해 사전 순을 기준으로 조회하도록 하였습니다.

이번 문제에서 한번 더 주의 깊게 살펴볼 내용은 게임판을 덮는 케이스 4 가지를 배열로 선언했다는 점인데요. 
처음 문제를 풀었을 때는 게임판을 덮는 방법을 코드로 제작하였는데, 각 방법의 변하는 부분인 상대좌표를 배열로 나타낸다면 조금 더 보기 쉬운 코드가 만들어질 수 있음을 알게 되었습니다.

1
2
3
4
5
6
int[][][] coverTypes = {
    {{00}, {01}, {11}}, // (1)
    {{00}, {10}, {11}}, // (2)
    {{00}, {10}, {01}}, // (3)
    {{00}, {1-1}, {10}} // (4)
};
cs



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

반응형

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

[XHAENEUNG] 째능 교육  (0) 2021.12.29
[URI] URI Decoding  (0) 2021.12.29
[HOTSUMMER] 에어컨을 끈다고 전력난이 해결될까?  (0) 2021.12.27
[CONVERT] Conversions  (0) 2021.12.27
[PICNIC] 소풍  (0) 2021.12.27
Posted by N'

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

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

 

algospot.com :: HOTSUMMER

에어컨을 끈다고 전력난이 해결될까? 문제 정보 문제 점점 더워지는 여름! 가뜩이나 집에서 바깥바람과 선풍기만으로 더위를 이겨내려고 하는 대학원생 LIBe에게 근무 시간 내내 에어컨을 틀 수

www.algospot.com

 

풀이입니다. 🤔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0) {
            int w = scanner.nextInt();
            int sum = 0;
            for (int i = 0; i < 9++i) sum += scanner.nextInt();
 
            System.out.println(w >= sum ? "YES" : "NO");
        }
    }
}
cs

 

 

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

반응형

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

[URI] URI Decoding  (0) 2021.12.29
[BOARDCOVER] 게임판 덮기  (0) 2021.12.28
[CONVERT] Conversions  (0) 2021.12.27
[PICNIC] 소풍  (0) 2021.12.27
[ENCRYPT] 문자열 암호화  (0) 2021.12.27
Posted by N'

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

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

 

algospot.com :: CONVERT

Conversions 문제 정보 문제 Conversion between the metric and English measurement systems is relatively simple. Often, it involves either multiplying or dividing by a constant. You must write a program that converts between the following units: Type M

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
import java.util.*;
 
public class Main {
    private static final String KG = "kg";
    private static final String L = "l";
    private static final String LB = "lb";
    private static final String G = "g";
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        for (int i = 1; i <= cases; ++i) {
            double number = scanner.nextDouble(), convertNumber;
            String unit = scanner.next(), convertUnit;
            switch (unit) {
                case KG:
                    convertNumber = 2.2046 * number;
                    convertUnit = LB;
                    break;
 
                case L:
                    convertNumber = 0.2642 * number;
                    convertUnit = G;
                    break;
 
                case LB:
                    convertNumber = 0.4536 * number;
                    convertUnit = KG;
                    break;
 
                case G:
                    convertNumber = 3.7854 * number;
                    convertUnit = L;
                    break;
 
                default:
                    throw new IllegalArgumentException();
            }
 
            System.out.printf("%d %.4f %s\n", i, convertNumber, convertUnit);
        }
    }
}
cs



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

반응형

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

[BOARDCOVER] 게임판 덮기  (0) 2021.12.28
[HOTSUMMER] 에어컨을 끈다고 전력난이 해결될까?  (0) 2021.12.27
[PICNIC] 소풍  (0) 2021.12.27
[ENCRYPT] 문자열 암호화  (0) 2021.12.27
[LECTURE] Lecture Note  (0) 2021.12.27
Posted by N'

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

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

 

algospot.com :: PICNIC

소풍 문제 정보 문제 안드로메다 유치원 익스프레스반에서는 다음 주에 율동공원으로 소풍을 갑니다. 원석 선생님은 소풍 때 학생들을 두 명씩 짝을 지어 행동하게 하려고 합니다. 그런데 서로

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
import java.util.*;
 
public class Main {
    // 친구 관계 정의
    // friends[0][1] 이 true 라면, 0 과 1 은 친구.
    private static final boolean[][] friends = new boolean[10][10];
    private static final boolean[] uses = new boolean[10];
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0) {
            int n = scanner.nextInt(), m = scanner.nextInt();
            for (int i = 0; i < m; ++i) {
                int a = scanner.nextInt(), b = scanner.nextInt();
                friends[a][b] = true;
                friends[b][a] = true;
            }
            
            System.out.println(getCombinationCount(n));
            
            Arrays.fill(uses, false);
            for (int i = 0; i < n; ++i) Arrays.fill(friends[i], false);
        }
    }
 
    private static int getCombinationCount(int n) {
        int indexOfNotUses = getMinIndexOfNotUses(n);
        // 기저 사례 : 모든 사람이 사용되었음
        if (indexOfNotUses == -1return 1;
 
        // 작은 수가 큰 수를 선택하는 방식으로 탐색할 가짓수를 줄인다.
        // [1, 3] 과 [3, 1] 은 동일.
        int ret = 0;
        for (int i = indexOfNotUses + 1; i < n; ++i) {
            if (uses[i]) continue;
            if (!friends[indexOfNotUses][i]) continue;
 
            uses[indexOfNotUses] = uses[i] = true;
            ret += getCombinationCount(n);
            uses[indexOfNotUses] = uses[i] = false;
        }
 
        return ret;
    }
 
    private static int getMinIndexOfNotUses(int n) {
        for (int i = 0; i < n; ++i) {
            if (!uses[i]) return i;
        }
 
        return -1;
    }
}
 
cs

 


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

반응형

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

[HOTSUMMER] 에어컨을 끈다고 전력난이 해결될까?  (0) 2021.12.27
[CONVERT] Conversions  (0) 2021.12.27
[ENCRYPT] 문자열 암호화  (0) 2021.12.27
[LECTURE] Lecture Note  (0) 2021.12.27
[DRAWRECT] 사각형 그리기  (0) 2021.12.27
Posted by N'

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


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

 

algospot.com :: ENCRYPT

문자열 암호화 문제 정보 문제 특정 메시지를 암호화 하는 방법은 오랫 동안 다양하게 연구되었다. 그러한 방법들 중에서 가장 간단한 방법을 생각해보자. 특정 문자열을 입력받는다. 편의상 문

www.algospot.com


풀이입니다. 🤔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0) {
            String str = scanner.next();
            int len = str.length();
            for (int i = 0; i < len; i += 2System.out.print(str.charAt(i));
            for (int i = 1; i < len; i += 2System.out.print(str.charAt(i));
            System.out.println();
        }
    }
}
cs

 

 

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

반응형

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

[CONVERT] Conversions  (0) 2021.12.27
[PICNIC] 소풍  (0) 2021.12.27
[LECTURE] Lecture Note  (0) 2021.12.27
[DRAWRECT] 사각형 그리기  (0) 2021.12.27
[ENDIANS] Endians  (0) 2021.12.27
Posted by N'

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

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

 

algospot.com :: LECTURE

Lecture Note 문제 정보 문제 Professor Lew teaches Algorithm course in Sonyusi University (소녀시대학교). It is his first year as a professor, so he spends a lot of time making lecture notes. He'll teach recursion and sorting algorithms in the n

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
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0) {
            String line = scanner.next();
 
            for (int i = 0, len = line.length(); i < len; i += 2) strings.add(line.substring(i, i + 2));
            sort(strings);
 
            for (String str : strings) System.out.print(str);
            System.out.println();
 
            strings.clear();
        }
    }
 
    // Java 표준 Sort 를 사용해도 좋다.
    private static void sort(List<String> strings) {
        for (int i = 0, size = strings.size(); i < size; ++i) {
            for (int j = i + 1; j < size; ++j) {
                String a = strings.get(i), b =  strings.get(j);
                if (a.compareTo(b) > 0) {
                    strings.set(i, b);
                    strings.set(j, a);
                }
            }
        }
    }
}
cs

 


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

반응형

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

[PICNIC] 소풍  (0) 2021.12.27
[ENCRYPT] 문자열 암호화  (0) 2021.12.27
[DRAWRECT] 사각형 그리기  (0) 2021.12.27
[ENDIANS] Endians  (0) 2021.12.27
[MERCY] Merciful Algospot  (0) 2021.12.27
Posted by N'

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

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

 

algospot.com :: DRAWRECT

사각형 그리기 문제 정보 문제 AdbyMe, Inc. 의 인턴인 A.I.는 웹 브라우저에 직사각형을 그리는 코드를 작성해야 한다. 웹 브라우저는 직사각형 모양의 뷰포트를 가지고 있고, 그려지는 직사각형의

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
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Map<Integer, Integer> xCounts = new HashMap<>(), yCounts = new HashMap<>();
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0) {
            for (int i = 0; i < 3++i) {
                input(xCounts, scanner.nextInt());
                input(yCounts, scanner.nextInt());
            }
 
            System.out.printf("%d %d\n", getAnswer(xCounts), getAnswer(yCounts));
 
            xCounts.clear();
            yCounts.clear();
        }
    }
 
    private static void input(Map<Integer, Integer> counts, int num) {
        if (counts.containsKey(num)) counts.put(num, counts.get(num) + 1);
        else counts.put(num, 1);
    }
 
    private static int getAnswer(Map<Integer, Integer> countGroup) {
        Set<Integer> keySet = countGroup.keySet();
        if (countGroup.size() == 1return keySet.iterator().next();
        else {
            for (Integer n : keySet) {
                if (countGroup.get(n) == 1return n;
            }
        }
 
        throw new IllegalStateException("Cannot found answer");
    }
}
 
cs

 


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

반응형

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

[ENCRYPT] 문자열 암호화  (0) 2021.12.27
[LECTURE] Lecture Note  (0) 2021.12.27
[ENDIANS] Endians  (0) 2021.12.27
[MERCY] Merciful Algospot  (0) 2021.12.27
[HELLOWORLD] Hello World  (0) 2021.12.27
Posted by N'

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


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

 

algospot.com :: ENDIANS

Endians 문제 정보 문제 The two island nations Lilliput and Blefuscu are severe rivals. They dislike each other a lot, and the most important reason was that they break open boiled eggs in different ways. People from Lilliput are called little-endians

www.algospot.com


풀이입니다. 🤔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0) {
            long n = scanner.nextLong(); // Input is 32-bit unsigned
            // 00010010[1] 00110100[2] 01010110[3] 01111000[4]
            System.out.println(
                    ((n & 0xff<< 24+        // Parse [4] and shift left by 24bit
                    ((n & 0xff00<< 8+       // Parse [3] and shift left by 8bit
                    ((n & 0xff0000>> 8+     // Parse [2] and shift right by 8bit
                    ((n & 0xff000000>> 24)    // Parse [2] and shift right by 24bit
            );
        }
    }
}
cs



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

 

반응형

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

[ENCRYPT] 문자열 암호화  (0) 2021.12.27
[LECTURE] Lecture Note  (0) 2021.12.27
[DRAWRECT] 사각형 그리기  (0) 2021.12.27
[MERCY] Merciful Algospot  (0) 2021.12.27
[HELLOWORLD] Hello World  (0) 2021.12.27
Posted by N'

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

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

 

algospot.com :: MERCY

Merciful Algospot 문제 정보 문제 The administrators of algospot.com are so merciful, that they prepared really, really easy problem to prevent contestants from frustration. 입력 Input contains just one positive integer N(N <= 10). 출력 Print N li

www.algospot.com


풀이입니다. 🤔

1
2
3
4
5
6
7
8
9
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0System.out.println("Hello Algospot!");
    }
}
cs

 


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

반응형

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

[ENCRYPT] 문자열 암호화  (0) 2021.12.27
[LECTURE] Lecture Note  (0) 2021.12.27
[DRAWRECT] 사각형 그리기  (0) 2021.12.27
[ENDIANS] Endians  (0) 2021.12.27
[HELLOWORLD] Hello World  (0) 2021.12.27
Posted by N'

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

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

 

algospot.com :: HELLOWORLD

Hello World! 문제 정보 문제 예의 바른 프로그래머들은 인사를 잘 합니다. 프로그래밍 언어를 배우면서 처음으로 짜는 프로그램이 항상 Hello World! 인 것만 봐도 알 수 있지요. AOJ 의 첫 문제에서도

www.algospot.com


풀이입니다. 🤔

1
2
3
4
5
6
7
8
9
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0System.out.printf("Hello, %s!\n", scanner.next());
    }
}
cs

 

 


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

반응형

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

[ENCRYPT] 문자열 암호화  (0) 2021.12.27
[LECTURE] Lecture Note  (0) 2021.12.27
[DRAWRECT] 사각형 그리기  (0) 2021.12.27
[ENDIANS] Endians  (0) 2021.12.27
[MERCY] Merciful Algospot  (0) 2021.12.27
Posted by N'