티스토리 뷰

우선 글을 쓰기에 앞서 이 문제의 쉬운 버전이 있다.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD&categoryId=AV15FZuqAL4CFAYD&categoryType=CODE&problemTitle=1240&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

 

단순 2진 암호코드로, 이 문제를 풀기 전에 먼저 풀어보면 좋을 것 같다.

 

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15JEKKAM8CFAYD&categoryId=AV15JEKKAM8CFAYD&categoryType=CODE&problemTitle=1242&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

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

swexpertacademy.com

 

나는 내 힘으로 이 문제를 풀지 못했다. https://yabmoons.tistory.com/306 이 분의 블로그에 있는 코드를 거의 대부분 작성해서 냈다. 실질적인 도움은 이 분의 블로그에서 받는게 낫다.

이 문제를 1주일 넘게 잡고 있었는데 해결책을 전혀 찾질 못해서 결국 다른 분의 코드를 보고 제출했는데, 배울 점이 많다고 생각되어 블로그에 글을 남긴다.

 

1. 문제를 접근하는 방식

얼마전에 삼성 B형(프로)에 대해서 공부할 때 문제를 분석하고 손으로 코딩한 다음 코딩하기 시작하라고 하셨었다. 알고는 있었는데 빨리 맞추고 싶은 마음에 대충 분석하고 대충 코딩하고 했더니 시간만 버리고 잘 안 되더라.

그에 비해 이분은 열심히 분석한게 느껴진다. 이전 문제와 다른점과 함께 주의해서 코드를 작성해야 할 부분, 그에 대한 해결책까지 명확하게 작성한 후 코드를 짠다고 느꼈다. 나도 종이에 먼저 쓰면서 하는 편이긴 하지만 이정도로 상세하게 한 적은 없었다. 삼성 B형의 경우 지문 자체가 긴 편이라 지문만 확실하게 인지하고 스스로 설명할 수 있을 정도까지는 분석해야겠다는 생각이 들었다.

 

2. 코드 작성 방법

가장 많이 놀란 부분이기도 하다. 작성스타일도 다를 뿐더러 간결하다고 느껴졌다.

for (int i = 0; i < N; i++)
{
    for (int j = 0; j < M; j++)
    {
        char C; cin >> C;        // char형 값 하나를 입력받는다.
        if (C <= '9') C = C - '0';  // 일단, 주어진 char형 값을 int형으로 변환
        else C = C - 'A' + 10;



        for (int k = 0; k < 4; k++) // 16진수 값 하나는 4개의 비트를 가지므로...
        {
            MAP[i][j * 4 + k] = HexaToBinary[C][k];   

           // 현재 자리에서 4칸을 차지한 칸을 2진수 비트로 변환해서 맵에 저장
        }
    }
}  



출처: https://yabmoons.tistory.com/306 [얍문's Coding World..]

나는 문자열을 입력받아 쪼개는 방식을 택했는데 이분은 문자 하나를 입력받아 바로 2진수로 변환하는 과정을 거치셨다.

16진수를 10진수로 바꿀때 C - 'A' + 10을 하면 바로 10진수로 변환되는것은 처음 알아서 이 부분도 다음에 적용시켜보려고 한다.

int HexaToBinary[16][4] = {
    { 0, 0, 0, 0 }, // 0
    { 0, 0, 0, 1 }, // 1
    { 0, 0, 1, 0 }, // 2
    { 0, 0, 1, 1 }, // 3
    { 0, 1, 0, 0 }, // 4
    { 0, 1, 0, 1 }, // 5
    { 0, 1, 1, 0 }, // 6
    { 0, 1, 1, 1 }, // 7
    { 1, 0, 0, 0 }, // 8
    { 1, 0, 0, 1 }, // 9
    { 1, 0, 1, 0 }, // A
    { 1, 0, 1, 1 }, // B
    { 1, 1, 0, 0 }, // C
    { 1, 1, 0, 1 }, // D
    { 1, 1, 1, 0 }, // E
    { 1, 1, 1, 1 }  // F
};


출처: https://yabmoons.tistory.com/306 [얍문's Coding World..]

또한 비트마스킹을 이렇게 쓰면 된다는것을 알게 되어서, 이 부분도 다음에 적용시켜보려고 한다.

 if (MAP[i][j] == 1 && MAP[i - 1][j] == 0)
            {
                while (MAP[i][j] == 1) { Part[2]++; j--; }
                while (MAP[i][j] == 0) { Part[1]++; j--; }
                while (MAP[i][j] == 1) { Part[0]++; j--; }
                j++;
 
                int Min = Part[2];
                if (Part[1] < Min) Min = Part[1];
                if (Part[0] < Min) Min = Part[0];
 
                for (int i = 0; i < 3; i++) { Part[i] = Part[i] / Min; }
                
                Answer_Arr[Answer_Idx--] = Code[Part[0]][Part[1]][Part[2]];
                
                if (Answer_Arr[Answer_Idx + 1] == -1)
                {
                    Answer = 0;
                    return;
                }
 
                if (Answer_Idx == -1)
                {
                    int Value = (Answer_Arr[0] + Answer_Arr[2] + Answer_Arr[4] + Answer_Arr[6]) * 3 + Answer_Arr[1] + Answer_Arr[3] + Answer_Arr[5] + Answer_Arr[7];
                    if (Value % 10 == 0)
                    {
                        for (int i = 0; i < 8; i++) Answer = Answer + Answer_Arr[i];
                    }
                    Answer_Idx = 7;
                }
            }


출처: https://yabmoons.tistory.com/306 [얍문's Coding World..]

이 부분은 문제풀이의 핵심이라고 할 수 있는 부분인데, 놀랐던 점이 두 가지 정도 있었다.

1. 이 문제에서 나오는 똑같은 암호코드의 중복처리 부분: 윗줄이 0이고 아랫줄이 1일때만 시작하면 암호코드의 가장

마지막 행에서만 조건문을 수행하게 된다. 이를 통해 자연스럽게 중복을 처리할 수 있다.

2. while문을 통해 1,0,1의 반복을 간결하게 처리한 점이 정말 괜찮다고 생각했다.

 

 

이번 문제를 풀면서 문제를 단순히 풀기만 하는게 중요한게 아니라 실력 향상이 중요하다는것을 제대로 깨닫게 되었다.

앞으로 푸는 문제들은 내가 언제 나와도 풀 수 있도록 운이나 감에 의지하지 않고 확실히 공부해야겠다는 생각이 든다.

 

'PS > 잡담' 카테고리의 다른 글

삼성전자 DX부문 동계 알고리즘 역량 강화 특강 시작  (0) 2023.01.31
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함