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

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

 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr

문제

chalendar

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT

입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

제한 조건
  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

 

발상

윤년과 그 해의 요일이 모두 주어진 문제이다.

달력 문제는 윤년계산을 포함하여 수십, 수백년 후까지 계산하는 문제가 나오기도 하는데 경시대회가 아니면 수학적이고 다소 지엽적인 문제는 코딩테스트에서 출제되지 않을거라 생각하고 간단히 그 해의 월별 날짜와 요일 배열을 만들어 경과된 일수를 더해서 구하기로 하였다.

 

의사코드

1. 초기값 세팅(월별 날짜, 반환할 요일 배열)
2. 주어진 날짜를 바탕으로 2016/1/1부터 경과된 일수 계산
3. 7로 나누어 요일 비교
4. 요일값 반환

 

개선

다른사람들이 제출한 답을 보니 캘린더 함수를 사용하는 것도 있었는데, 국가별로 날짜가 다르기 때문에 국가코드도 설정하고 하는 부분이 다소 지엽적이라고 생각하였다.

 

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

[Programmers] 같은 숫자는 싫어  (0) 2022.07.04
[Programmers] 가운데 글자 가져오기  (0) 2022.07.04
[Programmers] 모의고사  (0) 2022.07.02
[Programmers] 키패드 누르기  (0) 2022.07.02
[LeetCode] 773. Sliding Puzzle  (0) 2022.06.25

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

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

문제

exam with pencil

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

발상

문제 카테고리가 완전탐색인만큼 모든 경우의 수를 다 검색하면서 조건을 따지는 문제였다.

3명의 수포자가 같은 문제를 가지고 각각의 방식으로 문제를 푼다는 점에서 디자인패턴 전략패턴을 사용하면 확장성이 높고 깔끔한 코드가 나올 것 같았지만, 타임아웃이 걸릴 것 같아서 우선 반복문으로 풀어보고 다음에 리팩토링 해보기로 하였다.

 

의사코드

1. 초기값 세팅(각 수포자의 전략 템플릿)

2. 정답 확인(){

    1. a 정답 확인

    2. b 정답 확인

    3. c 정답 확인
}

3. 최고점 확인(스트림)
4. 최고점을 맞은 수포자 리스트 추출
5. 배열로 변환

 

개선

의사코드를 작성하고, 구현하고 제출하였더니 런타임에러가 발생하였다.

수포자들의 전략템플릿을 구현할 때 따로 메서드를 추출하여서 각각의 전략템플릿의 길이를 넘어가면 초기화하는 식으로 하였는데, 그 부분을 따로 계산하지 않고 나머지값과 전략템플릿 배열인덱스를 매칭하는 방법으로 리팩토링 하니 통과하였다.

 

단순히 전략패턴 업데이트만 함수로 재사용했는데도 런타임에러가 발생한 것을 보면, 추가적으로 리팩토링해서 전략 디자인패턴을 구현하면 더 호출이 복잡해지니 테스트케이스는 통과하지 못할 것 같다.

 

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

[Programmers] 가운데 글자 가져오기  (0) 2022.07.04
[Programmers] 2016년  (0) 2022.07.03
[Programmers] 키패드 누르기  (0) 2022.07.02
[LeetCode] 773. Sliding Puzzle  (0) 2022.06.25
Day 22: Binary Search Trees  (0) 2018.06.25

+ Recent posts