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

 

17224번: APC는 왜 서브태스크 대회가 되었을까?

2019년 올해도 어김없이 아주대학교 프로그래밍 경시대회(Ajou Programming Contest, APC)가 열렸다! 올해 새롭게 APC의 총감독을 맡게 된 준표는 대회 출제 과정 중 큰 고민에 빠졌다. APC에 참가하는 참가

www.acmicpc.net

 

<해당 문제의 나의 풀이>

N, L, K = map(int, input().split())
subtask = []
score = 0
count = 0

for i in range(N):
    sub1, sub2 = map(int, input().split())
    subtask.append([sub1, sub2])
    
subtask.sort(key=lambda x:x[1])

for lst in subtask:
    if count >= K:
        break
    sub1, sub2 = lst[0], lst[1]
    if L >= sub1:
        score += 100
        count += 1
    if L >= sub2:
        score += 40
    
print(score)

 

<해설>

위 문제의 핵심은 2차원 배열을 정렬하여야 한다는 것입니다. 왜냐하면, 해당 문제의 최대 풀 수 있는 문제 수가 정해져 있습니다. 그런데, 역량이 부족하여 2번째 어려운 보너스 부분 점수를 못 받는 문제를 먼저 풀어버리면 문제 풀이 수가 증가하여 최대한 받을 수 있는 점수가 줄어들게 됩니다. 따라서 최대한 많은 점수를 얻기 위해서는 어려운 문제 기준으로 정렬을 수행하여야 합니다.

 

<람다식을 통해 2차원 배열의 2번째 요소로 정렬하는 방법>

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

 

'알고리즘' 카테고리의 다른 글

백준 국영수  (0) 2022.02.22
[백준] 2차원 배열의 합  (0) 2022.01.24
백준 1920번 수 찾기  (0) 2022.01.12
[프로그래머스] 문자열 압축  (0) 2022.01.04
[이코테] 문자열 재정렬  (0) 2022.01.04

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

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

 

백준 문제를 풀면서 위 문제를 풀 수 있는 흥미로운 방법을 찾아내어 기록합니다.

 

위 문제를 처음 봤을 때 저의 풀이입니다.

N = input()
A = list(map(int, input().split()))
M = input()
lstM = list(map(int, input().split()))

for ele in lstM:
    if ele in A: 
        print(1)
    else:
        print(0)

해당 문제를 해결하기 위해서 in 을 활용하였습니다.

위 방식은 심플하고 좋아보이지만 python3으로 해결하려고 하면 시간초과가 발생합니다. (하지만 pypy3은 괜찮아요)

 

이번에는 패스트캠퍼스 강의를 통해서 알게된 풀이 방식입니다.

 

N, A = int(input()), {i:1 for i in map(int, input().split())}
M, B = int(input()), list(map(int, input().split()))

for i in range(M):
	print(A.get(B[i],0))

위 문제의 핵심은 딕셔너리를 활용하는 것입니다. 입력 받을 때 {} 안에 for 문을 활용하여 입력값들을 딕셔너리로 받습니다. 그리고, get함수를 통해서 첫번째 인자 값이 존재하지 않는다면 2번째 인자 값을 반환하도록 합니다.

위와 같은 방식으로 딕셔너리를 활용하여 코딩할 수 있습니다.

쿼리문을 호출하면

datetime 변수에 "2022-01-10T09:27:45.9510205+09:00" 와 같은 내용으로 들어가서 발생한 오류였다.

StDate.EditValue = dateNow();

따라서, 아래와 같은 형식으로 변환하여서 쿼리문을 호출하니 잘 되는 것을 확인하였다.

StDate.EditValue = dateNow.ToString("yyyy-MM-dd");

 

<발생한 오류>

The bucket does not allow ACLs (Service: Amazon S3; Status Code: 400; Error Code: AccessControlListNotSupported

 

<원인>

버킷의 ACL(Access Control List) 이 비활성화되어 있었다. 

 

<해결책>

ACL 활성화됨을 선택한다.

https://jojoldu.tistory.com/300

 

SpringBoot & AWS S3 연동하기

안녕하세요? 이번 시간엔 SpringBoot & AWS S3 연동하기 예제를 진행해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와

jojoldu.tistory.com

 

오늘 게시판에 이미지를 첨부하기 위해서 위와같은 예제를 학습하고 있었다.

하지만 오늘도 어김없이 오류를 만났다.

 

<오류의 종류>

Cannot resolve reference to bean 'amazonS3' while setting constructor argument

<오류가 난 원인>

There is no EC2 meta data available, because the application is not running in the EC2 environment

EC2 메타 데이터가 존재하지 않아서이다. 

 

<오류 해결책>

main/resources 경로에 application.properties 파일을 생성한다.

cloud.aws.stack.auto=false
cloud.aws.region.static=ap-northeast-2

위 명령어를 입력한다.

 

<참조 자료>

https://stackoverflow.com/questions/49143763/initializing-aws-with-springboot

 

initializing AWS with Springboot

I am trying to initialize and build a Springboot Application that uses AWS dependencies on Net Beans, however, I am having a problem building the project. After resolving the errors after creating ...

stackoverflow.com

 

이번에 이것이 코딩 테스트에서 문자열 압축 문제를 풀었고 해당 문제는 프로그래머스의 문제였다.

https://programmers.co.kr/learn/courses/30/lessons/60057 

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

해당 문제를 거의다 풀어갈 때, 나머지를 어떻게 더할 것인가에 대한 고민이 생겼다.

고민을 하던중 알게된 것이 아래의 코드이다.

s = 'abcdefg'
print(s[4:100])

결과

efg

해당 결과를 보기전까진 [:] 에서 오른쪽 숫자는 문자열 길이를 초과해서는 안될 것이라는 생각이 있었는데 넘어가도 최대 값 이상 안넘어가며 오류또한 나타나지 않는 결과를 얻었다. 

 

다시말해, 값이 초과하여도 상관이 없기 때문에 for문을 끝까지 돌려도 된다는 것이다.

아래 코드는 이코테 답안이다.

 

def solution(s):
	answer = len(s)
    # 1개 단위(step)부터 압축 단위를 늘려가며 확인
    for step in range(1, len(s) // 2 + 1):
    	compressed = ""
        prev = s[0:step] # 앞에서부터 step만큼의 문자열 추출
        count = 1
        # 단위(step) 크기만큼 증가시키며 이전 문자열과 비교
        for j in range(step, len(s), step):
        	# 이전 상태와 동일하다면 압축 횟수(count) 증가
            if prev == s[j:j + step]:
            	count += 1
            # 다른 문자열이 나왔다면(더 이상 압축하지 못하는 경우라면)
            else:
            	compressed += str(count) + prev if count >= 2 else prev
                prev = s[j:j + step] # 다시 상태 초기화
                count = 1
         # 남아 있는 문자열에 대해서 처리
         compressed += str(count) + prev if count >= 2 else prev
         # 만들어지는 압축 문자열이 가장 짧은 것이 정답
         answer = min(answer, len(compressed))
	return answer

 

알파벳 대문자와 숫자(0 ~ 9)로만 구성된 문자열이 입력으로 주어집니다. 이때 모든 알파벳을 오름차순으로 정렬하여 이어서 출력한 뒤에, 그 뒤에 모든 숫자를 더한 값을 이어서 출력합니다. 

 

<나의 풀이>

s = input()

charList = []
numList = []

for i in range(len(s)):
    if ord(s[i]) >= 65:
        charList.append(s[i])
    else:
        numList.append(s[i])

charList.sort()
numList.sort()

for i in range(len(charList)):
    print(charList[i], end='')
for i in range(len(numList)):
    print(numList[i], end='')

 

해당 문제는 문자의 크기를 비교하고 해당 문자가 숫자인지 알파벳인지 구별해야한다.

- 문자의 크기를 비교하여 정렬하는 것은 sort()함수를 호출하면된다.

- 해당 문자가 숫자인지 알파벳 인지는 ord(s[i]) >= 65를 이용하여 구할수 있다.

65이상 값이 알파벳으로 분류되는 것은 A의 아스키 코드 값이 65이기 때문이다.

앞으로도 종종 알파벳인지 숫자인지 구별할 필요가 있을 것으로 생각되므로 ord(s[i]) >= 65 조건을 기억해두자

오늘 데이터베이스를 복원하는 중 아래와같은 오류를 만났다.

'데이터베이스가 사용 중이여서 배타적으로 엑세스할 수 없습니다.'

데이터베이스를 복원하기 전에는 다중 사용을 허용해서는 안된다.

 

<해결책>

 

해당 오류를 해결하기 위해선 다른 모든 연결을 닫아야 한다. 

그럼 DB 테이블 옆에 (제한된 사용자)표식과 함깨 복원할 수 있게 된다.

볼링공 고르기

 

A, B 두 사람이 볼링을 치고 있습니다. 두 사람은 서로 무게가 다른 볼링공을 고르려고 합니다. 볼링공은 총 N개가 있으며 각 볼링공마다 무게가 적혀 있고 공의 번호는 1번부터 순서대로 부여됩니다. 또한 같은 무게의 공이 여러 개 있을 수 있지만, 서로 다른 공으로 간주합니다. 볼링공의 무게는 1부터 M까지의 자연수 형태로 존재합니다.

 

입력조건 

  - 첫째 줄에 볼링공의 개수 N, 공의 최대 무게 M이 공백으로 구분되어 각각 자연수 형태로 주어집니다.

(1 <= N <= 1000, I <= M <= 10)

  - 둘째 줄에 각 볼링공의 무게 K가 공백으로 구분되어 순서대로 자연수 형태로 주어집니다.

 

<나의 답안>  

# 볼링공 고르기 p.315
from itertools import combinations

if __name__ == '__main__':
    n, m = map(int, input().split())
    arr = list(map(int,input().split()))
    numArr = [0]*n
    for i in range(n):
        numArr[i] = i+1

    comArr = list(combinations(arr,2))
    result = 0
    for i in comArr:
        if i[0] != i[1]:
            result +=1
    print(result)

 

<나의 답안 해설>

 

위의 문제는 2사람이 볼링공을 고르는 경우의 수를 출력하면된다. 하지만, 한 가지 조건이 있다. 

2명의 사람은 서로 무게가 다른 볼링공을 골라야 한다. 

따라서 2명(2개의 수의조합)을 토대로 combination으로 순서 변경없는 조합의 수를 찾아냈다. 

그다음에 2개의 값이 같으면 for문에서 값을 더하지 않는 식으로 해결하였다. 

 

<정답>

# 볼링공 고르기 p.315
if __name__ == '__main__':
    n, m = map(int, input().split())
    data = list(map(int, input().split()))
    
    # 1부터 10까지의 무게를 담을 수 있는 리스트
    array = [0] * 11
    
    for x in data:
        # 각 무게에 해당하는 볼링공의 개수 카운트
        array[x] += 1
        
    result = 0
    # 1부터 m까지의 각 무게에 대하여 처리
    for i in range(1, m+1):
        n -= array[i] # 무게가 i인 볼링공의 개수(A가 선택할 수 있는 개수) 제외
        result += array[i] * n # B가 선택하는 경우의 수와 곱하기
    
    print(result)

정답의 경우 정답을 보면 명쾌해 질 줄 알았는데 쉽지 않다고 느끼게 되는 것 같다. 

 

 

'알고리즘' 카테고리의 다른 글

[프로그래머스] 문자열 압축  (0) 2022.01.04
[이코테] 문자열 재정렬  (0) 2022.01.04
이것이 코딩 테스트이다 - 모험가 길드  (0) 2022.01.03
백준 피보나치의 수5  (0) 2021.12.29
백준 설탕 배달 dp  (0) 2021.12.26

파이썬 알고리즘을 풀다가 해당 오류을 만났다.

해당 오류의 원인은 int 정수형 변수를 배열처럼 접근할려다 생긴 오류였다. 

오류가 난 코드를 살펴보겠다.

    comArr = list(combinations(arr,2))
    result = 0
    for i in range(len(comArr)):
        if i[0] != i[1]:
            result +=1
    print(result)

오류가 난 부분은 if i[0] !+ i[1] 부분이다.

i가 리스트일 것을 기대했고, comArr의 원소는 (1, 2)같은 튜플 형식이여서 첨자로 접근이 가능하다.

하지만 for문의 range를 사용하여 단순히 for문의 i에는 정수형 숫자만 들어가기 때문에 첨자로 접근을 해선 안된다.

+ Recent posts