SW Expert Academy 1240. 단순 2진 암호코드
문제에서는 0과 1로 구성된 영상물에 삽입된 암호 코드를 추출하여
암호 코드가 정상적인 암호코드인지 판별하는 코드를 구현해야 한다.
삼성 SW Expert Academy에서 푼 문제 리스트 보기
문제 조건
- “(홀수 자리의 합 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(0, 32, 4): 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 암호코드 #삼성 코딩 테스트 #줄기 세포 배양 문제 #삼성 줄기세포 배양 #삼성 기출 문제 줄기세포 배양
'온라인 코딩 테스트 문제 풀이 > 삼성 SW Expert 문제 풀이' 카테고리의 다른 글
Python으로 푸는 SW Expert Academy 1868. 파핑파핑 지뢰찾기 (0) | 2019.02.23 |
---|---|
Python으로 푸는 SW Expert Academy 2819. 격자판의 숫자 이어 붙이기 (0) | 2019.02.22 |
Python으로 푸는 SW Expert Academy 1961. 숫자 배열 회전 (0) | 2019.02.18 |
Python으로 푸는 SW Expert Academy 4613. 러시아 국기 같은 깃발 (0) | 2019.02.17 |