Python Coding Test

[파이썬 코테] Array (알파벳 개수, 방 번호, 두수의 합)

후비a 2024. 12. 8. 17:22

'정올'과 '백준' 을 이용해 코딩 테스트를 준비하려 합니다.

 

'정올'은 일단 단계별 문제 LC_Python → Beginner 순으로 진행할 것입니다.

초반에 쉬운 문제가 많다 보니 쉬운 문제는 기록하지 않고, 헷갈린 문제이거나, 내가 푼 방식보다 괜찮은 방식이 있다면, 기록 할 예정!

 

'백준'은 깃허브 algorithm-practice에 풀어야 할 문제를 잘 정리해 주셔서, 이 순서대로 순차적으로 풀어볼 생각입니다. ㅎㅎ

한문제 한문제씩 기록하면서, 좀 더 간편한 방식이 있다면 # best 풀이 #  로 정리할게요!!

 

1주차 : Array - 1~4번

 

10808번: 알파벳 개수 (acmicpc.net)

# 내 풀이

alphabet = input()
a = {}
for i in range(len(alphabet)) :
    if int(ord(alphabet[i])-97) in a :
        a[int(ord(alphabet[i])-97)] += 1
    else :
        a[int(ord(alphabet[i])-97)] = 1
for num in range(26) :
    if num in a :
        print(a[num], end = ' ')
    else :
        print("0", end = ' ')
        
# Best 풀이

n = input()
lst = [0]*26

for i in n:
    lst[ord(i)-ord('a')] += 1
for i in lst:
    print(i, end=' ')
# print(*lst) 로도 가능하다! 

----------------------------------------------------------------------------------------------------------------

* (별표, Asterisk)

  • Unpacking 기능 : 괄호 안에 있던 데이터들을 풀어 각각으로 출력
  • → list, tuple에서 사용 가능하고, dictionary에서 사용 시 ‘키’ 값을 출력한다
data = [1,2,3,4,5]
print(*data)
# 1 2 3 4 5

data = (1,2,3,4,5)
print(*data)
# 1 2 3 4 5

data = {1:'일', 2:'이', 3:'삼',4:'사',5:'오'}
print(*data)
# 1 2 3 4 5
  • 변수에 Unpacking 해서 할당
data = [1,2,3,4,5]

a,*b,c = data
print(a,b,c)
# 1 [2, 3, 4] 5

*d,_,_ = data
print(d)
# [1, 2, 3]

*e, = data
print(e)
# [1, 2, 3, 4, 5]

----------------------------------------------------------------------------------------------------------------

 

2577번: 숫자의 개수 (acmicpc.net)

# 내 코드

a = int(input())
b = int(input())
c = int(input())

mul = str(a*b*c)
num = [0] * 10
for i in range(len(mul)) :
    num[int(mul[i])] += 1
for i in range(len(num)) :
    print(num[i])
    
# Best 코드

a = int(input())
b = int(input())
c = int(input())

num = [0] * 10
mult = str(a*b*c)

for i in range(len(mult )):
    num[int(mult[i])] += 1
    
print(*num, sep='\\n')

----------------------------------------------------------------------------------------------------------------

print(*num, sep='\n')

  • * 으로 출력 시, a b c 와 같이 출력 된다
  • 한줄씩 쓰고 싶으면 sep = ‘\n’ 를 print에 같이 써주면 된다

----------------------------------------------------------------------------------------------------------------

 

1475번: 방 번호 (acmicpc.net)

# 내 코드

num = input()
number_set = [0] * 9

for i in range(len(num)) :
    if num[i] == '9':
        number_set[6] += 1
    else :
        number_set[int(num[i])] += 1
        
if number_set[6] % 2 == 1 :
    number_set[6] = number_set[6] // 2 + 1
else :
    number_set[6] = number_set[6] // 2
print(sorted(number_set)[-1])

# Best 코드

room_num = int(input())
num_cnt = [0] * 10

for i in str(room_num) :
  num_cnt[int(i)] += 1

# float이면 반올림
a = (num_cnt[6] + num_cnt[9] + 1) // 2  
num_cnt[6], num_cnt[9] = a, a  
print(max(num_cnt))

----------------------------------------------------------------------------------------------------------------

 

3273번: 두 수의 합 (acmicpc.net)

# 내 코드
# 시간 초과
n = int(input())
lst = input().split(" ")
num = int(input())
result = 0

for i in range(n) :
    for j in range(i+1,n):
        if int(lst[i]) + int(lst[j]) == num :
            result += 1
print(result)

# Best 코드
n = int(input())
lst = sorted(list(map(int, input().split())))
num = int(input())

start, end = 0, n - 1
result = 0

while start < end :
    temp = lst[start] + lst[end]
    if temp > num :
        end -= 1
    elif temp < num :
        start += 1
    elif temp == num :
        result += 1
        start += 1 # 이게 중요함 ! 
print(result)

----------------------------------------------------------------------------------------------------------------

투 포인터 알고리즘

  • 두 가지 포인터를 사용하여, array 에서 원하는 값 찾는 반복문 구현
  • 시간 복잡도 : O(n) (내가 쓰던 방식 O(nC2)
  • 알고리즘 과정
    • array 를 오름차순 정렬
    • 두 가지 포인터를 맨 앞과 맨 뒤에 배치
    • 두 가지 포인터의 합이 내가 원하는 값이 아닐 시 알맞게 위치 조정
    • 내가 원하는 값이 나왔을 시에도 위치 이동을 해야 함, 아니면 while 로 인해, 값이 반복문에 빠지게 된다.