코문풀(bj.1543번,8980번/ lc.125번)

💻코딩문제풀이

🔎백준문제

#1543.문서검색 <난이도: 3> 링크

문제:
'문서'와 검색하려는 '단어'가 주어졌을 때, 그 단어가 중복되지 않게 최대 몇 번 등장하는지 구하는 프로그램을 작성하시오.
ex.1)
Input:
ababababa
aba
Output:
2

문제 풀이(파이썬)

s = input()
find = input()
index = 0
result = 0

while len(s) - index >= len(find):
    if s[index:index+len(find)] == find:
        result +=1
        index += len(find)
    else:
        index += 1
print(result)

전체문자열에서 우리가 찾는 단어가 최대 몇번 등장하는지 반복해 판별한다.
전체문자열안에 우리가 찾는 문자가 중복되면 안되므로 문자열 슬라이싱을 활용해 중복을 방지한다.
우리가 찾는 단어를 전체문자열에서 찾으면 결과값을 1증가시키고, 단어의 마지막 인덱스 +1 한 인덱스 위치에서 부터 다시 같은 문자를 찾는다.
모든 경우를 탐색하여 총 몇개의 단어가 있는지 결과값에 저장해 출력한다.

#8980.택배 <난이도: 4>링크

문제:
각 마을은 배송할 물건들을 박스에 넣어 보내며, 본부에서는 박스를 보내는 마을번호, 박스를 받는 마을번호와 보낼 박스의 개수를 알고 있다. 박스들은 모두 크기가 같다. 트럭에 최대로 실을 수 있는 박스의 개수, 즉 트럭의 용량이 있다. 이 트럭 한대를 이용하여 다음의 조건을 모두 만족하면서 최대한 많은 박스들을 배송하려고 한다.
조건 1: 박스를 트럭에 실으면, 이 박스는 받는 마을에서만 내린다.
조건 2: 트럭은 지나온 마을로 되돌아가지 않는다.
조건 3: 박스들 중 일부만 배송할 수도 있다.
마을의 개수, 트럭의 용량, 박스 정보(보내는 마을 번호, 받는 마을번호, 박스 개수)가 주어질 때, 트럭 한 대로 배송할 수 있는 최대 박스 수를 구하는 프로그램을 작성하시오. 단, 받는 마을번호는 보내는 마을번호보다 항상 크다.

문제풀이(파이썬)

import sys

if __name__ == "__main__":
    n, c = map(int, sys.stdin.readline().split())
    m = int(sys.stdin.readline())
    box = [list(map(int, sys.stdin.readline().split())) for _ in range(m)]


    box.sort(key=lambda x:x[1])  

    answer = 0  
    remain = [c] * (n + 1)  

    for i in range(m):
        temp = c  
        for j in range(box[i][0], box[i][1]):
            temp = min(temp, remain[j])
        temp = min(temp, box[i][2])
        for j in range(box[i][0], box[i][1]):
            remain[j] -= temp
        answer += temp

    print(answer)

변수 box 저장된 박스들을 도착 시간이 빠른 순서로 정렬한다.
그리고 변수 remain에 각 위치에 남은 공간을 저장한다.
for문을 보내는 박스의 정보개수 만큼 m번 반복하며
마을의 개수, 트럭의 용량, 박스 정보(보내는 마을 번호, 받는 마을번호, 박스 개수)가 주어질 때, 트럭 한 대로 배송할 수 있는 최대 박스 수를 구한다.

🔎Leetcode

#125. Valid Palindrome <난이도:4> 링크

문제해설:
문자열을 앞으로 읽으나 뒤로 읽으나 같은 문자열인지 즉 회문인지 탐색하는 문제이다.
회문이면 true를 반환, 아니면 false를 반환한다.
ex.1)
Input: s = "A man, a plan, a canal: Panama"
Output: true
Explanation: "amanaplanacanalpanama" is a palindrome.
ex.2)
Input: s = "race a car"
Output: false
Explanation: "raceacar" is not a palindrome.

(회문인지 확인할 때 특수문자들과 띄어쓰기는 제외하고 알파벳만 고려한다.)

문제풀이(js)

var isPalindrome = function(s) {
    let arr = s.toLowerCase().split('').filter(a=>/[a-z0-9]/i.test(a));
    return arr.join('') === arr.reverse().join('');
};

arr라는 변수에 확인해야할 문자열 s를 모두 소문자로 변경하고, 띄어쓰기를 제거하고, ㅌ특수문자는 제거하여 순수 알파벳만 남도록 변경한다.
그후 arr와 reverse한 arr를 비교한다.

모든 특수 문자를 일일히 조건으로 구분해줘야하나 고민했으나 다른사람이 푼 대표 코드 확인해보니 방법이 있다는 사실을 알 수 있었다.그래서 쉽게 적용해 특수문자를 제거해줬다.
이 문제는 쉽게 이해 됐지만 이를 코딩으로 옮기기가 무척 어려웠다.

회고..
아직 나는 프로그래머보다 코더(coder)에 가까운듯 하다.
푼 문제를 다시 코드를 짜라고 하면 못 짜고 지금처럼 해맬 듯 싶다.
속으로는 푼 문제수의 제곱수로 실력이 일취월장하기를 바라지만 코딩을 하루 이틀해서 실력을 늘리겠다는 마음을 가지지 말고 꾸준히 공부하자

< ✅난이도 >

-난이도 1,2 : 구글링 안하고 직접 푼 문제
-난이도 3: 직접 풀었지만 메서드 구글링한 문제
-난이도 4,5: 직접 못 풀고 답을 참고하여 푼 문제 (꼭 다시 풀어봐야 할 문제)

다시 풀어볼 문제 링크

앞으로 풀어볼 백준 문제 링크

좋은 웹페이지 즐겨찾기