본문 바로가기
Learning-log/Algorithm 문풀

백준(파이썬) - 4673번, 1065번 (2022.10.22~.23)

by why제곱 2022. 10. 23.

1. 4673번

1) 문제

 

2) 풀이

 

3) 문법 및 풀이과정

이 문제를 풀기 위해 생각해 본 것은 하나의 수가 주어졌을 때 그 수가 self number인지 판별한 방법이 있는가? 였다. 

실제로 방법이 있을 수도 있으나 내가 고민해 본 방법 내에서는 없었고,  그래서 두번째로 생각해낸 방법은 d(n)을 통해 만들어진 수를 1부터 10000 사이에서 제거를 하고 남은 수를 출력하는 것이었다.

이를 위해 먼저 실행할 수가 들어있는 allnumbers 집합과 (따로 집합을 만들어둔 이유는 이후에 여기서 self number가 아닌 수를 제거하여 self number만 남기기 위함이다.) self number가 아닌 수를 넣을 remove_number 집합을 만들었다.

allnumbers에는 1부터 10000의 정수가 들어있도록 range를 이용했으며 remove_number는 빈 집합으로 만들어 두었다. 

그런 후 함수 d(n)을 정의한다. 이 때 123이라는 숫자가 있을 때, 123 + 1 + 2 + 3 을 하기 위해서는 여기서 1이 100의 의미가 아닌 수 숫자 그 자체로의 1이어야 했다. 따라서 입력값에 str함수를 씌워 문자열로 바꾼 후 for문을 활용했다.

 

그런 후 num 변수에 각 자리 숫자를 더한 합인 self 와 n을 더하였고 이 num이 d(n)의 출력값이다. 

 

d(n)을 정의하고 나서 for문을 통해 allnumbers의 모든 원소에 d함수를 사용하고 그 출력 값을 remove_number에 원소로 add한다.

 

처음에 계획한대로, allnumbers - remove_number(차집합)를 self_numbers라 했고 이를 정렬한 후 출력하였다.

 

 

2. 1065번

 

1) 문제

 

2) 풀이

3) 문법 및 풀이과정

지금까지 풀어본 문제 중에 가장 오래 고민하고 여러 오류를 겪어본 문제였다. 

정수에 str을 붙이는 과정 때문인지 자꾸 오류가 발생해서 여러가지 시도를 해봤었다. 

 

check_seq에 어떤 수가 입력되면 1부터 그 수까지 for문을 반복한다. 

이 때 두자리 수까지는 어떤 수든지 등차수열이 되므로(2개의 숫자뿐이므로 그 두 수의 차가 곧 공차가 된다.) if 문을 활용해 1부터 99까지는 무조건 hansu_count에 1씩 더하도록 한다. 

hansu_count는 1부터 입력된 수까지 하나하나 자리숫자의 나열이 등차수열이 되는 경우 1씩 더해져, 최종적으로 한수의 개수 값이 되도록 하기 위한 변수이다. 

100부터는 공차가 같은지 확인해 같다면 hansu_count에 1이 더해지도록 해야했다. 따라서 각 숫자를 list에 넣고 index를 활용하였다. (이 과정에서 처음에는 바로 숫자를 문자열로 바꾼 후, 그 문자열의 index를 활용하고자 했지만 typeError가 자꾸 발생하여 list를 활용하였다.) 

그 후 각 숫자가 등차수열을 이루는 지 확인하는 과정에서 다른 블로그들을 찾아보니 대부분이 if문을 활용해 list[0]-list[1] = list[1]-list[2]을 만족하면 1이 count되도록 코딩한 것을 많이 봤다.

하지만 이렇게 하면 문제의 조건엔 만족할지라도, 자릿수가 늘어날 경우에는 코드를 다시 짜야하는 상황이 발생할 것이고, 나는 문제를 떠나서 조금 더 수를 확장해도 문제가 없을 코드를 짜고 싶은 욕심이 생겼다.

그래서 다시 한 번 for문을 활용했고, 자리수가 달라질 때를 대비하여 range를 (len(str(i))-1)로 하였으며 각 자리 숫자의 차를 집합에 집어 넣고 집합의 원소의 개수가 1인 걸 통해 등차수열임을 확인했다. 

(여기서는 집합의 원소가 중복되지 않는 다는 사실을 활용)