sj4714   2년 전

안녕하세요, 해시 관련해서 공부하던 중 질문드립니다.

백준에서 한 건 아니고, 프로그래머스의 문제 중 하나를 해시를 이용해 접근하던 중, 제가 작성한 코드에 문제가 있는 것 같아 질문드립니다.

우선, 타 사이트의 문제 및 인터넷에서 참고한 코드를 죄송하지만 염치 불구하고 잠깐 올리겠습니다.

문제: https://programmers.co.kr/lear...

제가 작성한 코드 : ( for(int i=0;i<clothes.size();i++ ) ... )가 적힌 아래의 코드입니다.

제가 참고한 분의 코드 :  제가 for문으로 작성한 부분을 아래와 같이 작성하셨습니다.

for( auto a : clothes) m[a[1]] += 1;

for( auto i=m.begin(); i != m.end() ; i++ ) answer*= it->second +1;

제가 작성한 코드는 실패하는 테스트 케이스가 많던데, 혹시 두 코드가 어떤 점에서 다른지 알 수 있을까요? 

정확히는 제 코드는 왜 잘못된 건지 가르쳐 주시면..감사하겠습니다.

WeissBlume   2년 전

m.size() vs clothes.size()

sj4714   2년 전

제가 실력이 부족해서 잘 모르겠네요... for문 안에 넣는 걸 말씀하신 건가요?

위의 for문엔 안 될 것 같고(아직 map을 선언밖에 안 했기 때문) 뒤의 for문은 m.size()라고 생각하는 이유는

임의의 의상 정보(clothes[i])에서 의상 이름(clothes[i][0])은 필요 없고 의상 종류(clothes[i][1])에 따라 개수를 하나씩 증가시킵니다.

그리고 옷을 입는 방법은 최소 한가지는 입어야 하므로, ( 종류1에서 옷 개수 + 안 입는것(1) ) * ( 종류2에서 옷 개수 + 안 입는것(1) ) + ... + ( 종류n에서 옷 개수 + 안 입는것(1) )

- 1 (아무것도 안 입는 것) 이 답이 된다 생각합니다. 그래서 옷의 종류 수( m.size() )  를 아래의 for문에 넣고 돌렸습니다.

제 코드에서 m.size() -> clothes.size() 하면 똑같이 안 되는데, 혹시 조금 더 가르쳐 주실 수 있을까요..?

WeissBlume   2년 전

for (i = 0; i < clothes.size(); i++) {
   answer *= m[clothes[i][1]] + 1;
    m[clothes[i][1]] = 0;
}

sj4714   2년 전

아..이것도 잘 되네요 감사합니다.

제가 이해한 바가 맞다면,  "(특정 의상 종류의 수+1)을 곱하고 0으로 초기화 시켜주면 다음번에 같은 종류의 옷을 봐도 1만 곱해서 answer에는 변화가 없다" 인 것 같습니다.

컴퓨터는 거짓말을 안 하니...답변주신 분 코드와 다른 분들 코드가 잘 되고 제 것이 틀리다면...제 코드가 문제가 많다는 거 같습니다 ..

저는 종류별로 옷의 개수를 저장하고 각 종류를 돌면서 ( 제 코드의 하단 for문 ) 특정 종류의 옷 개수+1 을 곱했습니다.

첫번째 예로 { ~~,"상의" } { ~~,"하의" } { ~~,"모자" } { ~~,"신발" } {~~, "장갑" } 이 clothes에 있다고 한다면(이름은 필요 없는 것 같아 따로 안 적었습니다.)

m["상의"] = 1 , m["하의"] =1 , m["모자"] =1 , m["신발"] = 1 , m["장갑"] = 1 이고 m.size()는 5 , 임의의 옷 종류( clothes[i][1] )에 대해 map에 저장된 값은 모두 1이므로

답은 2*2*2*2*2-1 ... 31

두번째 예로 { ~~,"상의" } { ~~,"상의" } { ~~,"상의" } 이 clothes에 있다고 한다면

m.size()는 1이고 임의의 옷 종류(사실상 하나, clothes[i][1] )에 대해 map에 저장된 값이 m["상의"] = 3 이여서 answer *= (3+1) (옷 세개 중 하나 고르기 + 안 입기) 했습니다.

for문에서 옷의 종류를 기준으로, 특히 제 코드 형식으로 했을 때의 문제가 무엇인지...궁금합니다.

WeissBlume   2년 전

그럼 상의,상의,상의,하의가 있으면 어떻게 동작할까요?

sj4714   2년 전

헐 제가 생각한 거랑 완전 다르게 동작하네요.. 제가 map 관련해서 뭘 잘못 알고 있는 것 같습니다. 좀 더 알아보고 오겠습니다.

sj4714   2년 전

제가 너무 잘못 알고 있었네요 감사합니다...

m[clothes[i][1]] 에서 clothes[i][1]이 상의 하의 모자 차례대로 돌거라 생각했는데 그냥 clothes에서 첨부터 꺼내오는 거였네요(상의,상의,상의,하의)

그래서 답변주신 분이 주신 테스트 케이스에선 상의 종류만 두번 곱하는 거였군요..물론 다른 케이스도 다 그래서 틀렸고, 맞춘 경우들은 다 우연이였겠고요 허허..

답변 덕분에 왜 auto 쓴 거랑 다른지도 알 것 같습니다. auto는 map의 요소를 직접 가리키니까 second(특정 종류 의상 개수)이 종류별 의상 수를 가져오고

제 껀 그런 게 없었네요 ( 제 생각을 적었는데 글 실력이 안 좋고 아직 공부중이라 이상하게 정리한 거 같기도 하네요)

덕분에 오랫동안 막히던 거 풀었고, 이전부터 이런 비슷한 경우가 자주 생기던데 좀 더 신중하게 코드 작성하도록 하겠습니다.

질문 적을 때도 허접한 질문이겠다 싶었는데, 다시 보니 더 심한 거 같습니다.

그럼에도 늦은 시간부터 오랜 시간 정성껏 답변주셔서 정말 감사합니다. 덕분에 도움 많이 되었습니다.

댓글을 작성하려면 로그인해야 합니다.