지난달에 시작했던 이 책을 오늘에서야 드디어 한 번 스윽 읽을 수 있었다.

워낙 방대한 분량의 내용을 포함한 책이기 때문에 어느 정도 기억에 남는 내용과 책을 한 번 읽어본 전반적인 느낌에 대해서 정리하고자 한다.

 

일단 책의 전반적인 내용은 IT업계에 있는 사람뿐만 아니라, 현재 21세기의 4차 산업혁명에 살아갈 모든 사람들을 대상으로 해서 쓴 책으로 생각된다. 

이미 책의 앞부분에서 "비전공자도 IT 전문가처럼 생각하는 법"이라는 문구가 가장 인상 깊다고 전에 언급을 했었다 (출처: https://gettingtoknowit.tistory.com/80?category=997778) 그리고 실제로 이 책을 읽은 결과, 그 말이 맞는 것 같다.

다만, "생각하는 법"보다는 "이해하는 법"에 더 맞지 않을까 싶다. 이 책에서는 전체적으로 IT 분야에서 이루어지는 핫이슈들에 대해서 이야기를 하는데, "IT 개발자로서 어떠한 방법으로 생각을 하면 되는 것일까"라는 내용보다는, "이러한 내용들에 대해서 이러한 용어들을 사용하고, 이러한 내용들을 통해서 IT 업계가 돌아간다"라는 내용을 설명해준다는 것이 더 맞지 않을까고 생각된다.

즉, 조금 더 독자층을 좁혀본다면 자신의 학과에 상관하지 않고 대학생 혹은 취준생들이 가지면 좋겠다는 IT 분야의 상식에 대해서 잘 정리가 되어있다고 생각된다. 

 

예를 들어 마케팅 분야의 사람이라면, 이 책을 통해서 최근 동향에 대해서 알아갈 수 있을 것이다. 예를 들어, 페이스북은 어떻게 사용자에게 돈을 단 한 푼도 받지 않아도 그렇게 막대한 수익을 챙길 수 있는지에 대해서 답을 주는데, 이는 "타깃 광고"라는 명쾌한 답을 주면서, 이러한 광고를 두고 구글과 경쟁을 벌이고, 타깃 광고계에서 새로운 도전자의 출현이 불가능하지 않다는 이야기를 하는 등의 다양한 이야기를 펼쳐낸다. 마케팅적 측면에서는 결코 무시할 수 없는 이야기들일 것이다. 광고를 통해서 이득을 보는 입장에서, 결코 IT분야를 무시할 수 없다는 것이다.

 

이렇듯 아무리 IT분야에서 일을 하지 않는다고 해도 4차 산업혁명의 시대인 21세기에서 우리의 삶은 IT기기들과 밀접하게 연결이 되어있다. 우리가 사용하는 컴퓨터, SNS, 자동차, 스마트폰 등 우리의 일상은 이미 IT에 의해 점령이 되어있다고 해도 과언이 아니다. 과거에 영어에 대해서 배워야 한다고 강조하던 시대가 있었다. 지금은 영어는 당연히 가지고 있어야 하는 기초역량이 되었다. 그러고 나서 다음으로 넘어간 기초역량은 이제 IT라고 생각된다.

최근에 국내에서 뿐만 아니라 전 세계적으로 IT에 대해서 강조가 되고 있다. 국내에서는 AI에 대해서 계속 강조가 되고 있다. 나아가 학교에서도 이제 중학교부터 "정보"과목은 필수과목이 되었다. 이렇게 기초역량으로 IT에 대해서 알아야 하는 시대에서 우리는 이제 IT업계에 대해서 조금 더 관심을 가질 필요가 있다고 느낀다.

그리고 이를 어느 정도 해결해줄 수 있는 책이 바로 IT 좀 아는 사람(Swipe to Unlock)이다. 너무 어렵지도 않고 우리의 일상생활에서 당연시했던 내용들에 대해서 IT교양서의 느낌으로 쉽고 재미있게 풀이를 해주기 때문에 충분히 바쁜 일상에서도 읽을 수 있을 책이라고 생각된다. 물론, IT분야에서 진로를 생각하고 있는 사람이라면 더욱더 읽어볼 것을 추천하는 책이기도 하다.

 


 

도서:http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791155813355&orderClick=LAG&Kc=

 

IT 좀 아는 사람 - 교보문고

비전공자도 IT 전문가처럼 생각하는 법 | IT 시대가 왔지만, IT 아는 사람은 없다? IT 전문가처럼 생각하고 대화하는 법 “모든 기업의 리더가 IT 전문가가 돼야 한다. 그리고 모든 기업이 앱 기업이

www.kyobobook.co.kr

 


전략적으로는 어떻게 해야할지 알았는데, 계속 중복에 대한 숫자에 대해서 처리를 해야해서 오래 고민하고 검색을 해야했던 문제이다.

 

처음에는 dict를 사용해서 넣으려고 했지만, dict는 무조건 중복 key값에 대해서는 update를 해버리기 때문에 사용을 할 수가 없었다.

결국, list를 활용할 수 밖에 없는 상황이다.

 

여기서 key값을 sort(정렬)시키는 방법은 lambda를 활용하는 방법이다.

첫 번째 인자인 x[0]부터 정렬을 한 후, x[1]을 정렬해주는 방법으로 다음과 같은 공식(?)을 활용하면 된다.

array.sort(key=lambda x: (x[0], x[1]))

 

결론적으로는 다음과 같은 코드를 짜면 된다.

1
2
3
4
5
6
7
8
9
10
import sys
num = int(sys.stdin.readline())
arr = []
for _ in range(num):
    arr.append(list(map(int, sys.stdin.readline().split())))
arr.sort(key=lambda x: (x[0], x[1])) #lambda에 대해서 제대로 알고 있자...
# print(arr)
for i in arr:
    print(i[0], i[1])
 
cs

꽤 많이 활용될 수 있는 lambda이기 때문에 제대로 익혀두는 것이 좋겠다!

 

문제 출처: https://www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net


Pandas나 Numpy를 활용하면 분명 표를 바로 그릴 수 있는 방법이 있겠지만,

이 모듈들은 대부분의 코딩테스트에서는 사용할 수 없으므로 사용하지 않고 구현을 해보기로 했다.

덕분에 내가 아는 방법 내에서는 함수를 사용해서 위의 표를 일일이 경우의 수대로 if문으로 만들어서 리턴시키는 방법뿐이었다.

 

다음의 코드대로 했더니 문제를 맞힐 수 있었다.

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
def dnaTable(col, row):
    if col == 'A' and row == 'A':
        return 'A'
    if col == 'A' and row == 'G':
        return 'C'
    if col == 'A' and row == 'C':
        return 'A'
    if col == 'A' and row == 'T':
        return 'G'
 
    if col == 'G' and row == 'A':
        return 'C'
    if col == 'G' and row == 'G':
        return 'G'
    if col == 'G' and row == 'C':
        return 'T'
    if col == 'G' and row == 'T':
        return 'A'
 
    if col == 'C' and row == 'A':
        return 'A'
    if col == 'C' and row == 'G':
        return 'T'
    if col == 'C' and row == 'C':
        return 'C'
    if col == 'C' and row == 'T':
        return 'G'
 
    if col == 'T' and row == 'A':
        return 'G'
    if col == 'T' and row == 'G':
        return 'A'
    if col == 'T' and row == 'C':
        return 'G'
    if col == 'T' and row == 'T':
        return 'T'
 
num = int(input())
dnaCode = list(map(str, input()))
= 0
while(i != num):
    i += 1
    decode = []
    decode.append(dnaTable(dnaCode[num-i], dnaCode[num-i-1]))
    # print(dnaCode)
    if len(dnaCode) != 1#dnaCode가 비어있지 않으면
        dnaCode.pop()
        dnaCode.pop()
        dnaCode.append(decode[0])
    else:
        break
print(dnaCode[0])
 
cs

 

이게 맞나 싶을 정도로 함수 부분의 코드가 길어진 부분에 대해서 끊임없이 의심하면서도 결국 노가다성의 코드를 만들었다.

밑의 코드에서는 while문을 활용해서 decode에 계속 해독된 코드 부분을 집어넣고

dnaCode에서 해독해야 할 부분의 2 문자를 빼서 해독된 부분을 새로 추가시켜주는 방법이다.

이때, dnaCode에 우리가 원하는 최종 문자 1개가 남았을 경우, while문에서 break 하고,

해당 문자를 출력해주기만 하면 된다.

 

사실 언뜻 보기만 해도 꽤나 지저분한 코드라고 스스로도 생각하고 있다.

뭔가 더 깔끔한 방법의 코드가 있다면.. 혹은 조언을 받을 수 있다면, 추후에 다시 이 해당 문제를 수정해볼 생각이다...

 

 

문제 출처: https://www.acmicpc.net/problem/1672

 

1672번: DNA 해독

N개의 A, G, C, T로 구성되어 있는 DNA 염기서열이 있다. 그리고 우리는 이 염기서열을 아래의 표를 이용하여 해독을 해야 한다. 해독 방법은 염기 서열에서 제일 끝에 있는 두 개의 염기를 An-1, An이

www.acmicpc.net


해당 문제에 대해서 다음의 코드가 첫 번째 시도였고, 시간 초과라는 문제가 계속 발생했다.

1
2
3
4
5
6
7
import sys
a, b = map(str, sys.stdin.readline().split())
total = []
for i in a:
    for j in b:
        total.append(int(i)*int(j))
print(sum(total))
cs

 


그래서 계속 문제를 보던 중, 반복문을 사용하지 않고 하는 방법이 있던 것을 발견했다.

이 부분은 코드의 문제라기보다는 수학 문제에 가깝다고 봐야 할 듯하다.

 

1*3 + 1*4 + 2*3 + 2*4 + 1*3 + 1*4 = 28

==>이 식을 더욱 간단한 식으로 바꾸면...

 

(1 + 2 + 1) * (3 + 4)

라는 식이 나온다는 점을 찾아야 한다.

 

(A + B) * (C + D) = AC + AD + BC + BD라는 형태의 식을 생각하면 금방 답이 나올 것이다...

 

따라서, 다음과 같은 코드를 해야 제대로 시간 초과 없이 문제를 맞힐 수 있다.

1
2
3
4
5
6
a, b = input().split()
 
= list(map(int, a))
= list(map(int, b))
print(sum(a) * sum(b))
 
cs

 

 

문제 출처: https://www.acmicpc.net/problem/1225

 

1225번: 이상한 곱셈

첫째 줄에 A와 B가 주어진다. 주어지는 두 수는 모두 10,000자리를 넘지 않는다.

www.acmicpc.net

온라인으로 코딩하는 방법으로는 2가지를 소개하고자 한다.

전에 어플 편에서 ipad로 잘 사용하고 있었다고 했지만, 별도의 다운로드 필요 없이 온라인으로도 가능하다.

 

1. 구글 Colab

https://colab.research.google.com/notebooks/intro.ipynb

 

Google Colaboratory

 

colab.research.google.com

구글에서 제공하는 온라인 팡썬 환경으로, jupyter notebook으로 코딩할 수 있도록 지원을 한다.

또한, github과 google drive로 바로 연동이 되기 때문에 백업이 효율적인 프로그램이기도 하다.

추가적으로, TensorFlow도 사용할 수 있기 때문에 머신러닝/딥러닝에 있어서 많이 사용할 수 있는 개발환경으로 볼 수 있겠다.

 


 

2. repl.it

https://replit.com/

 

The collaborative browser based IDE

Replit is a simple yet powerful online IDE, Editor, Compiler, Interpreter, and REPL. Code, compile, run, and host in 50+ programming languages.

replit.com

repl.it 또한 파이썬을 사용할 수 있는 온라인 개발 환경이다.

대신, repl.it에서는 파이썬만 사용하는 것이 아닌 그 이외의 프로그래밍언어들을 모두 사용할 수 있는 환경을 제공한다.

 

온라인 개발 환경인만큼 당연히 ipad에서 뿐만 아니라 컴퓨터/노트북에서도 사용을 할 수 있다는 장점이 존재한다.

 

최근에 아이패드(ipad pro 5세대 12.9형)를 활용할 일이 많아지면서, 코딩도 아이패드로 하고 싶다는 생각이 들었다.

전에 네이버 부스트코스에서 사용할 수 있는 어플을 추천받았던 것은 가장 대표적인 파이썬 프로그래밍이 가능한 어플인 Pythonista 3이다.

https://apps.apple.com/kr/app/pythonista-3/id1085978097

 

‎Pythonista 3

‎Pythonista is a complete scripting environment for Python, running directly on your iPad or iPhone. It includes support for both Python 3.6 and 2.7, so you can use all the language improvements in Python 3, while still having 2.7 available for backwards

apps.apple.com

다만 아쉽게도(?) 유료라는 점이 존재한다. (무려 12000원이라는 가격)

Pythonista 3

물론, 유료인만큼 다양한 기능들이 탑재되어있는 것 같긴 한다.

 


 

 

그런데 많은 사람들이 그렇듯, 무료로 사용할 수 있으면서 야무지게 사용이 가능한 어플들도 존재한다.

그중에서 가장 먼저 추천하고, 최근에 컴퓨터 비전을 공부하면서 numpy를 사용하고 있는데, 잘 활용하고 있는 어플인 Carnets - Jupyter 라는 어플이다.

https://apps.apple.com/kr/app/carnets-jupyter/id1450994949

 

‎Carnets - Jupyter

‎Jupyter notebooks are a powerful tool used in education and research. You can write small snippets of Python code and observe the result on screen, combine with paragraphs of text, using Markdown. Carnets provides a complete, stand-alone, implementation

apps.apple.com

 

Carnets - Jupyter

놀랍게도 jupyter notebook을 사용할 수 있는 어플이다.

별도의 로그인도 필요가 없다.

또한, .ipynb 확장자명으로 파일이 저장까지 되기 때문에 매우 좋은 어플이고 강력 추천하는 어플이다.

(무엇보다 무료다!)

 


 

추가로 하나 추천하고 싶은 어플은 Sololearn이라는 어플이다.

https://www.sololearn.com/home

 

Sololearn: Learn to Code

Join Now to learn the basics or advance your existing skills

www.sololearn.com

Sololearn

이 어플은 단순히 파이썬을 위한 어플이 아니다.

C언어에서부터, HTML, CSS, C++, Java, Javascript, python 등 매우 다양한 언어들을 다 사용할 수 있으며, 

프로그래밍용이라기보다는 프로그래밍 공부용이다.

커뮤니티도 나름 커서 사용자 간에 원하는 프로그래밍 언어로 퀴즈 대결도 가능한 기능이 있다.

물론, 코딩을 간단하게나마 해서 바로 출력 결과도 확인할 수 있는 기능도 있다.

간단히 생각하면 Stackoverflow의 미니버전이랄까?

아무튼 언어의 기초를 배우고자 하는 분들께서는 이 어플을 사용해도 충분히 괜찮을 것이라고 생각된다.


부끄럽게도 정답률이 꽤 높은 문제임에도 불구하고 시간이 꽤 걸렸던 문제이다.

90이라는 max 값을 구하기는 상당히 쉬운데, 행열을 출력하는 부분 때문에 조금 난항을 겪었다.

다음 코드처럼 나는 작성했더니 결과가 잘 나왔다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys
arr = []
maxN = [0]
for i in range(9):
    arr.append(list(map(int, sys.stdin.readline().split())))
for i in range(9):
    for j in range(9):
        if max(arr[i]) == arr[i][j] and max(arr[i])>=maxN[0]:
            maxN.pop()
            maxN.append(arr[i][j])
            i_num = i
            j_num = j
        else:
            pass
print(maxN[0])
print(i_num+1, j_num+1)
cs

 

딱 봐도 자랑스럽게 내세울만한 코드는 아니다... 오히려 지저분한 코드라는 생각이 확실히 들긴 한다.

 

리스트를 꽤 많이 사용했다. 

도저히 어떻게 list에 값을 넣지 않고 처리를 해야 할지 생각이 안 나서 저렇게 maxN처럼 전역변수처럼 리스트를 처리해서 해당 값을 이중 for문 내에 있는 if문의 조건에 따라 업데이트시키는(line 8~) 방법을 사용했다.

 

그리고 딱 봐도 for문에 이중for문까지 있어서 시간 복잡도가 O(n^2)이 나와서 시간 초과가 될 것 같았다.

그래서 line 4에서와 같이 input()을 사용하지 않고 sys.stdin.readline()를 사용해서 처리했다.

그렇게 처리할 경우, 다음과 같은 실행시간이 나와서 잘 처리가 되었다.

해당 코드의 실행시간

추후에 다시 이 코드로 돌아와서 조금 더 깔끔한 코드를 손봐줄 필요성이 강하게 느껴진다...

 

 

문제 출처: https://www.acmicpc.net/problem/2566

 

2566번: 최댓값

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

www.acmicpc.net

2020 도쿄 올림픽과 패럴림픽에서 얼마 전에 AI 관련해서 사고가 났다.

자율주행 셔틀버스를 운영하던 ㄷ쿄 패럴림픽에서 일본 국적 선수와 충돌하는 사고가 발생한 것이다.

26일에 선수촌 내 T자형 교차로에서 자율주행 셔틀버스는 식당을 가던 중 우회전을 하면서 혼자서 횡단보도를 건너던 일본 유도 남자 81kg급 대표 선수 기타조노 아라미쓰(30)과 부딪혔다. 해당 선수는 시각장애인이었고, 사고 당시에 균형을 잃고 넘어지면서 머리에 타박상이 생기는 등의 전치 2주 상처를 입었다. 또한, 이 사고로 인해서 기타조노 선수는 경기 참가 또한 불투명해졌다.

해당 자율주행 셔틀버스의 이름은 이팔레트(e-Pallette)로써, 사고차량은 레벨4 수준의 자율주행 기술을 탑재하면서 최고 시속을 19km/h로 갈 수 있다. 심지어 사고 당시에 해당 셔틀버스에 도요타 직원 2명과 승객 5명이 타고 있었다고 한다.

©https://minapim.com/en/toyota-e-palette-transport-for-the-city-of-the-future/

 

이 사건은 자율주행 자동차의 현 상황에 대해서 다시 한 번 생각을 해보게 된다.

이미 미국에서 테슬라(Tesla)에서 자율주행 자동차는 사람들이 타기 시작했다. 문제는 잇따른 사고 또한 발생하고 있다는 점이다. 최근에는 자율주행차가 경찰차를 들이받는 사고까지 났다고 한다.

©https://www.tesla.com/ko_KR/blog/your-autopilot-has-arrived

 

자율주행차가 완전히 실패하고 있다고 생각되지는 않는다. 유튜브로 검색만해봐도 사람이 주행에 관여를 하지 않으면서 자동차가 원하는 목적지로 아무 사고 없이 주행을 하는 영상들도 많이 볼 수 있다.

다만, 아직 이러한 자율주행차들이 모든 사고에 대해서 대비가 되는 기술을 탑재하고 있지 못하다는 점이 문제라고 볼 수 있다. 가령, 사각지대에서 사람이 나올 때, 제대로 사람으로 인지를 못한다는 점을 들 수 있다. 

확실치는 않지만, 현재 자율주행자동차에 탑재되어있는 기술은 이미지를 통해서 사물과 도로 등을 판단하는 것으로 알고 있다. 만약 사실이라면, 제대로 사람과 사물을 인식하는 데에 있어서 변수가 있을 수 있다는 점을 무시하지 못할 것이다. 예를 들어 버스에 있는 광고판을 사물, 혹은 빈 공간으로 인식하여 충돌사고가 발생할 수도 있다고 생각된다.

 

AI Times에 따르면, 자율주행차(AV)의 운행은 "센서 정보와 일부 인공지능(AI) 알고리즘을 기반으로 한다고 한다. 따라서 차량은 데이터를 수집하고 궤적을 계획하며 주행을 실행해야 한다." 결국 두 가지의 작접은 머신러닝의 기법에 의존하여 물체를 감지한다는 뜻인데, 이러한 딥러닝 알고리즘을 통한 기술은 단순히 "기술"이라는 것을 인지해야 한다. 즉, AI는 지각력이 없다는 사실이다. 데이터를 기반으로 움직이고, 데이터를 기반으로 판단하게 된다. 그리고 이 데이터를 벗어나는 변수에 대해서 과연 어떻게 반응을 할지에 대해서 깊이 생각해볼 필요가 있다고 생각된다.

 


기사 출처1: http://news.kmib.co.kr/article/view.asp?arcid=0016214932&code=61172011&cp=nv 

 

도요타 자율주행차 ‘이팔레트’…패럴림픽 시각장애 선수와 충돌

2020 도쿄올림픽과 패럴림픽 선수촌 안에서 운행되던 자율주행 셔틀버스가 일본 국적 선수와 충돌하는 사고가 발생했다.29일 교도통신에 따르면 지난 26일 오후

news.kmib.co.kr

 

기사 출처2: http://www.aitimes.com/news/articleView.html?idxno=140612 

 

'안전문제 다음은 경로 계획'....자율주행차, 잇단 사고와 기술 장벽 여하히 넘어설까 - AI타임스

최근 도요타 최고 경영자인 도요다 아키오(明夫豊田) 사장이 지난해 패럴림픽 사고 후, 자율주행 시스템의 빠른 개발에 대한 우려를 표명했다고 독일 자동차 전문매체 카스쿠프스(CarScoops)가 지

www.aitimes.com


일단 조금 고생을 해서 slicing을 통해서 나는 문제를 해결하였다.

다음의 코드로 돌렸을 때 맞기는 했다.

1
2
3
4
5
6
7
8
9
10
num = input()
# print(num[len(num)-2:len(num)])
if int(num[len(num)-2:len(num)]) <= 10:
    if num[len(num)-2:len(num)-1== '0':
        print(int(num[0:len(num)-2])*10+ int(num[len(num)-1:len(num)]))
    else:
        print(int(num[0:len(num)-2]) + int(num[len(num)-2:len(num)]))
else:
    print(int(num[0:len(num)-1]) + int(num[len(num)-1:len(num)]))
 
cs

다만, 코드가 사실 무적이나 더럽(?)다라는 생각이 들기는 한다...

분명히 더 아름다운 코드를 짤 수는 있겠지만.. 일단 당장은 저런 식으로 풀 수 있다는 것으로 만족하고,

추후에 조금 더 공부를 하고, 조금 더 좋은 아이디어가 생기면 다시 풀어볼 생각이다.

 

 

문제 출처: https://www.acmicpc.net/problem/15873

 

15873번: 공백 없는 A+B

자연수 A, B (0 < A, B ≤ 10)가 첫 번째 줄에 주어진다. 단, 두 수의 사이에는 공백이 주어지지 않는다. 두 수의 앞에 불필요한 0이 붙는 경우는 없다.

www.acmicpc.net

 


list(map(int, input().split()))을 잘 사용해서,

조건식에 맞게 잘 출력되도록 처리만 하면 되는 간단한 문제이다.

 

1
2
3
4
5
6
= sum(list(map(int, input().split())))
= sum(list(map(int, input().split())))
if a >= b:
    print(a)
else:
    print(b)
cs

 

문제 출처: https://www.acmicpc.net/problem/5596

 

5596번: 시험 점수

대한고등학교에 재학 중인 민국이와 만세는 4과목(정보, 수학, 과학, 영어)에 대한 시험을 봤다. 민국이와 만세가 본 4과목의 점수를 입력하면, 민국이의 총점 S와 만세의 총점 T 중에서 큰 점수

www.acmicpc.net

 

+ Recent posts