해당 문제가 어려운 이유는 우리가 흔히 아는 반복문을 통해서 풀면 "시간 초과"가 나오기 때문이다.

시간 제한을 보면 "0.15초"라고 되어있다

 

해당 문제는 수학적으로 생각이 꽤 필요하다고 생각된다.

 

결국 반복문 없이 단 번에 해결이 되도록 해야 한다는 것인데....

방법을 결국 스스로 찾지 못하고 결국 구글링의 힘을 빌려버렸다.

 

그랬더니 공통적인 방법은 %연산자를 통해서 수학적으로 문제를 접근해야 한다는 점이다.

 


우선 while문으로 해서 시간초과에 걸린 방법은 다음과 같다. 

1
2
3
4
5
6
7
8
9
10
11
a,b,v = map(int,input().split())
day = 1
height = 0
while True:
    height += a
    if height >= v:
        break
    else:
        height = height - b
        day += 1
print(day)
cs

하지만 결국에는 다음과 같이 코딩을 해야 비로소 0.15초 시간 제한 안에 들어갈 수 있다...

1
2
3
4
5
6
a,b,v=map(int,input().split())
 
if (v-b)%(a-b)==0:
    print((v-b)//(a-b))
else:
    print((v-b)//(a-b)+1)
cs

 

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

 

2869번: 달팽이는 올라가고 싶다

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

www.acmicpc.net

하도 시간초과로 인해서 틀리는 문제가 발생해서 실행 시간을 측정할 수 있는 코드를 정리했다.

단위는 초로 나온다.

1
2
3
4
5
6
7
8
import time
start = time.time()  # 시작 시간 저장
 
 
# 작업 코드
 
 
print("time :", time.time() - start)  # 현재시각 - 시작시간 = 실행 시간
cs

 

생각보다 책의 진도가 나가지 않고 있다는 점이 변수이다.

우선 1부 IT 기초 지식 중 소프트웨어와 운영체제에 대해서 정리를 하고자 한다.

 

읽은 부분 중에서 가장 기억에 남는 내용은 API(응용프로그램 프로그래밍 인터페이스) 관련 내용이다. 

즉, 새로운 프로그램을 만들 때, 완전히 새롭게 모든 것을 생성 시키는 것이 아니라, "존재하는 기술을 새로 만들지 않고" 다른 프로그램의 API를 사용해서 만든다는 것이다. 

 

또 하나의 중요한 내용은 알고리즘에 대한 내용이다. 유튜브에서도, 페이스북에서도, 스포티파이에서도, 넷플릭스에서도, 어느 사이트나 플랫폼을 사용하든지 요즘은 없어서는 안되는 것이 바로 알고리즘이다. 사용자들의 행동패턴을 파악하고, 그에 따라서 사용자에게 관심과 흥미가 깊을 것 같은 주제를 우선순위로 처리해서 보여주는 형태의 알고리즘들은 거의 모든 플랫폼에서 사용된다고 볼 수 있다.

이런 알고리즘은 결국 얼마나 어떤 논리에 의해서 잘 만들어지느냐가 요즘은 관건이다. 스포티파이(spotify)의 경우 알고리즘이 굉장히 뛰어나다고 알려져있고, 이를 위해서 알고리즘 개발자들에게 투자하는 액수 또한 굉장하다는 점이 있다. 

개인적인 생각으로는 결국 이는 수학과 데이터, 확률, AI/ML/딥러닝 등 모든 것이 복합적으로 이루어진 영역이기 때문에 더욱 어렵지 않을까라는 생각이 들기도 한다. 그만큼 알고리즘은 끊임없이 발전을 하고 있다는 것이다.

spotify recommendation algorithm


1장의 내용을 이렇게 소프트웨어와 연관이 있다면, 2장은 운영체제에 대해서 이야기가 나온다.

운영체제하면 역시나 빼놓을 수 없는 역사적 사실은 블랙베리의 몰락이다. 한 때는 블랙베리가 최고였던 적이 있었으나, OS의 변화라는 흐름을 타지 못하면서 지금은 세계 3위 OS 안에도 들지 못하게 되었다

의외의 부분은 인도의 카이OS가 세계 3위 OS 안에 들어갔다는 점이다. 그러면서도 한편 역시나 인도라는 생각이 든다. 인도는 세계적으로도 수학이나 컴퓨터와 같이 이과적 성향의 과목들에서 뛰어남을 보인다. 또한, 인구수도 중국에 밀리지 않을만큼으로 많다. 그렇게 생각해보면 역시 인도를 결코 관심영역에서 놓치지 않아야한다는 생각이 들기도 한다.

세계 3위의 OS들


일단 이렇게까지 인상깊게 읽은 부분들에 대해서 정리를 해보았다. 

원래라면 skimming 하듯이 책을 읽으려고 했으나, 예상보다 더 생각을 많이 하고 자세하게 정독을 하면서 읽게 되다보니 읽는 속도가 더디게 되었다.

그래도 내용 하나하나가 나름 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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while True:
    flag = 1   # 숫자 하나만 들어갈 경우, yes로 처리하기 위해서 1로 초기화
    num = list(input())
    if num[0== '0':
        break
    else:
        for i in range(len(num)//2):
            if num[i] == num[len(num)-1-i]:
                flag = 1
            else:
                flag = 0
                break  # 1223 같은 수를 위해서 반드시 필요
        if flag == 1:
            print("yes")
        else:
            print("no")
 
cs

2번 시도해서 틀렸던 문제.

첫 번째 이유는 flag = 0으로 초기화했다는 점이다. flag = 1로 초기화를 해야 일의 자리 숫자를 입력했을 경우, yes로 처리 할 수 있다.

 

두 번째 이유는 for문의 if-else에서 break를 넣지 않았다는 점이다. 

코드의 주석에 나와있듯이 반례는 1223을 들 수 있다. 

break가 없으면, 1 <-> 3 에서 flag = 0이 되었다가 2 <-> 2에서 1로 덧씌워져 yes로 출력된다.

따라서, break를 통해 만약 no이면 바로 if-else문을 빠져나올 수 있도록 처리하면 된다.

 

 

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

 

1259번: 팰린드롬수

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

www.acmicpc.net

 


푸는데 어려움을 겪었다.

 

처음 생각했던 방법은 시간초과가 나올 것 같은 방법이었다.

배열을 만들어 a~z까지 방을 만들고, for문을 통해서 단어를 하나하나 갯수를 배열에 채우는 것이었다.

 

이 방법 말고 다음으로 택했던 방법은 dict를 사용하는 것이었다.

의도는 단어를 이루는 알파벳을 key로 하고, 갯수를 value로 해서 key와 value를 계속 update 시키는 것이었다.

그런데, 문제에 봉착한 부분이 있었는데, 그 부분은 다음의 코드를 통해 알 수 있다.

1
2
3
4
5
6
7
8
9
word = input()
word = word.lower()
dictionary = {}
for i in word:
    if i not in dictionary:
        dictionary = dict(i = 1)
    else:
        dictionary[i] = dictionary[i] + 1
print(max(dictionary))
cs

보면 알 수 있겠지만, 틀린 이유는 dictionary에 코드처럼 'i'를 넣으면, for문의 i에 해당하는 값이 들어가지 않고, 진짜로 'i' 값이 들어간다. 따라서, max를 출력하게 되면 i 혼자 출력하게 된다.

즉, 틀린 코드다.

 

뭔가 방법이 있을 것 같긴 한데... 아직 찾지 못하였다.

혹시 방법을 안다면 댓글에 조언 및 언급을 해주시면 정말로 감사하겠습니다 ....

 


아무튼 dict()로 해결을 하지 못해서 다시 처음부터 다시 시작했다 (사실 결국 인터넷 검색을 했... ㅠ)

그렇게 해서 결국 찾은 방법은 set()와 count()를 사용하는 것이다. 

set()는 중복되는 값을 없애는 것이고, count()는 set에 있는 원소들이 실제로 각각 몇 개씩 있는지 세는 것이다.

이런 함수를 잘 알고 있어야 한다는 사실을 한 번 또 느낀다.

 

따라서 다음과 같은 코드로 간단히 해결이 된다.

1
2
3
4
5
6
7
8
9
10
11
12
word = input().lower()      # word = mississipi / baaa
words = list(set(word)) # set를 통해서 중복 없애기 ==> word_list = ['m', 'i', 's', 'p'] / ['b', 'a']
cnt = []
 
for i in words:         # i = m, i, s, p / b, a
    count = word.count(i)  # count()를 통해서 set의 원소의 갯수를 센다.
    cnt.append(count)       # cnt = [4, 4, 1, 1] / [1, 3]
 
if cnt.count(max(cnt)) >= 2:
    print("?")
else:
    print(words[(cnt.index(max(cnt)))].upper())
cs

 

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

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 


간단한 논리구조로 해당 문제를 풀 수 있다.

1) int로 3개의 숫자를 입력받고,

2) 입력 받은 수의 곱의 결과값의 자료형을 list로 변환시킨다.

(여기서 해맸다.. for문을 통해 하고 싶지 않고 map을 통해 하고 싶었다... 그런데 map에서 str(A*B*C) 부분을 str을 사용해야 한다는 점을 계속 간과해서 해맸다.)

3) 이후로는 이중 for문을 통해서 list의 문자 하나씩 i를 통해 비교를 하는데,

4) i와 j를 비교한다 (j는 nums 배열의 방 번호를 뜻하도록 for문에서 0~9까지 비교하도록 한다)

5) 이후에 다시 for문을 통해서 nums 배열을 출력하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
= int(input())
= int(input())
= int(input())
res = list(map(intstr(A*B*C)))  # 이 부분을 유의하자. int -> list로 바꾼다.
nums = [0]*10
for i in res:
    for j in range(10):
        if j == int(i):
            nums[j] += 1
for j in range(10):
    print(nums[j])
 
cs

 

 

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

 

2577번: 숫자의 개수

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

www.acmicpc.net

 


여기서 조금 애매했던 부분이 역순으로 하는 부분이다.

내가 계속 사용하려고 했던 방법은 reverse()함수를 사용하려고 했던 것인데, reverse()함수가 제대로 사용이 되지 않았다.

반면에 [ : : -1 ] slicing을 사용할 시에는 제대로 작동을 하였다.


https://stackoverflow.com/questions/37637829/difference-between-reverse-and-1

 

Difference between reverse and [::-1]

Just wanted to know the difference between reverse() and [::-1] in terms of references. For example p = [1,2,3] x = p[::-1] print(x) print(p) p.reverse() print(p ==p[::-1]) print(p == x) ...

stackoverflow.com


이 글을 통해서 reverse와 [: : -1]의 차이와 활용도를 제대로 알 필요가 있을 듯 하다.

 


코드를 다음과 같이 하면 된다.

1
2
3
4
5
6
7
8
9
10
a, b = input().split()
 
= int(a[::-1])
= int(b[::-1])
 
if a > b:
    print(a)
else:
    print(b)
 
cs

 

 

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

 

2908번: 상수

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두

www.acmicpc.net

 


간단하게 문제에서 원하는 형태의 수식으로 평균을 구하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
num = int(input())
score = list(map(int, input().split()))
max_score = max(score)
sum = 0
 
for i in range(num):
    score[i] = score[i] / max_score * 100
 
for i in range(num):
    sum = sum + score[i]
average = sum/num
 
print(average)
 
cs

 

 

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

 

1546번: 평균

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보

www.acmicpc.net


새벽에 빠르고 가볍게 하나만 풀고 자자는 마인드로 시도를 했지만, 바보같이 엄청 오래 걸린 문제...

심지어 런타임 에러로 인해 고생하다가 포기하고 그냥 검색을 했더니 set() 함수를 사용하면 중복제거를 바로 시켜버리더라... ㅠㅠ

 

일단 런타임 에러가 걸린 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#runtime error(IndexError)
index = [0]*10
for i in range(10):
    num = int(input())
    index[i] = num % 42
index.sort()
# print(index, end = ' ')
 
cnt = 0
dif = 0
for i in index:
    if index[cnt] == index[cnt+1and cnt != 10:
        index.remove(i)
        cnt += 1
    elif cnt != 0 and index[cnt-1!= index[cnt]:
        cnt += 1
if len(index) == 5:  # 5인 이유는 위의 for문에 의해 모두가 같은 숫자일 때 5개가 남기 때문이다.
    print(1)
else:
    # print(index)
    print(len(index))
 
cs

일단 출력 예제는 pycharm상으로는 잘 돌아가기는 한다.

물론, 입출력 예제가 나오도록 끼워맞춘 코드인지라... 게다가 런타임 에러(IndexError)가 뜨는 걸 보니...

for문에서 index에 문제가 있다는 거다.

저걸 고쳐보려다가... 새벽 2시가 넘어서 도저히 못 건드리겠어서 포기했다...

그리고 검색을 해봤는데......


1
2
3
4
5
6
7
8
9
# 중복제거를 해주는 파이썬의 함수가 존재한다 ==> set()
 
arr = []
for i in range(10):
    n = int(input())
    arr.append(n % 42)
arr = set(arr)
print(len(arr))
 
cs

바로 나와주시는 set() 함수  ㅠㅠㅠㅠ

set( ) 함수로 중복제거를 한 방에 처리해버린다. 굳이 for문까지도 필요가 없다.

 

이전에 올렸던 10809문제에서도 그랬지만... 역시 함수를 알아야 한다.

그래도 궁금해지니 추후에 set( )함수의 실제 소스코드를 한 번 찾아볼 생각이다.

 

 

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

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

 

책을 정하는 데까지 시간이 조금 소요되었다.

그래도 나름 하나의 프로젝트로 생각하고 만든 건데 첫 번째 책은 의미가 있다고 생각되었다.

집에 나름 읽지 않고 쌓아둔 책들이 있었기 때문에 그중에 고르기로 했는데,

결론적으로 고른 책은 "IT 좀 아는 사람", 영어 제목은 Swipe to Unlock이다.

 

아직까지는 서론과 목차만 읽었을 뿐인데, 일단 가장 중요한 문구는...

"비전공자도 IT 전문가처럼 생각하는 법"

인 것 같다.

 

사실 나는 IT분야에 발을 담근지 얼마 되지 않았다.

복수전공자로서 처음 시작했기 때문에, 현재 나는 전공자도 아니고, 그렇다고 비전공자도 아니다.

그렇기 때문에 제대로 내가 무엇을 하고자하는가에 대해서 고민인 것이라고 생각된다.

그래서 지금 이 프로젝트를 시작한 것이기도 하고 말이다.

 

이 책은 "생각하는 법"을 적은 책이다.

목자를 봐도 1부-IT기초 지식이라고 해서 소프트웨어 개발, 운영체제, 앱 경제, 인터넷에 대한 이야기들을 풀어낸다.

2부에는 최근의 IT 업계 핫이슈들에 대해서 이야기를 한다. 클라우드 컴퓨팅, 빅데이터, 해킹과 보안, 하드웨어와 로봇. 아쉬운 점은 AI나 머신러닝 등에 대한 이야기가 빠져있다는 건데... 일단 읽어보면 비슷한 것이 나오지 않을까라는 기대를 가져본다.

3부의 경우 IT 비즈니스의 미래로 기술적인 부분을 보는 것이 아닌 비즈니스적인 측면에서 바라보게 된다. "사업적 판단"이라든가, 신흥국, 기술정책, 미래 전망에 대해서 이야기를 풀어나간다.

 

가장 기대되는 부분은 역시나 2부와 3부이다. 가장 핫한 이슈들과 나의 나아갈 방향에 대해서 비전공자들에게 어떤 방식으로 풀어나갈지가 기대된다.

또한, "생각하는 법"이라고 했을 때, 이 책은 결국 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

+ Recent posts