Hello

: )

2018년 4월 21일 토요일

Japan Alumni Group Spring Contest 문제 정리

Japan Alumni Group Spring Contest 문제는 Test case (Test data)가 공개되어 있습니다.

BOJ 는 https://www.acmicpc.net/category/304 에서

http://acm-icpc.aitea.net/ 로 가보면 연도별로 정리가 잘 되어 있어서 (구글 번역 이용) 찾는데 어려움은 없습니다. 다만, BOJ 에 있는 문제 연도와 안 맞는 경우가 있어서 이 부분은 전-후 연도를 찾아보시면 됩니다.



BOJ 에는 2014 로 되어 있지만, 실제 주소는 2013 년 봄 대회이기 때문에 뭔가 착오가 있었던게 아닌가 싶다...





  • Japan Alumni Group Spring Contest 2015 (link)
  • Japan Alumni Group Spring Contest 2014 (link)
  • Japan Alumni Group Spring Contest 2013 
  • Japan Alumni Group Spring Contest 2012


2018년 4월 20일 금요일

Calgary Collegiate Programming Contest 문제 정리

Calgary Collegiate Programming Contest 문제는 Test Case (Test Files) 와 Java 와 C++ 로 만들어진 정답 코드가 제공이 됩니다.

BOJ 는 https://www.acmicpc.net/category/330 에서..



CCPC 2015 의 경우 아래 링크 중간 즈음에 Problem Set and Test Files 를 선택하여 zip 파일을 받으면 됩니다.

http://psc.cpsc.ucalgary.ca/ccpc/2015/



http://psc.cpsc.ucalgary.ca/ccpc/2014/




2018년 4월 12일 목요일

BITMASKS 정리

BITMASKS 를 정리해 봅니다...


등등 정리


Bitmasks provide an efficient way to manipulate a small set of Boolean. 

엄밀하게 자료구조는 아니지만, 많이 쓰인다
정수의 이진수 표현을 자료 구조로 쓰는 기법
boolean 배열의 true / false 를 더 작은 메모리와 더 빠른 속도로 처리


비트 연산자
a & b: 비트별로 AND 연산
a | b: 비트별로 OR 연산
a ^ b: 비트별로 XOR 연산
~a: 비트별 NOT 연산 결과
a << b: 왼쪽으로 b 비트 시프트


  => a << 1 의 의미는 a 를 * 2 한 번
  => a << 2 의 의미는 a 를 * 2 두 번
  => ...
a >> b: 오른쪽으로 b 비트 시프트
 => a >> 1 의 의미는 a 를 / 2 * 한 번
 => a >> 2 의 의미는 a 를 / 2 * 두 번
 => ...

    집합의 구현 - 가장 중요한 사용 사례(예, 20 개를 이용)

    공집합
    int a = 0;

      꽉 찬 집합
      int a = (1<<20) - 1;  // 1 을 20 bit 이동하고 1 을 뺀다

        원소 추가 p (0 <= p < 20)
        a |= (1 << p);

          원소의 포함 여부
          if (a & (1 << p)) ~~

            원소의 삭제
            a &= ~(1 <<p);

              원소의 토글
              a ^= (1 << p);

                두 집합의 연산 - 집합간의 연산을 빠르게 할 수 있다는 것이 큰 장점

                합집합
                added = (a | b);

                  교집합
                  intersection = (a & b);

                    차집합
                    removed = (a & ~b);

                      하나에만 포함된 원소들의 집합
                      toggled = (a ^ b);

                        집합의 크기

                        1 의 개수를 센다


                        내장명령어

                          최소 원소 찾기
                          int first = (a & -a);

                            최소 원소 지우기
                            a &= (a - 1);

                              모든 부분 집합 순회하기

                              for (int subset = a; subset; subset = ((subset-1) & a)) {}


                              큰 N 개를 처리

                              예를 들어, 50,000 개의 어떤 값들이 50,000 가지의 상태( true / false )를 가진다고 하면
                              50,000 * 50,000 = 2,500,000,000 (25억) 개의 변수가 필요하다

                              boolean 배열로 처리하면 25 억 바이트 (대략 2,381 MB) 정도 필요하지만,
                              각 byte 를 8 개의 bit 로 처리해주면, 298 MB 정도로 줄어들 수 있다.

                              문제 제약 조건이 256 MB 정도라면,

                              35,000 * 50,000  개 정도 (대략 208 MB)가 처리가 가능

                              128 MB 정도라면

                              20,000 * 50,000  개 정도 (대략 119 MB) 가 처리가 가능


                              정수를 오른쪽으로 3 비트 시프트 => 8 로 나누는 것
                              7 (0111) 과 AND 연산 => 8 (1000) 로 나눈 나머지를 구하는 것


                              2018년 4월 4일 수요일

                              Algorithmic Engagements 문제 정리

                              * Updated: 2022.07.14 현재 Test data 를 받을 수 있는 곳은 없습니다.
                                             Web archive 에서도 받을 수가 없습니다.

                              Algorithmic Engagements 문제는 TC (Test data) 가 제공이 되네요..

                              BOJ 에서는 여기에서..
                              https://www.acmicpc.net/category/247

                              문제가 많이 삭제된 상태라.. 일부 연도만 풀어볼 수 있습니다..

                              PA 에서 각 연도 선택 후에 Useful Resources 에 보면 있습니다.
                              BOJ 문제 화면에서 영문 제목을 보시면 됩니다.



                              2018년 3월 18일 일요일

                              C++ 입출력 처리에 대해서

                              C++ 입출력 처리방법 문제(standard C stream 을 쓸지 standard C++ stream 을 쓸지에 관한..)는 C 방식을 쓰자고 정했었는데, 최근에 백준 님 블로그 보니 scanf/printf 를 쓰나 cin/cout 을 쓰나(알고보니 성능이 더 좋음...) 고민할 필요가 없네요.

                              예전 글: https://gooddaytocode.blogspot.kr/2016/07/cin-scanf.html

                              상황에 따라서 C++ 을 기본으로 쓰다가, 입출력 처리가 귀찮은 경우에는 C 를 쓰는 방식으로 정했습니다. 일단은..

                              다만, Standard C++ stream 을 쓸 때에는 아래 코드가 입출력 발생전에 있어야 하고, 이 후에는 Standard C stream 과 혼용하면 안 됩니다.




                              * 입출력 성능에 관한 백준 님의 블로그

                              입력 속도 비교
                              https://www.acmicpc.net/blog/view/56


                              출력 속도 비교
                              https://www.acmicpc.net/blog/view/57


                              * 입출력 속도 확인해 볼 수 있는 문제1

                              100만 번의 정수형 입력과 출력이 발생하는 문제

                              빠른 A+B
                              https://www.acmicpc.net/problem/15552

                              간단한 문제이니 풀고 나서 "맞은 사람" 선택해서 어떠한 입출력 방식으로 풀었는지 공개된 코드를 보면 됩니다....

                              정수형으로 이루어진 문제이기 때문에
                              저수준 API 를 이용( fread() 등 )해서 입력을 모두 읽어서 정수 데이터를 만드는 처리 방식(일명, fast IO)으로 빠른 수행시간을 이뤄내는 코드를 볼 수가 있습니다.


                              * 입출력 속도 확인해 볼 수 있는 문제2

                              1000만 번의 정수형 입력을 처리해야 하는 문제

                              중복된 숫자
                              https://www.acmicpc.net/problem/15719

                              C++11 설정으로
                              scanf / printf 의 경우 : 시간초과
                              cin / cout 전에 sync_with_stdio() 만 해하는 경우 : 시간초과
                              cin / cout 전에 sync_with_stdio() + cout.tie() 해주는 경우 : 1960MS 로 통과네요.