[ 이것이 코딩테스트다 ] 34일차

안영우·2021년 2월 11일
0
post-thumbnail

📍 백준 1316 - 그룹단어체커

백준 1316 - 그룹단어체커

⚡️ 나의 풀이 방법

각 문자가 연속해서 나타는 경우는 array[i] == array[i+1]으로 확인해봐야겠다는 생각을 했다. 그런데, 떨어져서 나타나는 문자열은 어떻게 표현할지 명확히 떠오르지 않았다. 주변 사람의 코드를 보고 어떻게 작성해야할지 찾아보았다. 중간에 j < len(array)-1 and를 선언한 이유는 현재 문자열과 다음 문자열을 비교하는 과정 중 마지막 과정은 범위가 초과하기때문에 선언했다.

나머지코드를 해석하면 만약, 현재 문자열과 다음문자열이 같으면 넘어가고(pass) 현재 문자열이 다음 문자열 안에 포함되어있으면 break시키고 그것이 아니면 count된다는 의미다.

또 다르게 작성한 코드를 봤는데, sorted함수를 사용했다.
key = array.find코드는 처음보는데 문자를 하나씩 끊어 정렬시킨 값과 원래의 리스트값이 같으면 count시키는 코드였다.
자주 사용해야겠다.

n = int(input())
count = 0

for i in range(n):
    array = input()
    for j in range(len(array)):
        if j < len(array)-1 and array[j] == array[j+1]:
            pass
        elif array[j] in array[j+1:]:
            break
    else:
        count += 1
print(count)
n = int(input())
cnt = 0
for i in range(n):
    array = input()
    if list(array) == sorted(array, key=array.find):
        cnt+=1

print(cnt)

📍 백준 2475 - 검증수

백준 2475 - 검증수

⚡️ 나의 풀이 방법

이 문제를 가져온 이유는 다른사람의 숏코딩(short_coding)을 보고 감탄했기 때문이다.
같은 결과가 나오는 코드인데 2줄밖에 사용하지 않았다니...
이왕이면 짧은 코드를 사용하는게 좋은 편이겠지?

# 내가 푼 코드
array = list(map(int, input().split()))
result = 0

for i in array:
    result = (result + (i*i)) % 10

print(result)
# Pythonic 코드
import sys
input = sys.stdin.readline

array = [i*i for i in map(int, input().split())]
print(sum(array) % 10)

📍 백준 5565 - 영수증

백준 5565 - 영수증

⚡️ 나의 풀이 방법

이 문제도 역시 숏코딩에 놀랐다.
지금 보니까 내가 너무 코드를 못 짰다고 느꼈다.
빙빙 둘러갈 생각하지말고 쉬운 방법을 생각해보자!

# 내가 작성한 코드
books = []
rest = 0

for i in range(10):
    book = int(input())
    books.append(book)

total = books[0]

for i in books[1:]:
    rest = rest + i

result = total - rest
print(result)
# 다른사람이 푼 코드
first = int(input())

for i in range(9):
    first = first - int(input())
print(first)

📍 백준 2675 - 문자열 반복

백준 2675 - 문자열 반복

⚡️ 나의 풀이 방법

이번에는 정답판정을 받았지만 시간복잡도가 차이나는 코드를 가져왔다.
1번 코드는 입력 for문을 제외하면 2번 쓰였기 때문에 시간복잡도가 O(N^2)이고 2번코드는 입력 for문을 제외하면 1번쓰였기 때문에 시간복잡도가 O(N)이 된다.
입력 수가 커지면 시간초과 판정이 날 수 있으니까 for문은 웬만하면 줄이는 쪽으로 작성하자!

# 1번
T = int(input())

for i in range(T):
    case = input().split()
    number = int(case[0])
    string = list(case[1])
    for j in range(len(string)):
        for k in range(number):
            print(string[j], end='')
    print()
# 2번
T = int(input())

for i in range(T):
    n, s = input().split()
    for j in range(len(s)):
        print(int(n) * s[j], end='')
    print()

📍 결론

이렇게 해서 구현문제를 풀어보았다.
아직 많이 남았다. 다음주까지는 쭉 구현문제를 풀 계획이다.
구현파트의 문제를 많이 풀수록 머리가 컴퓨터화(?) 되는것 같다.
쉽다고 생각하지말고 어떻게 코드를 효율적으로 짤 수 있을까를 고민하자.
이번 파트의 문제를 많이 푼다면 이를 응용한 문제가 많기때문에 지금보다 수월하지 않을까 생각한다.

profile
YW_Tech

0개의 댓글