Instructions
Instructions A stream of data is received and needs to be reversed.
Each segment is 8 bits long, meaning the order of these segments needs to be reversed, for example:
11111111 00000000 00001111 10101010
(byte1) (byte2) (byte3) (byte4)
should become:
10101010 00001111 00000000 11111111
(byte4) (byte3) (byte2) (byte1)
The total number of bits will always be a multiple of 8.
The data is given in an array as such:
[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0]
My Solution
namespace Main{
using System;
public class Kata
{
public static int[] DataReverse(int[] data)
{
const int SEG_COUNT = 8;
int segNum = data.Length / SEG_COUNT;
int[] dataRevers = new int[data.Length];
for (int i = 0; i < data.Length; i++)
{
int currSeg = i / SEG_COUNT;
int idx = ((segNum - currSeg - 1) * SEG_COUNT) + i % SEG_COUNT;
dataRevers[idx] = data[i];
}
return dataRevers;
}
}
}
8 비트씩 끊어서 뒤에다 정렬해 줘야되는 문제 for문에서 해당 인덱스값으로 변환해주어서 해결 하였다.
Best Practices
namespace Main
{
using System;
public class Kata
{
public static int[] DataReverse(int[] data)
{
int[] bits = data;
for(int i = 0; i < data.Length; i+=8)
{
Array.Reverse(bits, i, 8);
}
Array.Reverse(bits);
return bits;
}
}
}
8비트씩 끊어서 리버스를 해준다음에 전체 리버스를 해주면 해당되는 값이 나온다.
이걸 어떻게 생각했지?? 란 생각이 드네.. 기발하네..
(원래 값)
11111111 00000000 00001111 10101010
(8비트 리버스)
11111111 00000000 11110000 01010101
(전체 리버스)
10101010 00001111 00000000 11111111