https://school.programmers.co.kr/learn/courses/30/lessons/87389

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.


제한사항

  • 3 ≤ n ≤ 1,000,000

발상

나머지가 1이 되게하는 수를 구하는 문제이다.

나눈다는 로직에 소인수분해가 떠올라서 주어진 문제와 맞지 않는 방향으로 알고리즘을 짰다가 테스트케이스가 실패하는 부분이 나와서 디버깅에 시간이 걸렸다.

의사코드

실패케이스
1. 초기값 세팅, 목표값 선언 (주어진 값 -1)
2. 반복(목표값 >= 기준값^2)
{
	1. 나누어 떨어지면 기준값을 임시반환값으로
    	2. 목표값을 소인수분해하여 값을 줄임
    3. 나누어 떨어지지 않으면 기준값 ++
}

성공케이스
1. 2부터 시작하여 나머지가 1인 값이 나올 때가지 전체반복

 

개선

초기 케이스의 문제는 소인수분해와 관계없는 문제였는데 주어진 값을 소인수분해하면서 계속 값을 변형시켰더니 발생한 문제처럼 보인다.

정확히 실패한 케이스의 값을 확인할 수 없지만 최대한 단순한 방법으로 먼저 풀고 그 뒤 개선하는 절차를 익혀야 겠다.

https://school.programmers.co.kr/learn/courses/30/lessons/12944

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

제한사항

  • arr은 길이 1 이상, 100 이하인 배열입니다.
  • arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.

발상

주어진 배열로 평균을 구하는 문제이다.

기본적인 문법 숙달 테스트 문제인 것 같다.

의사코드

1. 주어진 테스트케이스로 스트림생성후 평균 만들고 반환

 

개선

복잡하지 않은 로직이다 보니 스트림을 사용하는 것이 반복문으로 최적화 알고리즘 짜는 것보다 느린 것 같다.

간단한 것들은 최적화가 필요할 시 직접 구현하도록 하자.

 

https://school.programmers.co.kr/learn/courses/30/lessons/12947

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한 조건

  • x는 1 이상, 10000 이하인 정수입니다.

발상

int로 주어진 수를 각 자리수로 새로운 숫자를 만들고 나누어 떨어지는지 확인하는 문제이다.

각 자리수로 새로운 숫자를 만든다는 점에서 문자변환을 하고 추출할까 생각했다가, 제한조건이 복잡하지 않고 숫자를 문자로 변환하고 다시 숫자로 변환하는 로직이 비효율적일 것 같아서 10으로 나누면서 자리수를 버려서 추출하였다.

의사코드

1. 10으로 나누고 나머지를 구하며 각 자리수를 추출
2. 모두 더한 뒤 결과값 검증

 

개선

다른 사람들의 풀이를 보니 초기 아이디어 처럼 문자로 변환하고 추출하는 로직들이 많았다.

스트림을 사용한 예도 있고, 문자열로 변환 후 split으로 잘라내서 다시 parseInt 한 케이스도 있었는데

그냥 간단하게 나머지를 활용한 풀이가 제일 빠른 것 같다.

 
 

https://school.programmers.co.kr/learn/courses/30/lessons/12948

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건

  • phone_number는 길이 4 이상, 20이하인 문자열입니다.

발상

주어진 휴대폰 번호를 마스킹하는 문제이다.

기본문법 숙달 확인 문제이다.

의사코드

1. 스트링버퍼 선언
2. 문자열 길이 확인
3. 문자열 길이-4만큼 버퍼에 * 추가
4. 버퍼 + 테스트케이스에서 마지막 4자리 추출후 더하여 리턴

 

개선

스트링버퍼를 이용하여 새로 문자열을 만들었지만, 다른 사람은 주어진 문자열을 바로 *로 덮어씌워서 문제를 풀었다.

또 정규식을 사용하여 문자열을 치환한 풀이법도 있었다.

새로 변수를 선언하지 말고 주어진 자료를 활용하도록 하자.

'IT > Algorithm' 카테고리의 다른 글

[programmers] 평균 구하기  (0) 2022.07.05
[programmers] 하샤드 수  (0) 2022.07.05
[programmers] 행렬의 덧셈  (0) 2022.07.05
[programmers] x만큼 간격이 있는 n개의 숫자  (0) 2022.07.05
[programmers] 직사각형 별찍기  (0) 2022.07.05

https://school.programmers.co.kr/learn/courses/30/lessons/12950

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

matrix

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건

  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

발상

두 행렬의 합을 구하는 문제이다.

조금 고민해보았는데, 그냥 정해진 숫자만큼 2중 반복문 돌려서 구하는 것이 가장 간단해보였다.

의사코드

1. 반환행렬 선언
2. 2중 반복문으로 행렬1, 행렬2 더하기
3. 만들어진 합행렬 반환

 

개선

다른 사람들의 풀이를 보니, 답을 따로 만들지 않고 주어진 행렬 하나를 기준으로 하여 다른 하나를 더하여 반환하였다.

그만큼 메모리도 적게 사용하고, 파라미터도 2개에서 1개로 줄어드니 개선이 될 것 같다.

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/12954

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

제한 조건

  • x는 -10000000 이상, 10000000 이하인 정수입니다.
  • n은 1000 이하인 자연수입니다.

발상

간단한 수열을 구현하는 문제이다.

배열을 처음에 초기화시키고 하나씩 담을 지, 리스트로 구하고 나중에 스트림으로 변환 할지 문법 숙달에 중점을 둔 문제였다.

의사코드

1. 리스트 선언
2. 조건에 맞게 리스트에 수열 추가
3. 배열로 변환
4. 반환

 

개선

기초를 튼튼히 하자

 

https://school.programmers.co.kr/learn/courses/30/lessons/12969

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

star

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.


제한 조건
  • n과 m은 각각 1000 이하인 자연수입니다.

발상

알고리즘 기초 문제 중 하나인 별찍기 문제이다.

오랫만에 다시보니 반가웠다.

주어진 조건에 맞게 반복문을 돌려서 출력하면 된다.

 

의사코드

1. 스트링빌더 생성
2. 열 만큼 append
3. 행 만큼 출력

 

개선

스트림을 사용해서 foreach로 돌려도 가능하다.

 

https://programmers.co.kr/learn/courses/30/lessons/12910

 

코딩테스트 연습 - 나누어 떨어지는 숫자 배열

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하

programmers.co.kr

문제

divide

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

제한사항

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.

발상

주어진 자료를 필터링 한 뒤에 정렬하고 반환하는 문제이다.

스트림을 사용하면 간단하게 풀 수 있다.

 

의사코드

1. 스트림 변환
2. filter 적용(나누어 떨어지는 값)
3. 배열 변환
4. 제약조건 확인(없을 경우 -1)

 

개선

스트림을 활용할 때 필터에 함수를 작성하는 것이 익숙하지 않아서 따로 반복문 처리를 한 뒤에 배열을 만드는 것을 스트림을 활용하였다.

다른 사람들의 코드를 보고 filter를 적용하는 것을 확인한 뒤에 리팩토링하여 코드를 개선하였다.

 

https://programmers.co.kr/learn/courses/30/lessons/12906

 

코딩테스트 연습 - 같은 숫자는 싫어

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은

programmers.co.kr

문제

NO character with man

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

제한사항
  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

발상

배열에서 중복을 걸러내는 문제이다.

처음엔 간단하게 생각하여 스트림으로 변환 후 distinct로 걸러냈는데, 결과값을 확인해보니 연속으로 중복된 숫자만 걸러내고, 연속되지 않은 같은 숫자는 출력해야 하는 경우였다.

그래서 일반적인 반복문을 돌리면서 연속된 숫자들을 앞뒤로 비교하는 로직이 필요하였다.

의사코드

1. 초기값 세팅(임시 리스트 생성)
2. 반복문(주어진 자료의 길이만큼){
	1.첫번째일 경우 임시리스트 넣고 리턴
    2. 그외엔 자료의 이전값과 현재값 비교 후 다를 경우 추가
}
3. 임시 리스트를 스트림을 사용하여 int배열로 변환
4. 반환

 

개선

코드 작성의 편의성을 위하여 컬렉션 타입을 사용하여 리스트에 해당되는 값들을 add한 뒤에

최종적으로 만들어진 리스트를 스트림을 사용하여 int 배열로 변환하였는데, 다른 사람들의 코드는 반복문을 돌리면서 하나하나 매핑하는 방식을 사용한 경우가 있었다.

시간적으로는 조금 더 빠를 수 있는데, 가독성과 실무활용을 생각하면 조금 느려도 스트림을 사용하는 것이 더 나을 것 같다.

'IT > Algorithm' 카테고리의 다른 글

[programmers] 직사각형 별찍기  (0) 2022.07.05
[programmers] 나누어 떨어지는 숫자 배열  (0) 2022.07.04
[Programmers] 가운데 글자 가져오기  (0) 2022.07.04
[Programmers] 2016년  (0) 2022.07.03
[Programmers] 모의고사  (0) 2022.07.02

https://programmers.co.kr/learn/courses/30/lessons/12903

 

코딩테스트 연습 - 가운데 글자 가져오기

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다. 재한사항 s는 길이가 1 이상, 100이하인 스트링입니다. 입출력 예 s ret

programmers.co.kr

문제

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

재한사항

  • s는 길이가 1 이상, 100이하인 스트링입니다.

 

발상

문자열의 길이를 구하고 가운데 문자를 추출하면 되는 문제이다.

2로 나누었을때 int에 할당하면 소수점은 버림된다는 점을 이용하여 코드를 별다른 조건문을 쓰지 않고 간단하게 작성할 수 있다.

의사코드

1. 주어진 문자열의 길이 측정
2. 문자열 추출((n-1)/2, n/2+1)

 

개선

초기 코드는 짝수와 홀수를 나누어

//짝수
n/2 -1 , n/2 +1
//홀수
n/2 , n/2 +1

로 구하였지만, (n-1)을 이용하여 더 코드를 줄일 수 있었다.

'IT > Algorithm' 카테고리의 다른 글

[programmers] 나누어 떨어지는 숫자 배열  (0) 2022.07.04
[Programmers] 같은 숫자는 싫어  (0) 2022.07.04
[Programmers] 2016년  (0) 2022.07.03
[Programmers] 모의고사  (0) 2022.07.02
[Programmers] 키패드 누르기  (0) 2022.07.02

+ Recent posts