본문으로 바로가기

SW Expert Academy 1240. 단순 2진 암호코드

 문제에서는 0과 1로 구성된 영상물에 삽입된 암호 코드를 추출하여 

암호 코드가 정상적인 암호코드인지 판별하는 코드를 구현해야 한다.

삼성 SW Expert Academy에서 푼 문제 리스트 보기

github에서 코드 보기

문제 조건

- “(홀수 자리의 합 x 3) + 짝수 자리의 합 + 검증 코드” 가 10의 배수가 되어야 한다.

문제 풀이

처음에는 문제 자체가 이해가 가지 않을 수도 있다. 주어진 그림이 이해가 잘 되지 않기 때문인데 그것만 이해하면 쉽게 문제를 풀 수 있다. 그래서 난이도가 D2인듯.

먼저 input 값에서 암호 코드를 추출해 내야 한다. 필요없는 0들로 둘러쌓인 값들 중에서 0으로 시작하고 1로 끝나는 56자리의 암호 코드를 추출해 낸다.

여러 줄을 가져올 필요 없이 딱 한줄만 추출해 내자. 1이 포함된 줄이 암호 코드가 있는 줄이다. 

01110110110001011101101100010110001000110100100110111011

위에 암호코드를 7자리씩 나누고, 연속되는 0과 1의 수를 세어본 다음 그림을 참고해서 해당 갯수로 만들어진 숫자가 어떤 암호 숫자를 의미하는지 알아내면 된다.

0111011   → 1312    (7)

0110001    1231    (5)

0111011    1312    (7)

0110001   → 1231    (5)

0110001    1231    (5)

0001101    3211    (0)

0010011    2122    (2)

0111011    1312    (7)

 (7 + 7 + 5 + 2) * 3 + 5 + 5 + 0 + 7 = 80

10의 배수이므로 올바른 암호코드이다.

파이썬 코드

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
 
def solve(code):
    code_table = {
        "3211" : 0,
        "2221" : 1,
        "2122" : 2,
        "1411" : 3,
        "1132" : 4,
        "1231" : 5,
        "1114" : 6,
        "1312" : 7,
        "1213" : 8,
        "3112" : 9
    }
    # 암호 코드의 첫 index 찾기
    # 암호 코드가 있는 줄을 뒤집어, 처음으로 '1'이 나오는 index를 찾은 뒤 전체 길이에서 (index - 1)을 빼주면 된다.
    # python의 index 메소드는 가장 처음 위치한 값의 index를 반환해주는 함수
    reversed_t = list(reversed(code))
    real_index = len(code) - (reversed_t.index('1'- 1)
    start_index = real_index - 55
    line = ''
    compared = '0'
    count = 0
 
    # 코드만 추출
    for ch in code[start_index:start_index + 56]:
 
        if ch == compared:
            count += 1
        else:
            line += str(count)
            compared = ch # 비교할 문자 변경
            count = 1
 
    # 마지막 문자열에 대한 count 추가
    line += str(count)
 
    number = []
    for idx in range(0324):
        number.append(code_table[line[idx:idx + 4]])
 
    hol = (number[0+ number[2+ number[4+ number[6])*3
    zz = number[1+ number[3+ number[5+ number[7]
    if (hol + zz) % 10 == 0:
        numbers = list(map(int, list(number)))
        return sum(numbers)
    else:
        return 0
 
def findLine(n):
    result = None
    for i in range(n):
        temp = list(input().strip())
        if temp.count('1'> 1:
            result = temp
    return result
 
if __name__ == "__main__":
    t = int(input())
    for i in range(t):
        # n줄에 m개
        n, m = map(int, input().strip().split())
        c = findLine(n)
        print("#{0} {1}".format(i+1, solve(c)))
 
cs

#1240 단순 2진 암호코드 #1240. 단순 2진 암호코드 #sw expert 단순 2진 암호코드 #SW Expert 1240 #python 1240 단순 2진 암호코드 #1240 단순 2진 암호코드 python #파이썬 1240 단순 2진 암호코드 #1240 단순 2진 암호코드 파이썬 #삼성 1240 암호코드 #삼성 코딩 테스트 #줄기 세포 배양 문제 #삼성 줄기세포 배양 #삼성 기출 문제 줄기세포 배양