Machineboy空

Excercism - Rail Fence Cipher : 지그재그, 1,-1 방향 조절 본문

Computer/Coding Test

Excercism - Rail Fence Cipher : 지그재그, 1,-1 방향 조절

안녕도라 2025. 1. 23. 18:57

문제요약

지그재그 암호문을 만들라!


난이도

Medium


풀이 포인트

  • 0,1,2,1,0,1,2,1,0 지그재그 만들기 : 1,-1 로 방향 조절해주기
  • null 병합자
  • 람다식

충분히 많이 쓰이는 아이디어들이니 숙지해두자!


REVIEW

 

뇌가 굳은 건진 모르겠지만 너무 어려웠다.

항상 추천을 많이 받은 모범 풀이들은 내가 아직 익숙치 않은 LINQ를 쓴다거나, 

내가 절대 구현할 수 없을 것 같은 화려한 풀이들이 많아서 좌절하게 되는데.. 그중에 발견한 아름다운 풀이.

 

정말 문제 설명 그대로 찬찬히 구현해 나가셨다.. 천재

어려운 문법 쓰지 않으면서도 깔끔하게 흐름이 보이도록 적혀있어서 정말 큰 도움..

 

지그재그 암호문을 만드는 문제인데, 수학적인 건 참 아름답다..

특정 정수와 암호 길이를 각 변의 길이로 하는 직사각형 배열에 완벽한 대칭의 지그재그 암호를 그려낼 수 있다는 것.

여튼 이후에 다른 곳에 적용해서 뭔가 시각적으로 활용해보고 싶다고 생각한 문제.


CODE 

// 지그재그 문자열을 행별로 읽기
public string Encode(string input)
    {
        string[] rails = new string[_rails];
        string output = string.Empty;
        int index = 0;
        Func<int, int> NextStep = (x) => x + 1;
        
        foreach (char c in input)
        {
            rails[index] += c.ToString() ?? "";
            if (index == _rails - 1) NextStep = (x) => x - 1;
            else if (index == 0) NextStep = (x) => x + 1;
            index = NextStep(index);
        }
        for (int i = 0; i < rails.Length; i++)
            output += rails[i];
        return output;
    }

 

// 지그재그 문자열을 지그재그로 읽기

public string Decode(string input)
    {
        char[,] lines = new char[_rails, input.Length];
        int row = 0;
        int col = 0;
        int inc = 1;
        
        foreach (char c in input)
        {
            lines[row, col] = '?';
            row += inc;
            col++;
            if (row < 0 || row >= _rails)
            {
                row -= 2 * inc;
                inc = -inc;
            }
        }
    
        string decoded = "";
        int inputIndex = 0;
        for (int firstDimIndex = 0; firstDimIndex < _rails; firstDimIndex++) 
            for (int secondDimIndex = firstDimIndex; secondDimIndex < input.Length; secondDimIndex++) 
                if (lines[firstDimIndex,secondDimIndex] == '?')
                    lines[firstDimIndex,secondDimIndex] = input[inputIndex++];
        
        row = 0; 
        col = 0;
        foreach (char c in input)
        {
            decoded += lines[row, col];
            row += inc;
            col++;
            if (row < 0 || row >= _rails)
            {
                row -= 2 * inc;
                inc = -inc;
            }
        }              
    
        return decoded;
    }