-문제: https://www.acmicpc.net/problem/2437

 

-정답풀이:

(0부터 i-1인덱스까지의 합)+1 이 i번째 인덱스보다 같거나 큰 경우에 i번째 인덱스를 더하고, 아닌 경우에는 break를 한다

추로 만들지 못하는 무게이므로 result값에 1을 더해서 출력하면 정답이다. 

n=int(input())
lst=sorted(list(map(int,input().split())))

result=0
for i in range(n):
    if result+1 >= lst[i]:
        result+=lst[i]
    else:
        break
print(result+1)

-틀린풀이:

이전 인덱스와 차이가 가장 많이 나는 인덱스를 찾아 그 전까지의 합+1을 구하면된다고 생각해서 코딩했는데 틀렸다ㅠ

-문제: https://www.acmicpc.net/problem/1080

어떻게 접근해야할지 몰랐던 문제. 이 문제로 공부하자!

 

-정답풀이:

n,m=map(int,input().split())
cnt=0

change_maps=[list(map(int,input()))for _ in range(n)]
result_maps=[list(map(int,input()))for _ in range(n)]

def convert3x3(x,y,arr):
    for i in range(x,x+3):
        for j in range(y,y+3):
            change_maps[i][j]=1-change_maps[i][j]
            
for i in range(0,n-2):
    for j in range(m-2):
        if change_maps[i][j] != result_maps[i][j]:
            convert3x3(i,j,change_maps)
            cnt+=1
            
nonResult=False
for i in range(0,n):
    for j in range(0,m):
        if change_maps[i][j] != result_maps[i][j]:
            nonResult=True
if nonResult:
    print(-1)
else:
    print(cnt)

-정답 이해

 

 

처음에 3x3 행렬만 변환이 가능하다길래 어떻게 해야하나 몰랐는데 위 풀이처럼 하면 된다

행,열 값을 받고, 변환시킬 행렬을 받는다. 그리고 모든 값이 0,1이므로 0은 1-0=1이 되고, 1은 1-1=0이 되므로 

1-change_maps[i][j]로 하면 0,1을 모두 변환시킬 수 있다

 

 

 

반복문 인덱스가 왜 n-2인가 했는데 이게 실질적으로는  n-3 인덱스까지 진행하는데 15번에 convert3x3을 해야한다.

convert3x3이 x 부터 x+2 인덱스까지 진행하므로 그것을 고려해서 인덱스를 설정한 것 같다(인덱스가 n-3일 때, convert3x3은 n-3부터 n-1(끝 인덱스)까지 진행된다)

 

 

변환 전 행렬과 변환후 행렬의 값이 다른 경우에 True를 대입한다. 만약 두 행렬이 모두 같다면 nonResult의 값은 False가 될 것이다 

 

변환전 행렬과 변한후 행렬이 다르다면 nonResult의 값은 True일 것이고, 그 경우에 -1을 출력한다. 

nonResult의 값이 False라면 행렬 변환에 성공한 것이므로, 변환횟수를 출력한다 

23번 해석 -> if True: print(-1) 

-문제: https://www.acmicpc.net/problem/2864

 

2864번: 5와 6의 차이

첫째 줄에 두 정수 A와 B가 주어진다. (1 <= A,B <= 1,000,000)

www.acmicpc.net

쉬운 문제였는데 replace()를 몰라서 헤맸던 문제,,

이걸로 replace() 꼭 기억하자

replace(): 문자열에서 어떠한 값을 찾아 바꿔주는 역할을 하는 함수

 

-정답풀이: 

a,b=input().split()

min=int(a.replace('6','5'))+int(b.replace('6','5'))
max=int(a.replace('5','6'))+int(b.replace('5','6'))

print(min,max)

 

-7/4 풀이 

replace를 하려면 string이어야 한다. string인 상황에서 숫자를 바꿔준 다음 int적용해서 더해주면된다 

#'a b'를 [[a], [b]]로 만듦 
a=list(input().split())

x=int(a[0].replace('6','5'))+int(a[1].replace('6','5'))
y=int(a[0].replace('5','6'))+int(a[1].replace('5','6'))

print(x,y)

-문제: https://www.acmicpc.net/problem/1049

 

총 구매 가격이 최소가 되는 것이 목표이므로 굳기 같은 브랜드별로 구매하지 않아도 된다.

6개 패키지 값이 제일 싼 브랜드와 낱개 값이 가장 싼 브랜드만 생각하면 된다

그래서 주어진 행렬에서 0열과 1열 0행에 가장 작은 값만 오면 된다(sort 두번 하면 됨)

그리고 모든 경우 다 계산해서 리스트에 넣고 가장 작은 값을 구하면 되는 줄 알았는데 그게 아니라 

경우에 따라서 나오는 최솟값이 다르므로 경우 설정을 해야 정답을 구할 수 있다는 것을 알았다. 

 

 

-정답풀이 1: 

n,k=map(int,input().split())
s=[]
for _ in range(k):
    s.append(list(map(int,input().split())))
six_list=sorted(s,key=lambda a: a[0])
one_list=sorted(s,key=lambda a: a[1])
a=n//6
b=n%6
ans=0
if six_list[0][0] <= one_list[0][1]*6:
    ans=(a)*six_list[0][0]+b*one_list[0][1]
    if six_list[0][0] < one_list[0][1]*(b):
        ans= (a+1)*six_list[0][0]
else:
    ans=n*(one_list[0][1])
print(ans)

1패키지의 값이 낱개 6개의 값보다 같거나 작은경우에는 주어진 갯수에 맞게 구매하는 것이 최소이고

1패키지의 값이 낱개 6개의 값보다 작은 경우에는 원래 개수를 초과하게 패키지를 구매하면 된다.

패키지의 가격이 6개의 값보다 큰 경우에는 모두 낱개로 구매한다 .

 

-정답풀이 2: 

내가 푼 풀이

0열 기준으로 정렬한 리스트와 1열 기준으로 정렬하는 리스트 각각 다른 리스트에 저장한다 

n,k=map(int,input().split())
s=[]
ans=[]
for _ in range(k):
    s.append(list(map(int,input().split())))
six_list=sorted(s,key=lambda a: a[0])
one_list=sorted(s,key=lambda a: a[1])
a=n//6
b=n%6
for i in range(k):
    ans.append((a+1)*six_list[i][0])
    ans.append((a*six_list[i][0]+b*one_list[i][1]))
    ans.append(n*one_list[i][1])
print(min(ans))

-틀린풀이:

60%까지 진행되다가 틀렸다

경우를 나누지 않아서 틀린 줄 알았는데, 알고보니 0열 기준으로 정렬하는 거랑 1열 기준으로 정렬하는 거 모두 다른 행렬로 만들어야했다. 

정답풀이 2를 참고하면 된다

 

+ Recent posts