사진 1. 그저 빛발란스

블랙 프라이데이의 신호탄이었던 뉴발 993

해외 직구가 서툴러서 이거 하나 사는데도 꽤나 신중하게 주문했다.

 

사진 2. 갓발란스

그렇게 신중했는데도, 사이즈를 잘못 주문해서 취소하고 다시 했었다.

왜 여자 사이즈랑 남자 사이즈를 나눠서 하는 건지..

 

 

사진 3. 회색이라 어디든 좋다.

아무튼 그래도 사놓고 한번도 후회는 커녕 오히려 잘 샀다고 생각하는 신발이다.

웃긴 건 마음으로 '질러야해!' 하고 지른 신발이 아닌,

머리로 '이건 색깔도 무난하고 사면 여기저기 잘 신을 수 있을 거 같다.' 란 생각으로 산 신발이라

사고 나서도 감흥이 없었는데, 신고다니면서 점점 좋아지는 신발이다.

 

사진 4. 대충 찍어도 이쁘다.

역시 뉴발란스는 날 실망시킨 적이 없다. 이번 뉴발란스가 내 생의 두번째 뉴발란스라는 건 비밀..

 

사진 1. ABKO AR87 Navy

2019년, 연말 지름 아이템 중 하나인 키보드. 그 전에 쓰던 리얼포스 님의 타건감에 질리기 시작해서 키보드를 사야겠다고 마음 먹었다. 지인 중에 키보드 덕후가 있어 그 사람의 추천으로 지른 하이엔드 키보드 AR87이다.

 

하이엔드라고 하기엔 커스텀 키보드들이 가격이 더 나가긴 하지만 기성품 중에서는 가격이 꽤 있는 편이니..

그리고 내 입장에선 꽤나 큰 지출!

그럼 이제 대충 간단 사용기를 올려보겠다.

 


구성품

 

원래는 AR87이 담겨져 있을 박스 사진도 있어야하지만..

아직 리뷰나 사용기를 올리기엔 내공이 부족해서 박스는 깜빡하고 촬영하지 못했다. 심지어 바로 버렸다..

다음번에 하게 될 리뷰에서는 박스를 버리기 전에 사진부터 찍는 걸로...

 

사진 2. 구성품

대강 구성품은 위 사진과 같다.

1. 키보드

2. USB type C to USB type A 케이블 

3. 청소용 솔

4. 키캡 리무버

5. 케이스.

 

사진 3. 케이스

케이스 내부에는 별도의 쿠션 같은 건 있지 않아서 케이스가 외부 충격으로부터 키보드를 잘 지켜줄 것 같진 않다. 하지만 이런 케이스가 있어줘서 고맙다. 케이스가 있었기 때문에 키보드가 있던 박스는 뒤도 안돌아보고 버렸다.

 

사진 4. 청소용 솔

키보드 청소용 솔이 있는 건 무척 좋았다. 이런 걸 별도로 구매하기엔 뭔가 아깝다는 생각이 들었기 때문이다.

이런 점은 좋았지만 개인적으로 아쉬운 점은 키보드 가격대가 어느정도 있는 편인데 루프정도는 있었으면 좋지 않았을까 생각한다.

 

 


외관

 

사진 5. 사이드 LED

외관을 보면 사이드에 LED가 있다. LED를 있는 것과 없는 것을 고르라 했으면 없는 걸 골랐겠지만 요즘은 LED가 없는 걸 찾는게 더 어려운 듯하다.

 

사진 6. 키보드 정면

밝은 곳에서 타건을 하게 된다면 사이드에 LED는 잘 보이지 않는다. 밑에 패드 같은 걸 이용해서 빛이 반사된다면 잘 보일것 같아 장패드도 구매할 예정이다.

 

사진 7. 키보드 항공뷰

하우징은 풀 알루미늄으로 무게가 제법 나가는 편이다. 집에 저울이 없어서 직접 무게를 재진 못했지만 스펙상으로 2.9kg이라는 묵직한 키보드다. 처음 박스 채로 받았을 때도 꽤 무거웠던 기억이 있다. 당연한 이야기겠지만 그래서 휴대용으로 들고다니기엔 힘들 것 같다.

 

사진 8. USB Type C

하우징 색상은 실버, 다크 그레이, 네이비가 있다. 한정판으로 레드 색상도 있던 것 같지만 현재 판매는 3가지 색상만 하는 중이다. 이번에 내가 구매한 네이비 색상은 최근에 추가된 색상이기도 한데, 호불호가 많이 갈리는 듯하다.

조금 더 어두운 네이비였다면 이만큼 호불호가 갈릴 일은 없었을 것 같다.

하우징의 윗부분과 아랫부분 색상 차이도 있다는데, 내가 받은 제품은 딱히 없는 것 같았다.

케이블을 연결하는 단자는 USB Type C이며 정중앙에서 살짝 벗어난 곳에 위치해있다.

 

사진 9. 기본 키캡

기본 키캡은 이렇게 생겼다. 다크 그레이에 들어가는 키캡과 동일한 키캡이라고 생각된다. 다크 그레이를 실물로 본적은 없어서 확실하진 않지만, 인터넷에서 보이는 사진 상으로는 둘이 거의 동일한 것 같다.

다크그레이 색상에는 기본 키캡이 어울리는 색인 것 같지만, 네이비에는 기본 키캡이 안어울리는 것 같다는 생각이 든다.

네이비 색상이 생각보다 채도가 있는 편이라 이런 어두운 색 보단 나름 알록달록한 키캡이 어울릴 것 같다.

사진에서 알 수 있듯이 키캡 마감이 좋은 편은 아니다.

 

 


키감

 

사진 10. 키보드 스위치

키보드 스위치는 체리 스위치 갈축이다.

보통 이 키보드는 적축이나 흑축같은 리니어들을 많이 선택하고, 내 취향도 리니어 방식을 선호하긴 하지만,

예전에 다른 지인의 레오폴드 갈축을 타건 해보고는 다음 키보드는 무적권 갈축이다! 라고 마음 먹었었다.

아직 사용한 지 일주일도 채 안됐지만 아직은 질리지 않고 재밌게 타건 하고 있다.

 

키보드 커뮤니티에선는 순정 상태의 키보드로는 윤활유 상태나 스테빌 상태가 매우 좋지 않아 공방을 맡겨야 한다는 말을 들었다.

확실히 shift나 space bar 같은 커다란 키들은 조금 어색한 느낌도 들긴 하지만 나는 키보드 매니아들처럼 아주 예민한 감각은 없기에 기분좋게 타건하고 있다.

축 방식도 리니어가 아닌 넌클릭이기때문에 윤활유에 대한 압박도 덜한 편이기도 하다.

그래서 굳이 공방에 맡기는 일은 없을 것 같다.

 

여담으로 기본 키캡이 생긴 것이 마음에 들지 않아 MAXKEY 사의 키캡을 하나 지름 상태다. 호불호가 많이 타는 SA 키캡이라 기대 반, 걱정 반이긴 하지만 일단, 키보드를 매우 좋아하는 지인의 SA 키캡 키보드를 타건했을 때는 꽤나 만족스러웠다. 키캡이 바뀌면 키감도 많이 달라질 텐데, 과연 어떤 느낌일지 궁금하다. 키캡이 도착하면 키캡도 포스팅할 것이다.

 

 


여담

 

 

IT 관련 공부를 주로 포스팅하고 나머지 내 관심사는 짧고 대충 올리려고 했는데, 쓰다보니 계속 더 쓸게 생각나서 길이 처음 계획보다 많이 길어졌다. 오히려 주객이 전도된 느낌..?

AR87 네이비를 사려고 마음 먹었을 때, AR87 네이비에 관한 정보를 찾아보기가 힘들었는데 그때의 기억때문인지 쓰다보니 길게 쓰게 된 것 같다.

 

아무튼 연말에 지른 아이템 중 하나인 AR87. 좀 더 오래 써보고 리뷰 생각나면 리뷰할 것이다.

 

<사진 출처>

사진 1. http://www.abko.co.kr/shop/product_item.php?ItId=2586312747

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14vXUqAGMCFAYD&categoryId=AV14vXUqAGMCFAYD&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

<서론>

문제 링크는 위에.. 오랫동안 알고리즘 쉬다가 다시 공부를 시작하려한다. 이번 문제는 복귀 문제. 한창 풀때였으면 기계적으로 빠르게 풀었겠지만, 너무 오랜만에 해서 그런지 좀많이 허둥댔다. 역시 알고리즘은 빡세게 안할 때라도 하루에 한문제는 풀어야할 것 같다.

이번 문제는 제목에서 알 수 있듯이 경로 탐색 문제! 그럼 이번 문제도 풀어보자.


 

 

<본론>

이번엔 테스트 케이스 수를 입력 받아서 그 수만큼 반복문을 실행하는 것은 아니고, 테스트 케이스는 10개로 고정되어있다. 처음 받는 숫자는 테스트케이스 개수가 아니라 테스트케이스 번호라는 것을 알아야한다. 이걸 처리하는 방법은 많겠지만, 난 귀찮아서 입력만 받고 그냥 넘겼다. 이번 문제는 경로 문제답게 간단하게 bfs 방법을 이용해서 풀었다. 알고리즘은 별반 다를 것 없다.

1. 시작 좌표를 큐에 저장
2. 큐가 빌 때까지 또는 목표에 도착할 때까지, 다음을 반복
  2-1 큐 pop
  2-2 큐에서 꺼낸 좌표의 4방향 체크
    2-2-1 4방향에 있는 값을 방문한 적이 없고, 0이면 큐에 추가
    2-2-2 4방향에 있는 값을 방문한 적이 없고, 3이면 목표 도착 체크

평범한 bfs 문제였다. 특별히 신경써서 처리할 것도 없고, 최단 경로의 길이를 구하는 문제도 아니고 그저 도착할 수 있는지만 확인하는 문제. 그런데 오랜만에 풀어서 어처구니 없는 실수들을 반복했다. 다음은 실수들에 대한 정리이다. 바로 코드를 보고 싶은 사람은 바로 결론으로..

 

1. Input 값 처리 실수

이 문제를 풀 때 발생한 첫 예외처리. 로직을 확인하기도 전에 값을 입력받을 때 문제가 있었다. 아무 생각 없이 nextInt() 메소드를 이용해서 MAP[][] 배열에 값을 넣으려고 했는데, 모든 숫자가 붙어있어서 nextInt를 해버리면 1자리 숫자가 아닌 16자리 숫자로 입력되는 것이었다. 하는 수 없이 String 객체로 입력 받고, split 메소드를 이용해서 잘라 넣었다. MAP 배열을 String 배열로 선언해서 풀 수 있었지만, 이미 모든 로직을 정수형일 경우로 정해놓고 풀어서 input 값을 integer로 파싱했다.

2. 배열 범위 초과

입력 문제를 해결하자 곧바로 다른 예외 발생. 배열 범위를 벗어난다는 어처구니없는 오류였다. 배열을 0,0에서부터 15,15까지 4방향을 체크하게 짜두었는데 가장자리 부분에서 예외가 발생한 것이다. 정말 초보적인 실수를 하고야 말았다. 배열을 2칸 키워서 처리했다. 이래서 알고리즘은 쉬면 안되는 것이다.

3. 무한 루프

배열까지 처리했더니 프로그램이 종료가 안되는 것이었다. 그래서 디버깅 모드로 확인했더니... 블로그에 적지말까? 하고 고민했을 정도로 창피한 실수를 했다. que의 첫번째 원소를 가져오기만 하고 제거를 안한 것이었다. 큐가 빌 때까지 도는 반복문이었기 때문에 곧바로 무한루프.. 버그를 고치면서도 스스로 민망했다.

4. 시작점 설정 실수

아직도 실수가 남았다. 배열을 2칸 늘렸으니 저장되는 시작점의 위치도 그에 따라 바꿔야하는데 그러질 못했다. 그래서 자꾸 답이 다른 답이 나오는 것이었다. 디버깅할 때도 도대체 왜 시작점을 이상하게 잡는 건지 한참을 고민했다. 시작점을 찾는 if문에는 이쁘게 잘 j+1이라고 적어놓고선 실제로 저장할 땐 그냥 j만 저장했다. 간신히 찾고 다시 돌린 결과 정답.. 힘들었다.

 

<결론>

요약은 패스.

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
92
93
94
95
96
97
98
99
100
101
102
package d190610;
 
import java.util.LinkedList;
import java.util.Scanner;
 
// 1226 미로 1
public class Solution {
 
    static int[][] MAP = new int[18][18];
    static int[] dx = {0-101};
    static int[] dy = {10-10};
 
    static public void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
 
        for(int testCase = 1; testCase <= 10; testCase++) {
            boolean[][] visited = new boolean[18][18];
            String t = sc.next();
            int[] start = new int[2];
            int ans = 0;
            for(int i=0; i<18; i++) {
                if(i!=0 && i!=17){
                    String str = sc.next();
                    String[] strArr = str.split("");
                    for(int j=0; j<strArr.length; j++) {
                        MAP[i][j+1= Integer.parseInt(strArr[j]);
                        if(MAP[i][j+1]==2) {
                            start[0= j+1;
                            start[1= i;
                        }
                    }
                }
                MAP[0][i] = 8;
                MAP[i][0= 8;
                MAP[i][17= 8;
                MAP[17][i] = 8;
            }
 
            /*  이건 그냥 MAP 확인용
            System.out.println("====="+testCase);
            for(int i=0; i<18; i++) {
                for(int j=0; j<18; j++) {
                    System.out.print(MAP[i][j]+"");
                }
                System.out.println();
            }
            System.out.println("====="+testCase);
            */
 
            LinkedList<Cord_1226> que = new LinkedList<>();
            que.add(new Cord_1226(start[0], start[1]));
            while(!que.isEmpty()) {
                if(ans==1break;
                Cord_1226 cd = que.get(0);
                que.removeFirst();
                int x = cd.getX();
                int y = cd.getY();
                for(int dir=0; dir<4; dir++){
                    if(MAP[y+dy[dir]][x+dx[dir]]==0 && !visited[y+dy[dir]][x+dx[dir]]) {
                        que.add(new Cord_1226(x+dx[dir], y+dy[dir]));
                        visited[y+dy[dir]][x+dx[dir]] = true;
                    } else if(MAP[y+dy[dir]][x+dx[dir]]==3 && !visited[y+dy[dir]][x+dx[dir]]) ans = 1;
                }
            }
 
            System.out.println("#"+testCase+" "+ans);
        }
        sc.close();
    }
 
}
 
class Cord_1226{
    private int x;
    private int y;
 
    Cord_1226(){}
 
    Cord_1226(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    public int getX() {
        return x;
    }
 
    public int getY() {
        return y;
    }
 
    public void setY(int y) {
        this.y = y;
    }
 
    public void setX(int x) {
        this.x = x;
    }
 
}
 
cs
;

+ Recent posts