자료구조 알고리즘 : 코딩테스트

[알고리즘] 패캠 알고리즘/기술면접 패키지 : 잔재미코딩

닉네임이 멋이 중헌디 2021. 5. 21. 11:25

목표: 기본 자료구조/ 알고리즘 익히기 

- 알고리즘 풀이를 위해 기본적으로 알고 있어야 하는 자료구조와 알고리즘 정리 

- 짧은 시간 안에 효과적으로 익힐 수 있도록 구성 

작은 원리를 적용하는 방법을 익히고 연습을 통해 익숙해져야 한다. 

구구단 정도는 프로그래밍을 할 수 있어야 한다. 

 

https://www.fun-coding.org/python-question3-answer.html

 

파이썬 기초 (문제풀이): 파이썬 반복문과 리스트 - 잔재미코딩

기존 유투브 영상은 설명없이 키보드로 코드를 작성하는 모습만 보여드려서 보기가 불편하여, 정답 코드로 대체합니다. 본 컨텐츠는 저작권법의 보호를 받으며, 무단 복제, 가공, 외부 오픈이

www.fun-coding.org

#31. 반복문 for을 이용해서 10까지 다 더하기

sum=0;

for num in range(0,11):

sum = sum+num;

print(sum);

 

=> for, in으로 0~10까지 num에 넣는다 

sum = sum+1

sum = sum+2 

sum = sum + 3

sum = sum + 4

...

주의: sum =0이 for문 안에 있으면 for로 반복할 때마다 다시 sum 값이 0으로 재설정된다

그러므로 for문 밖에 설정

 

#32. 2~9 사이의 숫자를 입력 받은 후 해당 숫자에 대한 구구단 출력

a = int(input())

for num in range(2,10):

print (a, "*", num, "=", a*num)

 

#33. ,로 구분된 여러 이름을 입력받아서 이름을 한줄마다 출력한다

a = input() => string으로 받는다

for string in a.split(","):   => ,에 따라 나눈 것들이 리스트는 아니지만 비슷한 형태를 갖는다

print(string)

 

+ [이름]의 형태인 경우

print(string.strip("[]"))

 

#36. 1부터 100까지 더한 값을 while을 통해 구하는 방법 

sum = 0;

num=0;

while num < 101:

sum += num;

num += 1;  => 이줄이 위로 가면 num =100일 때 +1이 되어서 마지막에 101을 더하게 된다

print(sum);

 

#37. 사용자로부터 4자리의 숫자로 구성된 데이터를 입력받아서 

  - 비밀번호와 같으면 '비밀번호가 맞습니다'를 출력하고 종료 

  - 비밀번호와 다르면 '비밀번호가 틀렸습니다'를 출력하고 다시 사용자로부터 데이터를 입력받는다

 - 비밀번호 : 4312

 

password = "4312"

data = str()

 

while data != password:

   data = input()

   if data == password:

       print("비밀번호가 맞습니다")

       break;

   else:

       print("비밀번호가 틀렸습니다.")

 

 

#38. 다음 리스트 변수에서 음수 데이터를 삭제하고 양수만 가진 리스트 변수로 만들고 해당 변수를 출력한다

 

num_list = [0,-11,31,22,-11,33,-44,-55]

list = []

for n in num_list:

if n > 0:

list.append(n);

print(list);

 

기존 리스트에서 기준에 안 맞는 데이터를 빼는 방식이 아니라 새로운 리스트에 기준에 맞는 데이터를 붙이는 방식을 사용한다

 

 #39. 다음 리스트에 있는 데이터의 길이를 한 라인에 하나씩 출력하세요 

list_data = ["fun-coding", "Dave", "Linux", "Python", "javascript", "front-end", "back-end","dataengineering"]

for l in list_data:

print(l,",", len(l));

 

=> string의 길이는 len()으로 구한다 

 

#40. 데이터 구조와 반복문(리스트) 

리스트에 있는 숫자들을 역 방향으로 출력하세요 

단, 리스트에 있는 숫자들은 한 라인에 하나씩 출력하세요 

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

.reverse() => 리스트 자체를 아예 역으로 만든다 

data[::-1] => 역으로 슬라이싱)

 

cf. Extended Slices

arr[::], arr[1:2:3], arr[::-1] 등으로 배열의 index에 접근하는 방법.


출처: https://blog.wonkyunglee.io/3 [Wonkyung's blog]

설명

arr[A:B:C]의 의미는, index A 부터 index B 까지 C의 간격으로 배열을 만들어라는 말입니다.
만약 A가 None 이라면, 처음부터 라는 뜻이고
B가 None 이라면, 할 수 있는 데까지 

(C가 양수라면 마지막 index까지, C가 음수라면 첫 index까지가 되겠습니다.)라는 뜻입니다.
마지막으로 C가 None 이라면 한 칸 간격으로 라는 뜻입니다.

예시

>> arr = range(10)

>> arr [0,1,2,3,4,5,6,7,8,9]

>> arr[::2] # 처음부터 끝까지 두 칸 간격으로 [0,2,4,6,8]

>> arr[1::2] # index 1 부터 끝까지 두 칸 간격으로 [1,3,5,7,9]

>> arr[::-1] # 처음부터 끝까지 -1칸 간격으로 ( == 역순으로) [9,8,7,6,5,4,3,2,1,0]

>> arr[::-2] # 처음부터 끝까지 -2칸 간격으로 ( == 역순, 두 칸 간격으로) [9,7,5,3,1]

>> arr[3::-1] # index 3 부터 끝까지 -1칸 간격으로 ( == 역순으로) [3,2,1,0]

>> arr[1:6:2] # index 1 부터 index 6 까지 두 칸 간격으로 [1,3,5]

#41. 데이터 구조(리스트), 반복문, 문자열 다루기 

파일 이름(확장자 포함) 저장하고 있는 리스트가 있을 때 확장자를 제거하고 파일 이름만 출력 

filelist = ['exercise01.docx','exercise02.docx','exercise03.docx','exercise04.docx','exercise05.docx']

for f in filelist:

print(f.split(".")[0])

 

#42. 파일 이름이 다음과 같은 리스트에 저장되어 있을 때 확장자가 .txt인 파일에 대한 리스트를 출력하라 

filelist = ['exercise01.docx','exercise02.csv','exercise03.txt','exercise04.hwp']

cf. 파이썬은 == 

filelist = ['exercise01.docx','exercise02.csv','exercise03.txt','exercise04.hwp']

for f in filelist:

a = f.split(".")[1]

if a == 'txt':

print(f)

 

#45. 

다음 통화별 환율을 통화 단위와 원화 환율을 가진 딕셔너리로 만들고 사용자로부터 달러, 엔, 또는 위안 금액을 입력받은 후 이를 원으로 바꿔서 계산하세요 

- 사용자는 100 달러, 100 위안과 같이 금액과 통화명 사이에 공백을 넣어 입력하기로 합니다

통화별 환율은 다음과 같다 

통화단위 원화환율 

달러       1112

위안       171

 

a = input().split()

d = {

'달러': 1112,

'위안': 171,

'엔': 1010

}

if a[1] == "달러":

print(int(a[0])*d['달러'], "원")

elif a[1] == "위안":

print(int(a[0])*d['위안'], "원")

else:

print(int(a[0])*d['엔'], "원")

 

#49. 출처: https://www.codingfactory.net/10058

 

Python / 자료형 / 튜플(tuple)

튜플(tuple) 여러 개의 자료를 하나의 변수로 관리할 때 사용합니다. 리스트(list)와 거의 같지만, 데이터를 변경할 수 없다는 차이가 있습니다. 따라서 .append() 등 값을 변경하는 메소드는 사용할

www.codingfactory.net

튜플(tuple)

여러 개의 자료를 하나의 변수로 관리할 때 사용합니다. 

리스트(list)와 거의 같지만, 데이터를 변경할 수 없다는 차이가 있습니다.

따라서 .append() 등 값을 변경하는 메소드는 사용할 수 없고,

조회를 하는 .count(), .index() 메소드만 사용할 수 있습니다.

튜플 만들기

튜플은 괄호로 만듭니다.

>>> jb = (1,2,3,4,5)

>>> type(jb) <class 'tuple'>

 

빈 튜플은

jb = ()

또는

jb = tuple()

으로 만듭니다.

튜플 출력하기

print() 함수로 출력해보겠습니다.

>>> jb = (1, 2, 3, 4, 5)

>>> print(jb)

(1, 2, 3, 4, 5)

 

인덱스를 가지므로 특정 위치의 값을 출력할 수 있습니다.

>>> print(jb[2])

3

 

특정 범위 출력도 할 수 있습니다.

>>> print(jb[2:5])

(3, 4, 5)

 

튜플 길이 구하기

>>> jb = (1,2,3,4,5)

>>> print(len(jb))

5

값이 있는지 확인하기

>>> jb = (1,2,3,4,5)

>>> 1 in jb

True

>>> 9 in jb

False

값이 없는지 확인하기

>>> jb = (1,2,3,4,5)

>>> 1 not in jb

False

>>> 9 not in jb

True

+로 연결, *로 반복

+로 튜플을 연결합니다.

>>> jb1 = (1,2,3)

>>> jb2 = (4,5,6)

>>> jb3 = jb1 + jb2

>>> jb3

(1, 2, 3, 4, 5, 6)

 

*로 튜플을 반복합니다.

>>> jb1 = (1,2,3)

>>> jb2 = jb1 * 3

>>> jb2

(1, 2, 3, 1, 2, 3, 1, 2, 3)

.count()

특정 값의 개수를 반환합니다.

>>> jb = (1,2,3,2,1)

>>> jb.count(2)

2

.index()

특정 값의 인덱스를 반환합니다.

>>> jb = (1,2,3,4,5)

>>> jb.index(3)

2

그 값이 여러 개 있다면 첫번째 값의 인덱스를 반환합니다.

>>> jb = (1,2,3,2,1)

>>> jb.index(2)

1

 

이외에도 튜플 값은 맞교환 가능하다

var1, var2 = 1,2

var1, var2 = var2, var1

print(var1, var2)

 

리스트와 튜플은 간단한 명령으로 상호 변환이 된다!

[1, 2, 3] 형식의 리스트를 (1, 2, 3) 형식의 튜플로 변형하려면 간단히 tuple(list) 명령이면 된다.

반대로, 튜플을 리스트로 바꾸는 명령은 list(tuple)

tupledata = ('1','2','3')

tuplelist = list(tupledata)

tuplelist.append('4')

print(tuple(tuplelist))

 

 

a = () 또는 tuple()

b = [] 또는 list()

c = {} 또는 dict()

print(type(a))

print(type(b))

print(type(c))

 

#55. 

 

딕셔너리와 for 반복문을 사용하여 모든 키-값 쌍을 출력하기

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}

>>> for i in x: ...    

print(i, end=' ')

a b c d

 

for i in x:처럼 for 반복문에 딕셔너리를 지정한 뒤에 print로 변수 i를 출력해보면

값은 출력되지 않고 키만 출력됩니다.

 

그럼 키와 값을 모두 출력하려면 어떻게 해야 할까요?

이때는 for in 뒤에 딕셔너리를 지정하고 items를 사용해야 합니다.

for , in 딕셔너리.items():      

반복할 코드

 

다음은 for로 리스트 a의 모든 키와 값을 출력합니다.

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}

>>> for key, value in x.items(): ...    

print(key, value) ...

a 10 b 20 c 30 d 40

 

for key, value in x.items():는 딕셔너리 x에서 키-값 쌍을 꺼내서

키는 key에 값은 value에 저장하고, 꺼낼 때마다 코드를 반복합니다.

따라서 print key value를 출력하면 키-값 쌍을 모두 출력할 수 있습니다.

물론 in 다음에 딕셔너리를 직접 지정하고 items를 사용해도 상관 없습니다.

for key, value in {'a': 10, 'b': 20, 'c': 30, 'd': 40}.items():    

print(key, value)

25.2.1  딕셔너리의 키만 출력하기

지금까지 items로 키와 값을 함께 가져왔는데,

키만 가져오거나 값만 가져오면서 반복할 수도 있습니다.

 

  • items: 키-값 쌍을 모두 가져옴
  • keys: 키를 모두 가져옴
  • values: 값을 모두 가져옴

 

먼저 for 반복문에서 keys로 키를 가져오면서 반복해보겠습니다.

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}

>>> for key in x.keys(): ...    

print(key, end=' ') ...

a b c d

딕셔너리의 키만 출력되었죠?

25.2.2  딕셔너리의 값만 출력하기

for 반복문에서 values를 사용하면 값만 가져오면서 반복할 수 있습니다.

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}

>>> for value in x.values(): ...    

print(value, end=' ') ...

10 20 30 40

이처럼 for 반복문에서 keys를 사용하면 키만 꺼내오면서 반복하고, 

values를 사용하면 값만 꺼내오면서 반복합니다.

 

다음 영어 사전 데이터를 딕셔너리 변수로 만들고, 딕셔너리 변수의 key값인 영어단어, value값인 의미 만을 가진 리스트 변수를 각각 만들고, 두 리스트 변수를 출력하세요 

d = {

'environment': "환경",

'company': "회사",

'government': "정부, 정치",

'face': "얼굴"

}

 

key = [] 

value = []

 

for k in d.keys():

print(k)



for v in d.values():

print(v)

 

이렇게 쓰면 오류가 뜬다. 이유 

=> 이렇게 밖에 정의를 해놓으면 반복문에서 append를 해도 반복문을 나오는 순간 결과가 달라질 수 없음(전역 속성으로 이미 정의를 박아놓았기 때문에)

 

d = {

'environment': "환경",

'company': "회사",

'government': "정부, 정치",

'face': "얼굴"

}

 

dictdata_keys = [data for data in d.keys()]

  => 이렇게 [] 사이에 data for..in반복문으로 잡은 key들을 data로 잡아 넣을 수 있다

dictdata_values = [data for data in d.values()]

print(dictdata_keys)

print(dictdata_values)

 

#57. 딕셔너리 안의 하나의 key값에 여러가지의 value들을 넣는 방법


출처: https://leti-lee.tistory.com/15 [hongni]

 

[Python / 파이썬] 딕셔너리 value 값 추가 / 하나의 키에 여러개의 값 넣기

딕셔너리 안의 하나의 key값에 여러가지의 value들을 넣고 싶을 때가 있습니다. 하나의 키에 여러개의 값을 어떻게 넣을 수 있을까요? 아주 간단한 방법으로 여러 값을 넣을 수 있습니다. a = {'a': 1,

leti-lee.tistory.com

 

하나의 키에 여러개의 값을 어떻게 넣을 수 있을까요?

아주 간단한 방법으로 여러 값을 넣을 수 있습니다.

 

a = {'a': 1, 'b': 2}
print(a)                # {'a': 1, 'b': 2}

# 아래의 코드처럼 하시면 됩니다!

a['a'] = [1, 2, 3]
print(a.get('a'))       # {'a': [1, 2, 3], 'b': 2}
print(a)                # [1, 2, 3]


=> value로 찾는 거보다 키로 찾는 게 더 좋기 때문에 이 방법 추천

 

dic = {

"environment": ["환경", "X"],

"company": ["회사","O"],

"government": ["정부, 정치", "X"],

"face": ["얼굴","X"]

}

 

for data in dic.keys():

if dic[data][1] == "X":

print(data)

 

https://code.tutsplus.com/ko/tutorials/how-to-merge-two-python-dictionaries--cms-26230

 

두 파이썬 딕셔너리를 병합하는 법

이전 튜토리얼에서는 파이썬 딕셔너리에 대해 배웠고, 딕셔너리가 키/값 쌍을 가진 순서가 없는 집합이라는 것을 확인했습니다. 여기서 키는 예를 들어 리스트에서의 위치와 반대되는 것으로서

code.tutsplus.com

update() 메서드

다음과 같은 두 개의 딕셔너리가 있다고 해봅시다.

1
2
dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}

어떻게 이 두 딕셔너리를 하나의 딕셔너리에 병합할 수 있을까요? 이와 관련해서 사용할 수 있는 함수는 update([other])입니다. 파이썬 문서에는 다음과 같이 적혀 있습니다.

dict2.update(dict1)

 

결과를 확인하기 위해 다음과 같은 문장을 입력했다고 해봅시다.

print dict2.update(dict1)

=> 이 경우 None이 출력됩니다! 그 이유는 update() 함수가 새 딕셔너리를 반환하지 않기 때문입니다.

 

딕셔너리를 연결한 결과를 얻으려면 다음을 입력합니다.

print dict2

이 경우 다음과 같은 결과가 출력됩니다.

{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}

 

[방법1]

dict_all = {

'environment': '환경',

'government': '정부, 정치'

}

 

dict2 = {

'company':'회사', 'face': '얼굴'

}

 

dict3 = {'apple':'사과'}

 

dict_all.update(dict2)

dict_all.update(dict3)

print(dict_all)

 

[방법2]

for data in dict2.keys(): 

      dict_all[data] = dict2[data]

for data in dict3.keys(): 

      dict_all[data] = dict3[data]

print(dict_all)

 

#60. 

print(1, 2, 3, sep='\n')

1 # ← 다음 줄로 이동

2 # 2는 새 줄에서 시작, \n은 다음 줄로 이동

3 # ← 새 줄에서 시작

 

#61. 

리스트의 중복 숫자를 제거한 리스트 만드는 방법 

:리스트를 set()를 통해 set으로 만드낟

 

number_list = [5, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10]

number_set = set(number_list) 

print(number_set)