728x90

어릴 때 난 이중 리스트를 하나의 리스트로 변환할 때

새로운 리스트 하나 만들어서 이중 for문 돌면서 하나하나 append 해주었다.

시간 복잡도가 너무 커져 배보다 배꼽이 큰 상황이었던 것이다!

 

이중 리스트를 단일 리스트로 간단하게 변환하는 두 가지 방법으로는

  1. sum() 함수 사용
  2. np.hstack() 함수 사용

이 있다.

 

 

아래에 이런 이중 리스트가 있다고 가정하고, 두 가지 방법에 대해 알아보자!

# 이중 리스트
double_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

1. sum() 함수 사용하기

나만 그런건지 모르겠지만 난 sum 함수는 단순히 합해주는 함수로만 생각했다.

하지만 이중 리스트를 하나의 리스트로 변환할 때

sum(이중 리스트, []) 형식으로 사용할 수 있다.

# 이중 리스트
double_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 단일 리스트로 변환
single_list = sum(double_list, [])

print(single_list) # 결과: [1, 2, 3, 4, 5, 6, 7, 8, 9]

 

sum() 함수의 첫 번째 파라미터로는 이중 리스트를 넣고, 두 번째 파라미터로 빈 리스트([])를 넣어주면 이중 리스트를 펼친 단일 리스트로 만들어 준다.

 

 

2. np.hstack() 사용하기

Numpy를 사용해서도 이중 리스트를 하나의 리스트로 풀어낼 수 있다.

이때 사용하는 것이 np.hstack()이다.

import numpy as np

# 이중 리스트
double_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 단일 리스트로
single_list = np.hstack(double_list)

print(single_list) # 결과: [1 2 3 4 5 6 7 8 9]

 

np.hstack()함수는 넘파이에서 주어진 리스트나 배열들을 수평으로 쌓아서 1차원 배열로 만들어주는 함수이다.

728x90
728x90
# while 반복문

while i <= n:
	~~~
    ~~~
    ~~
    
# for 반복문

for i in range(start, n+1):
	~~~
    ~~~
    ~~~

가끔 코딩을 하면서 반복문 while문과 for문의 종료조건의 차이가 헷갈릴때가 많았다.

그래서 나중에 종종 확인해보기 위해 정리해보았다.

 

각각의 while문, for문이 있다고 가정해보자.

 

위 코드에서 while 문이 종료될 때 i는 n+1이다.

반면, for문이 종료될 때 i는 n이다.

 

그 이유는 range 함수에 있다.

for문에서 사용하는 range()는 [start, ... , n] 이라는 이터러블 객체를 생성하기 때문이다.

for문의 range의 끝은 이하가 아닌 미만이라고 생각하면 될 것같다.

728x90
728x90

두 수 a와 b가 있을 때 오름차순 정렬하는 방법은

단순히 if문을 이용해 a, b 순서를 바꿔주면 된다. (두 값의 교환)

예시 코드는 다음과 같다.

if a > b:
	a, b = b , a

 

파이썬에서 이 과정은 2단계로 진행된다.

1. 우변의 b, a로 압축한 튜플 (b, a)가 생성

2. 튜플 (b, a)를 다시 풀어 b, a로 만든 다름 a, b에 대입

728x90
728x90

여차저차 긴 설명 말고 핵심만 말하겠습니다.

 

숫자가 저장된 변수가 있을 때, 이 둘을 단순히 + 로 연결하여 표현하려 하면
TypeError: can only concatenate str 오류가 난다.

https://jaehhhk.tistory.com/23

 

[Python] TypeError: can only concatenate str

TypeError: can only concatenate str 나는 이 에러를 print 문을 쓸 때 발생했다. 에러가 발생했던 이유는 두개의 다른 변수를 + 로 이어서 print 해주려 했기 때문이다. 예를 들면 # 나쁜 예 total = 1 print("총합

jaehhhk.tistory.com

 

 

이럴 땐 .format 메서드를 이용하면 된다.

 

money = 1000
print("내가 가진 돈은 {} 원이야".format(money))

# 결과 : 내가 가진 돈은 1000 원이야

이런식으로 변수값이 표현될 곳에 {}를 입력하고,

""가 끝나는 지점에 .format() 메서드를 이용해 인자로 {} 위치에 들어갈 변수를 적어주면 된다.

 

물론 두 개 이상의 변수도 넣을 수 있다.

 

money = 1000
cost = 500

print("내가 가진 돈은 {} 원이고, 이 물건은 {} 원이야".format(money, cost))

# 결과 : 내가 가진 돈은 1000 원이고, 이 물건은 500 원이야

 

이렇게 원하는 위치에 {} 을 똑같이 입력 후 .format 안에 들어갈 변수를 순서대로 인자로 넣어주면 된다.

 

728x90
728x90

TypeError: can only concatenate str

 

나는 이 에러를 print 문을 쓸 때 발생했다.

 

에러가 발생했던 이유는 두개의 다른 변수를 + 로 이어서 print 해주려 했기 때문이다.

예를 들면

# 나쁜 예

total = 1
print("총합은" + total)

이런 식으로 말이다.

 

이렇게 문자열과 숫자가 저장된 변수를 같이 print하고 싶으면 format 메서드를 이용하면 된다.

# 옳은 예

total = 1
print("총합은 {} 입니다.".format(total))

물론 {} 을 여러개 두어 많은 변수값들을 print 할 수 있다.

이에 대한 예제는 아래 포스팅에서 볼 수 있다.

 

 

format 메서드에 대한 더 자세한 내용은 아래 포스팅 참고 ↓

https://jaehhhk.tistory.com/24

 

[Python] format 메서드

여차저차 긴 설명 말고 핵심만 말하겠습니다. 숫자가 저장된 변수가 있을 때, 이 둘을 단순히 + 로 연결하여 표현하려 하면 TypeError: can only concatenate str 오류가 난다. https://jaehhhk.tistory.com/23

jaehhhk.tistory.com

 

728x90
728x90

dir() 함수를 이용하면 파라미터로 들어간 객체가 어떤 메서드를 담고 있는지 확인해 볼 수 있다.

 

예를 들어

파이썬 내장 모듈인 딕셔너리ㅣ의 메서드 목록을 확인해보고 싶다면

# check methods

print(dir(dict))  # 딕셔너리가 사용하는 메서드 확인

 

이런식으로 print문을 활용해 출력해볼 수 있다.

dict의 메서드들

 

추가로 이와 같은 방식으로 우리가 자주 사용하는 list 내장 함수의 메서드를 확인해보면 다음과 같다.

list의 메서드들

리스트에서 자주 사용되는 append, pop, sort 등의 메서드들이 있음을 볼 수 있다.

 

앞으로 내장 함수에 어떤 기능(메서드)들을 이용할 수 있을지 알아볼 때 유용하게 사용할 수 있을 것 같다.

728x90
728x90

https://www.acmicpc.net/problem/15905

 

15905번: 스텔라(STELLA)가 치킨을 선물했어요

경인지역 6개대학 연합 프로그래밍 경시대회 shake! 는 아주대학교, 경희대학교, 성균관대학교, 인하대학교, 한국항공대학교, 한양대학교ERICA가 함께하는 대학교 자체 연합 대회이다. shake! 는 매

www.acmicpc.net

 

필요 개념

  • 익명함수
  • sorted 함수
  • 리스트 인덱싱

 

풀이과정

패널티는 같을 수 없다는 조건 덕분에 쉬워진 문제이다.

익명함수를 이용한 정렬에서 풀어낸 문제 수는 내림차순으로, 패널티는 오름차순을 기준으로 정렬한다.

 

그 후 6등부터 꼴등까지의 범위에서 5등과 풀어낸 문제 수가 같은 참가자 수만 카운팅해주면 된다.

이때 for 문에서 인덱싱은 단순히 i+4 로 접근할 경우 index out of range 오류가 나타나므로 '-'를 이용해 인덱싱한다. 

 

# 5등과 패널티 차이로 수상 못한 학생에게만(6등부터 카운팅 시작)

N = int(input())

student = []
for i in range(N):
    student.append(list(map(int, input().split())))

student = sorted(student, key = lambda x: [-x[0], x[1]])

cnt = 0

if N == 5:
    cnt = 0
else:
    for i in range(1, N-4): # out of range 오류 피하기 위해 '-' 이용하여 인덱싱
        if student[-i][0] == student[4][0]:	# 5등과 등수가 같은 경우에만 카운팅
            cnt += 1

print(cnt)
728x90
728x90

 

https://www.acmicpc.net/problem/5533

 

5533번: 유니크

첫째 줄에 참가자의 수 N이 주어진다. (2 ≤ N ≤ 200) 둘째 줄부터 N개 줄에는 각 플레이어가 1번째, 2번째, 3번째 게임에서 쓴 수가 공백으로 구분되어 주어진다.

www.acmicpc.net

 

필요 개념

  • 2차원 리스트
  • 리스트의 count 메서드

 

풀이 과정

우선 문제에서 요구한 대로 입력을 받아 2차원리스트로 입력 받는다.

 

하지만 입력 받은 그대로 점수 계산을 하기엔 불편했다.(내 수준에선...ㅎ)

그래서 2차원 리스트의 한 요소의 기준을 1명의 참가자로 둘 수 있도록 기존의 x*y 구조의 배열을 y*x 구조로 변경한다. 

 

그 후 2차원 리스트 안 리스트의 요소 하나씩 보며 다른 참가자와 중복된 값이 있으면 결과 리스트에 0을 넣고,

아니면 그 점수 그대로를 넣는다.

 

이때 중복을 구하는 데 많은 애를 먹었는데,

그 이유는 흔히 사용하는 in 을 if문에 적용하면 자기 자신도 포함되어 전부 중복이 된다고 결과값이 출력됐기 때문이다.

 

그래서 리스트의 count 메서드를 이용해 count 한 값이 1을 넘으면(자기 자신 + a) 그때 비로소 0점을 주도록 했다.

 

그 다음은 결과 리스트 안의 리스트 요소들의 합 sum 메서드를 활용해 차례로 출력하면 된다.

 

players = int(input())

games = []
for i in range(players):
    games.append(list(map(int, input().split())))

# 2차원 배열 x,y 변경 -> 게임 참가자를 기준으로 구조 변경
games_modified = [[] for _ in range(3)]
for i in range(3):
    for j in range(players):
        games_modified[i].append(games[j][i])

# 중복 여부를 점수로 반영한 결과값 저장
result = [[] for _ in range(players)]
for i in range(3):
    for j in range(players):
        if list(games_modified[i]).count(games_modified[i][j]) > 1 :    # 자신과 같은 값이 있다는 이야기는 1게임에 같은 값이 2개 이상이라는 뜻
            result[j].append(0) # 자신을 제외하고 같은 값이 있을 경우 0점
        elif list(games_modified[i]).count(games_modified[i][j]) == 1: 
            result[j].append(games_modified[i][j])

# 결과 구하기
for i in range(players):
    print(sum(result[i]))

 

이 문제를 풀며 생겼던 사소한 오류..

https://jaehhhk.tistory.com/18

 

[Python] TypeError: 'builtin_function_or_method' object is not subscriptable

가끔 파이썬으로 코딩하다보면 분명 오류 없이 잘 한것 같은데 TypeError: 'builtin_function_or_method' object is not subscriptable 라는 오류가 떠서 난감한 경우가 많다. 객체와 관련한 자세한 개념은 넘어가고

jaehhhk.tistory.com

 

 

깃허브 링크

다른 문제들의 풀이와 코드들은 깃허브나 백준 카테고리의 글들에서 확인할 수 있습니다.

https://github.com/jaehhhk/algorithm

 

GitHub - jaehhhk/algorithm: 알고리즘 공부

알고리즘 공부. Contribute to jaehhhk/algorithm development by creating an account on GitHub.

github.com

 

728x90

+ Recent posts