Cooper's devlog

[TIL] 2021.01.05 본문

TIL

[TIL] 2021.01.05

cooper_dev 2021. 1. 5. 18:33

[알고리즘 문제 풀이]

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 오전에 프로그래머스에 있는 실패율 문제를 풀었다. HashMap을 이용해서 접근하려고 했지만 숙련도 미숙과 문제 내용을 제대로 숙지하지 못해 시간 소요가 많았다. 기존에 접근하려고 했던 방식은 아래와 같다.

 

  1. HashMap에 단계를 key값으로 설정하고 해당 도전 인원 수를 value로 갖는다.
  2. 그리고 HashMap을 순회하며 비교한다.
  3. 현재 단계를 도전에 실패한 유저를 구한다.
  4. 그리고 보다 낮은 단계를 도전하고 있는 사람들을 제외해서 스테이지에 도달한 유저를  구한다. 
  5. 2번 내용에서 가진 정보를 가지고 실패율을 구해 ArrayList<Stage>에 저장한다.
  6. 저장한 내용을 Comparator를 이용해 정렬하고 결과에 맞는 타입을 위해 stream을 이용해 int[]로 변형한다.

 

하지만 HashMap 사용법이 익숙하지 않았고 전체 순회 시, entrySet을 사용하는 법을 잘몰라서 블로그를 검색해서 로직을 처리했지만 원하는 결과를 확인할 수 없었다.😢 그래서 익숙하지 않는 HashMap을 사용하지 않는 방법을 사용했다.

 

  1. 각 단계(N)을 순회하면서 각각의 실패율을 구하기
  2. 현재 단계를 도전하고 있는 유저와 단계를 성공한 유저를 각각 선언한다.
  3. 만약 순회하는 단계와 현재 단계가 일치할 경우(index == now), 도전자에 추가한다.
  4. 만약 현재 단계보다 순회 단계가 더 높은 경우(index >= now), 스테이지에 도달한 유저에 포함한다.
  5. 2번 정보를 가진 정보를 토대로 실패율을 구하고 결과를 ArrayList<Stage>에 저장한다.
  6. 저장한 내용을 Comparator를 이용해 정렬하고 결과에 맞는 타입을 위해 stream을 이용해 int[]로 변형한다.

알고리즘은 꾸준히 하자... 기억이 안나

 

해당 로직을 가지고 문제 접근하니 다행히 문제를 해결할 수 있었다. 알고리즘 문제를 한동안 안풀었더니 코드 작성하는 속도도 느릴 뿐만 아니라 로직이 떠오르지 않았다. 확실히 알고리즘은 꾸준히 풀어야 하는 것 같다. 암튼 오늘 중으로 일과를 마무리하고 HashMap을 이용해서 문제를 해결할 수 있도록 한번 시도해봐야겠다.😃

 


[수업 내용 정리]

 릴레이 부품부터 시작해서 컴퓨터가 되기까지의 일련의 과정에 초점을 맞춰서 설명을 들었다. 논리게이트 부분은 이전에 몇번 구글링을 하면서 접해본 내용이라서 조금은 익숙했다. 하지만 CPU 작동에 관한 이야기와 ALU에 관한 내용은 처음 접해보는 내용이라서 생소했다. 처음에는 내가 이해를 못하는건가에 대한 의구심이 들었지만 다행히 1-2시간 만에 이해할 수 있는 내용이 아니라는 것을 알고 안도했다. 그렇지만 나중에는 꼭 공부해야 하는 부분 중에 하나기 때문에 상기시키고 있어야 겠다.

 

  1. [논리게이트]
    1. AND : 두 입력 값이 모두 true일 때, 출력 값이 true를 반환 → (A && B)
    2. OR : 두 입력 값 중 하나라도 true일 경우, 출력 값이 true를 반환 → (A || B)
    3. XOR : 두 입력 값이 서로 다를경우, 출력 값이 true를 반환 → (A != B)
  2. [확장게이트]
    1. NAND :  AND와 반대 연산자 → !(A&&B)
    2. NOR : OR와 반대 연산자 → !(A||B)
  3. [반가산기]
    1. A, B 두 개의 비트를 이진 덧셈기로 더하는 과정을 생각해보자.
      • sum : A와 B의 XOR연산자의 결과로 합
      • carry : A와 B의 AND연산자의 결과로 자리올림
  4. [전가산기]
    1. sum : r1의 sum과 이전 carry의 XOR 결과
    2. carry : r2의 carry(AND) 결과와 r1의 carry(AND)의 OR 결과
      • r1 : bitA - bitB의 반가산기의 결과
      • r2 : r1의 sum - carry(bitA-bitB) 의 결과

( + 그리고 roach가 알려주신 코드의 실행순서 공부하기)


[오늘 작업한 내용]

 오늘은 Day1 미션에 초점을 맞춰서 진행했다. 미션 제출 마지막 내용 로직을 구현했다. 기존의 연산은 8비트를 기반으로 해서 연산이 이루어지기 때문에 두 바이트의 길이가 다를 경우 배열의 길이가 8이 되도록 로직을 구현했다.

 그리고 테스트코드를 연습해보기 위해 아이작이 제공해주신 JUnit 사용방법을 참고해서 각 Adder와 Converter의 메서드들의 테스트코드를 작성하였다. 요즘 트렌드가 TDD를 많이 선호하고 그만큼 정확한 프로그래밍을 해줄 수 있는 역할을 하고 있는 것 같아 계속해서 테스트코드를 작성해 가면서 로직을 구현해봐야겠다.👍

(링크 : ildann.tistory.com/5)

[그룹피어세션]

 그룹피어세선의 경우, 어제 약속한 기존 4시에 진행했다. 정말 신기했던 건 같은 코드를 가지고 다르게 접근을 했던 것이다. 내가 피드백을 놓쳤던 부분은 제출링크의 마지막 문제였다. 기존의 제출 내용 중에 진법을 변환해도 가능한지에 대한 설문에 관한 것이었다. 기존의 코드에서는 ArrayList를 이용해서 동적으로 배열을 반환했지만 마지막 문제의 로직에서는 8비트에 국한된 코드를 작성했던 것이다. 이를 아이작이 피드백해주셨고 이 부분을 매개변수에 원하는 비트 수를 설정할 수있도록 코드를 수정했다.

 

 

(그룹페어 세션 도중에 꿀팁)

 

[JAVA]

  1. Arrays.copyOf(ByteB, 8); : 길이가 8인 배열로 변경된다.
  2. 2의 지수 반환 : log(decimal) / log(2);
  3. Integer.toBinaryString(int a) → a를 이진수로 변경하는 기능이 있다.
  4. StringBuildfer.reverse를 이용해서 역순으로 정렬을 변경할 수 있다..
  5. Integer.parseInt(answerStr, radix); → answerStr, radix(밑)형태로 인식해서 10진수로 변환

[JUnit]

  1. annotation
    • @beforeEach : 각각 메서드 실행하기 전에 setup한다.(JUnit5)
      • ex) db를 접근해서 CRUD하는 경우
    • @beforeAll : 전체 class파일 실행 이전에 한번만 setup(JUnit5)
      • ex) DB connection을 열어야 하는 경우 사용
  2. [Intellij]
    1. ctrl + alt + v : 변수 추출 (Extract -> Variable)
    2. ctrl + alt + m : 해당 로직을 함수 메서드로 자동으로 생성해주는 단축키
    •  

 


[오늘 하루 마치며]

간만에 오랜시간 동안 의자에 앉아있으니 아직 적응이 안된다. 코딩하는 도중에 틈틈이 스트레칭을 해야겠다. 그리고 아직 CS지식 많이 부족하다는 것을 다시 한번 실감했다. 좀 더 CS지식을 공부해서 다른 사람들의 부족한 부분을 나도 채워주고 싶다.

 


[TIL]

1. 로치의 가르침(코드의 실행순서) 복기하기.

2. 실패율 문제 HashMap으로 로직 변경해보기.

 

 


+추가

 오전에 풀었던 알고리즘 문제(실패율)을 HashMap형태로 변경했다. 기존의 로직을 그대로 유지하면서 HashMap형태로 변경했다. 두 방법 보두 이중 반복문을 거치지만 집계 연산을 진행한 상태로 반복문을 순회하기 때문에 시간면에서 효율적일 것이라고 생각한다.(비록 O(n^2)일지라도;ㅋㅋ)

 지금 문득 생각난건데 해당 연산을 조금 비싼 비용이 들지만 stream을 사용하는 방법도 시도해봐야겠다.😁

 

[실패율 소스코드]

 

pbg0205/algorithm_study

:triumph:알고리즘 문제 풀이 저장소:triumph:. Contribute to pbg0205/algorithm_study development by creating an account on GitHub.

github.com

'TIL' 카테고리의 다른 글

[TIL]2021.01.11  (0) 2021.01.12
[TIL] 2020.01.08  (0) 2021.01.09
[TIL] 2020.01.07  (0) 2021.01.08
[TIL] 2021.01.06  (0) 2021.01.06
[TIL] 2021.01.04  (0) 2021.01.04
Comments