<로직 고민>
- 일단 선분끼리 비교를 해야 하는데 일단 선분의 시작점을 기준으로 정렬을 해야 할 것 같다
- start가 작은 수가 맨 앞으로 오게 정렬을 하고 그 상태에서 각 선분끼리 비교를 한다
- 끝점과 시작점을 비교해서 시작점이 끝점보다 작으면 겹치게 된다
- 그 경우 끝점에서 시작점을 뺀 수를 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개니까 그냥 이렇게 하면 된다) 뭔가 변수명을 자동으로 지정하고 싶었다
- 찾아보니까 globals() 함수를 쓰면 된다고 한다
- 그래서 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]]))
- 이번엔 틀린 답이 나온 1번째 예시를 가지고 돌려보기로 했다
- 첫 번째 for문이 잘 돌아가는지 보고 싶어서 그 아래에 print문을 찍어보았다
0 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
7 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
9 [0, 1, 2, 3, 4, 5, 6, 7, 8, 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]]))
- 다음은 두 번째 for문을 찍어보았다
0 0 [0, 1, 2]
0 1 [0, 1, 2]
0 2 [0, 1, 2]
1 0 [0, 1, 2]
1 1 [0, 1, 2]
1 2 [0, 1, 2]
2 0 [0, 1, 2]
2 1 [0, 1, 2]
2 2 [0, 1, 2]
3 0 [0, 1, 2]
3 1 [0, 1, 2]
3 2 [0, 1, 2]
4 0 [0, 1, 2]
4 1 [0, 1, 2]
4 2 [0, 1, 2]
5 0 [0, 1, 2]
5 1 [0, 1, 2]
5 2 [0, 1, 2]
6 0 [0, 1, 2]
6 1 [0, 1, 2]
6 2 [0, 1, 2]
7 0 [0, 1, 2]
7 1 [0, 1, 2]
7 2 [0, 1, 2]
8 0 [0, 1, 2]
8 1 [0, 1, 2]
8 2 [0, 1, 2]
9 0 [0, 1, 2]
9 1 [0, 1, 2]
9 2 [0, 1, 2]
- 이렇게 확인할 줄 알았으면 위에 첫 번째 for문은 찍어볼 필요가 없었네
- 여튼 제대로 나온다
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를 추가했다
i는 0
j는 0
cnt는 1
i는 2
j는 1
cnt는 2
i는 3
j는 1
cnt는 1
i는 3
j는 2
cnt는 2
i는 4
j는 1
cnt는 1
i는 4
j는 2
cnt는 2
i는 5
j는 2
cnt는 1
i는 6
j는 2
cnt는 2
i는 7
j는 2
cnt는 1
i는 8
j는 2
cnt는 2
- if문을 충족하지 않는 건 그냥 빠져나갔다는 건 알겠는데 이렇게 봐서는 영 모르겠다...
- else문도 추가해보자..
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])
- 이번 문제는 set과 교집합, 합집합을 얼마나 잘 활용하는지가 관건이었던 걸까...
- 이 코드의 점수는 몇 점일지가 궁금하다
- 이렇게만 봐서는 무슨 말인지 잘 모르겠어서 print(sets)을 또 찍어봤다
[{0}, {2, 3, 4}, {3, 4, 5, 6, 7, 8}]
2
[{0, -1}, {1, 2}, {3, 4, 5, 6, 7, 8}]
0
[{0, 1, 2, 3, 4}, {3, 4, 5, 6, 7, 8}, {1, 2, 3, 4, 5, 6, 7, 8, 9}]
8
- 쩐다 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))
- 같은 방식으로 푼 건데 나같은 바보가 알아보기 편한 방식으로 풀이되었다 ㅋㅋ