그 경우 끝점에서 시작점을 뺀 수를 result에 넣고 다시 선분끼리 비교를 해서 또 그런 걸 찾는데..
일단 그림을 그려보니까 1번째 선분이랑 2번째 선분 비교해서 겹치는 값과 2번째 선분이랑 3번째 선분 비교해서 겹치는 값을 더하고 1번째 선분이랑 3번째 선분이 겹치는 값을 빼면 3번째 예시가 되긴 되거든...
일단 그렇게 해보자...
안 된다.......이게 아닌가보다............
...
자기 전에 다른 방법을 생각해봤다
각 선분을 시작점부터 끝점까지 모든 점을 요소로 가지는 리스트로 바꿔서 해보는 건 어떨까?
똑같이 시작점 기준으로 정렬한 다음 선분 1,2,3으로 리스트를 만든다
for문을 시작점 중 가장 빠른 숫자부터 끝점 중 가장 늦은 숫자까지를 돌리는거다
def solution(lines):
answer, cnt = 0, 0
lines.sort()
for i in range(len(lines)):
globals()["line{}".format(i)] = [j for j in range(lines[i][0], lines[i][1]+1)]
start = min(lines[0][0], lines[1][0], lines[2][0])
end = max(lines[0][1], lines[1][1], lines[2][1])
for i in range(start, end+1):
for j in range(len(lines)):
if (i in globals()["line"+str(j)]) and (i+1 in globals()["line"+str(j)]):
cnt += 1
if cnt > 1:
answer += 1
cnt = 0
return answer
print(solution([[0, 5], [3, 9], [1, 10]])) # 8
처음에는 3번째 예시만 가지고 풀었다
일단 말한대로 선분의 요소를 다 담는 변수 3개가 필요했다
line1 =
line2 =
line3 =
이렇게 각각 정해서 할 수도 있었지만(사실 선분이 최대 3개니까 그냥 이렇게 하면 된다) 뭔가 변수명을 자동으로 지정하고 싶었다
그래서 lines의 요소 개수만큼 for문을 돌려서 line 뒤에 자동으로 0,1,2가 붙게 했다
그냥 그 변수를 불러오려면 globals()["line0"] 이런 식으로 써도 되는데 나는 또 그냥 for문이 쓰고 싶었다...
난 왜 이렇게 for문없이 못 살까 ㅋㅋ
그래서 일단 세 선분의 최솟값과 최댓값을 구해서 for문을 돌렸다
그리고 그 안에 line0, line1, line2 가 돌도록 했다
line0에 i와 i+1 첫 번째 for문으로 생각하면 0과 1이 존재하는지 묻고 존재한다면 cnt를 1 올린다
세 선분을 다 돌았을 때 cnt가 2 이상이라는 것은 두 선분이 겹친다는 의미다
answer에 1을 올리고 cnt는 초기화한다 다시 for문이 돈다
위 코드에는 문제가 있다 3번째 예시로 하면 8이 잘 나오는데 1,2번째 예시를 돌리면 각각 5가 나온다
어디서 잘못된 건지 찾기 위해 print문을 찍어보는 여정을 떠났다....
def solution(lines):
...
for i in range(start, end+1):
print(i, list(range(start, end+1))) # 프린트문 요기!
for j in range(len(lines)):
...
print(solution([[0, 1], [2, 5], [3, 9]]))
def solution(lines):
...
for i in range(start, end+1):
for j in range(len(lines)):
print(i, j, list(range(len(lines)))) # 프린트문 요기!
if (i in globals()["line"+str(j)]) and (i+1 in globals()["line"+str(j)]):
...
print(solution([[0, 1], [2, 5], [3, 9]]))
def solution(lines):
...
for i in range(start, end+1):
for j in range(len(lines)):
if (i in globals()["line"+str(j)]) and (i+1 in globals()["line"+str(j)]):
cnt += 1
print("i는", i) # 프린트문
print("j는", j) # 이렇게 세 가지
print("cnt는", cnt) # 찍어봄
if cnt > 1:
answer += 1
cnt = 0
return answer
print(solution([[0, 1], [2, 5], [3, 9]]))
그 다음은 if문 아래를 찍어보았다 cnt만 찍어봤는데 뭐가 뭔지 알 수 없어서 i와 j를 추가했다
if i는 0
if j는 0
if cnt는 1
else i는 0
else j는 1
else cnt는 1
else i는 0
else j는 2
else cnt는 1
else i는 1
else j는 0
else cnt는 1
else i는 1
else j는 1
else cnt는 1
else i는 1
else j는 2
else cnt는 1
else i는 2
else j는 0
else cnt는 1
if i는 2
if j는 1
if cnt는 2
else i는 2
else j는 2
else cnt는 2
else i는 3
else j는 0
else cnt는 0
if i는 3
if j는 1
if cnt는 1
if i는 3
if j는 2
if cnt는 2
else i는 4
else j는 0
else cnt는 0
if i는 4
if j는 1
if cnt는 1
if i는 4
if j는 2
if cnt는 2
else i는 5
else j는 0
else cnt는 0
else i는 5
else j는 1
else cnt는 0
if i는 5
if j는 2
if cnt는 1
else i는 6
else j는 0
else cnt는 1
else i는 6
else j는 1
else cnt는 1
if i는 6
if j는 2
if cnt는 2
else i는 7
else j는 0
else cnt는 0
else i는 7
else j는 1
else cnt는 0
if i는 7
if j는 2
if cnt는 1
else i는 8
else j는 0
else cnt는 1
else i는 8
else j는 1
else cnt는 1
if i는 8
if j는 2
if cnt는 2
else i는 9
else j는 0
else cnt는 0
else i는 9
else j는 1
else cnt는 0
else i는 9
else j는 2
else cnt는 0
알았다....세 선분을 다 돌고난 후 cnt를 초기화 해줘야 하는데 지금 초기화가 cnt가 2일 때만 되고 있다ㅏ..
def solution(lines):
...
for i in range(start, end+1):
for j in range(len(lines)):
if (i in globals()["line"+str(j)]) and (i+1 in globals()["line"+str(j)]):
cnt += 1
if cnt > 1:
answer += 1
cnt = 0
return answer
지금 cnt > 1을 만족할 때만 cnt가 0으로 초기화되고 있었던 거다...!!!
첫 번째 for문을 돌기 전에 cnt가 몇이든 0으로 초기화 되어야 하거늘....
cnt = 0 을 shift + tab을 눌러 앞으로 땡겼다
그랬더니 성공...!!!
드디어!!!!
아 그리고 어차피 시작점과 끝점을 min(), max() 함수로 찾기 때문에 정렬은 할 필요가 없었다
lines.sort()는 삭제했다
최고점을 갱신했다!!!!
근데 lines.sort() 빼도 정상 작동한다는 것을 채점하고 알았는데 그걸 뺐으면 점수가 더 높았을까........?
그나저나 for문이 4개 들어간 건 뭔가 안습이다....어차피 선분 개수가 3개로 정해져 있어서 for문 3개는 3번밖에 안 돌아가긴 하지만ㅋㅋㅋ
근데 선분이 늘어났을 때 코드가 얼마나 잘 동작하는지가 약간 높은 점수의 기준인 것 같은데 start, end 구할 때도 for문 돌렸으면 점수 더 높았을라나..ㅎ?ㅋㅋㅋㅋㅋㅋㅋㅋ
<완성된 코드>
def solution(lines):
answer, cnt = 0, 0
for i in range(len(lines)):
globals()["line{}".format(i)] = [j for j in range(lines[i][0], lines[i][1]+1)]
start = min(lines[0][0], lines[1][0], lines[2][0])
end = max(lines[0][1], lines[1][1], lines[2][1])
for i in range(start, end+1):
for j in range(len(lines)):
if (i in globals()["line"+str(j)]) and (i+1 in globals()["line"+str(j)]):
cnt += 1
if cnt > 1:
answer += 1
cnt = 0
return answer
print(solution([[0, 1], [2, 5], [3, 9]])) # 2
print(solution([[-1, 1], [1, 3], [3, 9]])) # 0
print(solution([[0, 5], [3, 9], [1, 10]])) # 8
<다른 사람 풀이>
- 천재풀이1
def solution(lines):
sets = [set(range(min(l), max(l))) for l in lines]
return len(sets[0] & sets[1] | sets[0] & sets[2] | sets[1] & sets[2])
쩐다 3번째 거 예시로 보면 선분1과 선분2의 교집합 3,4 / 선분2와 선분3의 교집합 3,4,5,6,7,8 / 선분1과 선분3의 교집합 1,2
합치면 1,2,3,4,5,6,7,8 총 8개니까 길이도 8 끝..와우..~
- 천재풀이2
def solution(lines):
s1 = set(i for i in range(lines[0][0], lines[0][1]))
s2 = set(i for i in range(lines[1][0], lines[1][1]))
s3 = set(i for i in range(lines[2][0], lines[2][1]))
return len((s1 & s2) | (s2 & s3) | (s1 & s3))