문제 출처 및 키워드 분석
백준 웹사이트 [문제]-> [단계별로 풀어보기]->[1차원 배열] 카테고리에 해당하는 3052번 문제를 파이썬 언어를 이용해 풀 때 어떤 키워드들이 있는지 분석하는 것이 중요하다. 이번 포스팅에선 아래의 키워드들을 바탕으로 for loop을 두 번 쓰는 방식과 set() 함수를 사용하는 방식 총 두 가지의 풀이 방식을 설명한다. 키워드는 아래와 같다.
- 첫째 줄부터 열 번째 줄까지 한 줄에 숫자 하나
- 42로 나누었을 때 나머지
- 서로 다른 나머지의 개수
Solution
Version 1
rList=[]
for _ in range(10): #0~9
x=int(input())
r=x%42
rList.append(r) #all the remains list
newList=[]
for s in rList:
if s not in newList:
newList.append(s)
print(len(newList))
Version 2
rList=[]
newList=[]
for _ in range(10): #0~9
x=int(input())
r=x%42
rList.append(r) #all the remains list
newList=set(rList)
print(len(newList))
Explanation
첫 번째 키워드처럼 한 줄에 하나의 숫자를 입력받고 이걸 10번까지 실행하는 경우는 일반적으로 for loop을 사용하는 것이 효율적이다. 그리고 그 반복문 안에 숫자를 하나씩 입력받을 수 있도록 int(input())를 사용한다. 이런 식으로 코드를 작성하는데
for _ in range(10): #0~9
x=int(input())
r=x%42
'_'을 사용한 이유는 어차피 이 for loop에서 iterator index 가 중요하지 않기 때문이다. 저런 식으로 underline을 사용하면 그 자리에 뭐가 오든 신경 쓰지 않겠다는 뜻이다. range(start, end, step) 함수에서 start , step의 경우 따로 명시하지 않을 경우 start=0, step=1로 자동 설정된다. 0부터 반복문을 시작하는 경우, 총 10번의 loop을 돌려야 하기 때문에 end=10으로 설정한다. 이런 식으로 하면 0번째~9번째 까지 총 10번 반복문을 돌린다.
두 번째 키워드에 맞게 42로 나눈 나머지를 얻어야 하므로 Modulus operator(%)를 사용하여 얻은 값을 'r'라는 새로운 변수에 할당하는 방식으로 진행한다. 이제 여기서 첫 번째 문제에 직면할 것이다. "이렇게 구한 나머지들을 어떻게 컨트롤 하지?" 여러 개의 숫자나 element들을 정리해서 조작하는 방법은 리스트 안에 넣어주는 것이 좋다. 이를 위해서 for loop을 실행하기 전에 비어있는 empty list를 하나 설정해줘야 한다. 그 후 그 빈 리스트 안에 원소 하나씩 추가해주는 append() method를 활용해 42로 나눈 나머지들이 모일 수 있는 리스트를 하나 생성한다.
rList=[]
for _ in range(10):
x=int(input())
r=x%42
rList.append(r)
이렇게 위에 설명처럼 작성하면 위와 같은 코드가 된다. 하지만 두 번째 문제에 직면할 것이다. 이렇게 모은 '나머지들의 모임'에서 세 번째 키워드처럼 어떻게 겹치지 않는 서로 다른 숫자들만 찾아낼 수 있을까? 이제 여기서부터 version1과 version 2의 풀이 방식에 차이가 있다.
Version 1에서 새로운 빈 리스트 newList=[]를 설정하고 for loop을 한 번 더 사용하였다. 이때 for loop 안에 위에서 얻은 나머지들의 모임인 'rList'에 있는 원소들을 검토해서 만약 비어있는 newList에 rLIst의 검토 중인 원소가 없다면 newList에 추가해주라는 조건을 건다.
newList=[]
for s in rList:
if s not in newList:
newList.append(s)
이렇게 하면 당연히 비어있는 리스트에 검토 중인 숫자가 없을 테니 newList에 추가될 것이고 rList에서 검토 중인 숫자들 중 newList에 먼저 추가된 숫자와 겹치는 숫자가 있다면 if 조건에 의해서 newList에 추가되지 않을 것이다. 자연스럽게 겹치는 숫자들은 배제시키게 된다. 이런 식으로 나머지들의 모임 rList 안에 모든 숫자들을 검토하게 되면 newList에는 겹치지 않는 나머지 숫자들의 모임이 형성된다.
Version 2에서는 for loop을 한 번 더 사용한 version1과 달리 set() 함수를 사용해 더 간결하게 코드가 작성된다. set() 함수는 겹치는 원소를 전부 제거하고 겹치지 않는 원소만 모아줄 수 있는 함수이다. 마찬가지로 newList=[]를 통해 비어있는 새로운 리스트를 만들고 set(rList)를 사용하여 겹치지 않는 나머지들의 모임을 newLIst에 할당한다.
newList=set(rList)
print(len(newList))
마지막으로 이렇게 생성된 newList의 원소의 개수를 파악하면 되므로 len() 함수를 사용해서 출려해주면 정답 코드가 된다.
Conclusion
백준 3052번 문제를 통해 기억해야 할 것들을 정리하면 아래와 같다.
- 한 줄에 하나의 숫자를 여러 번 입력받고자 한다면 for loop안에 int(input()) 를 사용한다.
- 리스트에 어떤 값들을 하나씩 추가하려고 할 때 먼저 비어있는 리스트를 사용하고 targetList.append(element)를 사용하여 해당 원소를 추가해 줄 수 있다.
- 어떤 원소가 특정 리스트 안에 없는지를 체크하기 위해 if element not in LIST:처럼 'not in'을 사용한다.
- 겹치는 원소 없는 모임을 만들 때는 set()을 사용하자.
'Daily 코딩-Python' 카테고리의 다른 글
[파이썬] 백준 1546번 (평균) (0) | 2022.10.03 |
---|---|
[파이썬] 백준 2562번(최댓값)-for loop, append(), index() 사용 (0) | 2022.09.29 |
[Python3] 백준 10871번 (X보다 작은 수)-list활용법과 for loop (0) | 2022.09.26 |
[Python3] LeetCode 1번 (Two Sum)-이중 for loop 사용 (0) | 2022.09.26 |
[파이썬] 백준 11021번(A+B-7)-print()활용법 (0) | 2022.09.24 |
댓글