728x90

가끔 파이썬으로 코딩하다보면 분명 오류 없이 잘 한것 같은데 TypeError: 'builtin_function_or_method' object is not subscriptable

라는 오류가 떠서 난감한 경우가 많다.

 

객체와 관련한 자세한 개념은 넘어가고 결론부터 말하자면

경험상 소괄호 ()를 써야 하는데 대괄호 []를 써서 생기는 오류인 경우가 많았다.

 

예를 들어

print(~~~) 로 써야 하는데 print[~~~] 로 썼거나,

a.append(0) 으로 써야 하는데 a.append[0] 으로 쓴 경우 말이다.

 

물론 내 경험상 높은 확률로 이같은 원인이 발생했다고 느낀 것이지,

모든 상황에 부합한다는 뜻은 아닌점 유념했으면 좋겠다.

728x90
728x90

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

 

2566번: 최댓값

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

www.acmicpc.net

 

 

필요 개념

  • 2차원 리스트
  • 리스트의 max 메서드
  • 리스트의 append 메서드
  • 리스트의 index 메서드

 

풀이 과정

for문을 돌며 입력 값을 바로 2차원 리스트로 넣어준다.

2차원 리스트 내 요소들은 예제에 나온 1개의 행이다.

 

입력을 2차원 리스트로 만들 었을 때

각 행별 최댓값을 뽑아낸 결과 중 제일 큰 값이 전체에서 가장 큰 값이다.

각 행별 최댓값을 저장할 리스트를 새로 정의해 준 후,

for문을 생성하여 라인별 최댓값 즉, 행 마다의 최댓값을 찾아 리스트에 append 해준다.

 

그 후 리스트의 max 메서드를 이용해 전체에서 제일 큰 값을 찾는다.

 

제일 큰 값을 찾는 데 성공했으니 이제 그 값의 위치값을 알아내야 한다.

우선 x 값은 가장 큰 값이 위치했던 행 이므로 아까 행마다 최댓값 저장해 둔 리스트를 이용해 구할 수 있다.

 

문제는 y 값인데,  이를 알기 위해선 리스트의 index 메서드를 활용해야 한다.

이를 이용해주기 위해 임시 list를 만들어주었다. (temp)

(이에 대한 맥락에 대한 설명은 밑 코드에 주석으로 달아놨다. 이해가 가지 않으면 참고)

 

# 빈 리스트 생성
num_list = []

# 수 입력 받고 빈 리스트에 요소들 넣어주기
for i in range(9):
    num_list.append(list(map(int, input().split())))
    
# for문으로 라인별로 돌면서 최댓값 인자 + 인덱스 찾기
max_list = []
index_list = []
for i in range(9):
    max_list.append(max(num_list[i]))   # 각 라인별 최댓값
    max_value = max(max_list)   # 최종 최댓값

for i in range(9):
    if max_value in num_list[i]:
        temp = list(num_list[i])    # num_list의 한 요소는 리스트가 아님. index 메서드 이용을 위해 임시로 만들어줌
        max_x = i + 1   # 인덱스는 0부터 시작하므로 출력 형식 맞춰주기 위해 1 더함
        max_y = temp.index(max_value) + 1

print(max_value)
print(max_x, max_y, end= " ")

 

 

깃허브 링크

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

https://github.com/jaehhhk/algorithm

 

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

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

github.com

 

728x90
728x90

알고리즘 문제를 풀다보면

빈 2차원 리스트를 생성해놓고 그 위에다가 값을 기록하며 문제를 풀어야 하는 경우가 존재한다. 

 

파이썬으로 2차원 빈 리스트를 만드는 방법은 4가지가 있다.

 

가정

만들어 줄 리스트 이름을 array라고 하고,

2차원 리스트 안에 넣어 빈칸의 개수를 5개, 5*5 행렬을 만들 경우를 가정한다.

 

 

첫 번째 방법

리스트 안에 for문을 구현한다.

2차원 리스트 안의 요소를 곱하기 형식으로 넣어주는 방법이다.

array = [[' '] * 5 for _ in range(5)]

 

두 번째 방법

첫 번째 방법에서 곱하기를 이용하지 않고 빈칸을 직접 넣어준 후 for문을 돌린다.

arr = [[' ', ' ', ' ', ' ', ' '] for _ in range(5)]

 

세 번째 방법

빈 리스트를 먼저 정의해주고,

for문을 돌며 append 메서드를 이용해주는 방법이다.

이때 빈 요소는 곱하기 형식으로 넣어준다.

 

arr = []
for i in range(5):
    arr.append([' '] * 5)

 

네 번째 방법

세 번째 방법에서 곱하기가 아닌 빈 요소를 직접 넣어준다.

 

arr = []
for i in range(5):
    arr.append([' ', ' ', ' ', ' ', ' '])
728x90
728x90

for문을 돌며 i 값에 나누어 떨어지면 약수, 나누어 떨어지지 않으면 약수가 아니다.

이 사실을 이용해 나누어 for문을 돌 때마다 나누어 떨어지는 수만 결과를 표현할 리스트에 append 해주면 된다.

 

만약 16이라는 숫자의 약수를 구하고자 한다면,

# 16의 약수 구하기
result = []	# 약수들 저장할 리스트 정의
for i in range(1,17):   #인덱스 1~16으로 돌게 하기 위해 range 함수 파라미터 조정
    if 16 % i == 0:
        result.append(i)
        
print(result)

 

728x90
728x90

 

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

 

1100번: 하얀 칸

체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램

www.acmicpc.net

 

풀이 과정

0번째 줄, 2번 째 줄 ... (짝수 번째 줄) 은 하얀색 칸으로 시작,

1번째 줄, 3번 째 줄 ... (홀수 번째 줄) 은 검은색 칸으로 시작하여 칸이 번갈아 나온다.

 

시작점이 다른 것을 이용하여 2차원 리스트 순회를 하면 된다.

 

아래 답 부분에서 [i][j] 형식이 아닌 [i][0][j]형식으로 인덱싱을 하는 이유는 중간중간 print 해보면 알겠지만 F.F.. 같은 하나하나의 줄들이 F와 .이 구분되어 리스트에 넣어지지 않고 하나의 줄 자체가 문자열 하나로 넣어져 있다.

따라서 2차원 리스트엔 원소 하나씩 밖에 들어가 있지 않은 것으로 표현된다.

 

따라서 [0]을 넣어주고 문자열 인덱싱을 해주어야 한다.

 

# 말 위치 입력받기      
horses = []
for i in range(8):
  horses.append(list(input().split()))

# 짝수번째 줄은 흰색이 먼저, 홀수번째 줄은 검은색이 먼저 배치
cnt = 0
for i in range(8):
    if i % 2 == 0:  # 짝수줄인 경우
        for j in range(8):
            if j % 2 == 0:
                if horses[i][0][j] == "F":  # 2차원 리스트의 요소 하나하나는 ''로 감싸진 하나의 문자열 -> 문자열 인덱싱을 해야하므로[0]이 중간에 낀 것
                    cnt += 1
    else:   # 홀수줄인 경우
        for j in range(8):
            if j % 2 == 1:
                if horses[i][0][j] == "F":
                    cnt += 1

print(cnt)

 

코드는 깃허브에서 확인 가능합니다.

깃허브 링크

https://github.com/jaehhhk/algorithm

 

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

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

github.com

 

728x90
728x90

파이썬 3와 2 버전이 동시에 설치되어 있을 경우

파이썬 프로그램을 돌릴때마다 python3 main.py 등으로 입력해야 하는 불편함이 있거나,

분명히 설치한 모듈임에도 불구하고 import error가 뜨는 경우가 있다.

 

이때는 다음과 같은 명령어를 사용하면 된다.

 

alias python=python3

 

 

 

728x90
728x90

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

 

3181번: 줄임말 만들기

꿍은 만사가 귀찮아서 말을 하기도 귀찮아 한다. 그래서 하려는 말을 대신해줄 줄임말을 만들려고 하는데 나름 규칙을 만들었다. 하려는 말은 최소 하나 이상의 단어를 포함하는데 각 단어들은

www.acmicpc.net

 

풀이 과정

우선 금지된 단어(ban_list)에 줄임말로 들어가면 안되는 단어들을 리스트에 넣어준다.

 

그 후 for문과 if문, in/not in 개념을 이용해

각 단어가 맨 앞자리 문자 (첫번째 단어)가 아니거나, 금지된 단어 목록에 있으면 continue를 해주어 무시하고 반복문을 그대로 순회하도록 구현해보았다.

 

str_list = list(input().split())
ban_list = ['i', 'pa', 'te', 'ni', 'niti', 'a', 'ali', 'nego', 'no', 'ili']
result = []

for i in range(len(str_list)):
  if (i!=0)&(str_list[i] in ban_list):	# 맨 앞자리가 아니거나 금지 단어 목록에 있으면 무시
    continue
  else: 
    s = str(str_list[i])	# 줄임말 조건 충족시키는 단어는 따로 뺌
    s_cap = s[0].upper()	# 대문자 만들어주기
    result.append(s_cap)	# 결과 리스트에 하나씩 저장
    
# 결과 출력
for k in range(len(result)):
  print(result[k], end="")
728x90
728x90

 

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

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

리스트 sort 개념만 잘 알면 풀 수 있는 문제였다.

 

N = int(input())
a = []
a_sorted = []

for i in range(N):
  num = int(input())
  a.append(num)
  num = 0

a.sort()

for i in range(len(a)):
  print(a[i])
728x90

+ Recent posts