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

 

-정답풀이: 

시작지점과 그 시작지점에 테이프 길이를 더하면 그 사이의 위치에는 모두 막을 수 있다는 원리다 

 

n,l=map(int,input().split())
s=sorted(list(map(int,input().split())))
k=l
cnt=1
start=s[0]
end=s[0]+l
for i in range(n):
    if start <= s[i]<end:
        continue
    else:
        start=s[i]
        end=s[i]+l
        cnt+=1
print(cnt)

 

-틀린풀이:

i번째 위치랑 i+1번째 위치를 비교해서 테이프 길이보다 짧으면 테이프의 길이를 차이+0.5 만큼 줄이고, 아닌 경우는 갯수를 세는 식으로 생각했는데 11% 돌아가다가 틀렸다 

문제가 무엇인지 생각해봐야할 것 같다

 

-문제: 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)

+ Recent posts